一起谈.NET技术,ASP.NET调用.sql文件(二)

简介:   笔者前一阵子发表了一篇《ASP.NET调用.sql文件》文章,主要是是解决数据库配置,减去传统手工附加数据库和自己改写web.config文件等等这些复杂的过程,而是配置的向导。其中给出关键的技术知识点,就是通过sql数据库生成数据库脚本即.sql文件,然后通过调用osql.exe来执行.sql文件。

  笔者前一阵子发表了一篇《ASP.NET调用.sql文件》文章,主要是是解决数据库配置,减去传统手工附加数据库和自己改写web.config文件等等这些复杂的过程,而是配置的向导。其中给出关键的技术知识点,就是通过sql数据库生成数据库脚本即.sql文件,然后通过调用osql.exe来执行.sql文件。

  这里,园友首先质疑了其安全性,认为程序存在被他人利用的危险。笔者对这方面没有太多经验,希望来位高人讲讲这方面的知识或者演示被利用的过程。所以这块还是一个未知的领域,笔者也不敢保证绝对安全,但是至少目前来没有提出具体的实例来说有危险。

  其次园友提出了本机器上没有数据库的可能性,即程序在一台服务器,数据库在另外一台数据库服务器上,确实如果没有数据库那么上篇文章提到方法就落空了。但是笔者认为这种可能性比较小,因为这种可能性只有说明程序非常大,而且应该是定制软件团队亲自派人过去配置。

  然后笔者在后来调试程序发现,按上篇文章配置数据库发现缺失部分存储过程。笔者的数据库里内容大致分为(数据表,函数,视图,存储过程,数据)这5个部分,由于存储过程很多所以开始没有发现。细致找下原因发现存储过程中部分程序代码里包含中文字符,而调用osql.exe其实就是在cmd控制台里执行,cmd不支持中文,所以造成部分存储过程丢失。期间当然上网查找解决方法,首先想到的是通过来转换编码方式,经过调试发现不能解决。

  所以最后解决方法只有两种:第一将中文字符转换为英文字符,这点不可能。第一中文字符比较多,这里数据与程序对应,这里修改意味着程序里也要对应的修改,工作量比较大。那么第二种就是通过程序来向sql里建立(函数,视图,存储过程)。例如:存储过程是数据库里倒出来的。具体格式为

 
 
USE [ magazinedb ]
GO
/* ***** Object: StoredProcedure [dbo].[Update_MagazineInformation_HZJ] Script Date: 11/25/2010 10:25:34 ***** */
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- 更新杂志信息
create procedure [ dbo ] . [ Update_MagazineInformation_HZJ ]
(
@TabName varchar ( 20 ),
@TypeID decimal ,
@TypeName varchar ( 20 ),
@TypeRemark varchar ( 100 ),
@TypeDate datetime
)
as
begin
exec ( '
update
' + @TabName + ' set [name]= ''' + @TypeName + ''' ,Remark= ''' + @TypeRemark + ''' ,Date= ''' + @TypeDate + '''
where ID=
''' + @TypeID + '''
' )
end
GO
/* ***** Object: StoredProcedure [dbo].[UP_UserLogin_userPwd_LX] Script Date: 11/25/2010 10:25:34 ***** */
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [ dbo ] . [ UP_UserLogin_userPwd_LX ]
@loginId DECIMAL ,
@oldUserPwd VARCHAR ( 60 ),
@newUserPwd VARCHAR ( 60 ),
@result INT OUTPUT
AS
BEGIN
DECLARE @pwd VARCHAR ( 60 )
SELECT @pwd = userPwd FROM magazineDB..UserLogin WHERE loginId = @loginId
IF @pwd <> @oldUserPwd
SET @result = 0
ELSE
BEGIN
UPDATE magazineDB..UserLogin SET userPwd = @newUserPwd WHERE loginId = @loginId
SET @result = 1
END
END
GO
/* ***** Object: StoredProcedure [dbo].[UP_UserLogin_SeekPwd_GW] Script Date: 11/25/2010 10:25:34 ***** */
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
create PROCEDURE [ dbo ] . [ UP_UserLogin_SeekPwd_GW ]
@loginId DECIMAL ,
@newUserPwd VARCHAR ( 60 )
AS
BEGIN
UPDATE magazineDB..UserLogin SET userPwd = @newUserPwd WHERE loginId = @loginId
END
GO
/* ***** Object: StoredProcedure [dbo].[UP_user_readState_LX] Script Date: 11/25/2010 10:25:34 ***** */
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [ dbo ] . [ UP_user_readState_LX ]
@userID DECIMAL ,
@readState VARCHAR ( 20 )
AS
BEGIN
UPDATE magazineDB.. [ user ] SET readState = @readState WHERE userID = @userID
END
GO
。。。
。。。

  首先Go是在程序里运行会报错误的,首先需要替换掉,然后运行会报出 Create需要放首行,好多变量未定义的等错误,如果单独执行一个下面的存储过程是没有问题的,但是里面内容有两个就会报错,所以这里想出用编程的方式来一个个读取其中一个存储过程来执行,然后执行下一条

 
 
create procedure [ dbo ] . [ Update_MagazineInformation_HZJ ]
(
@TabName varchar ( 20 ),
@TypeID decimal ,
@TypeName varchar ( 20 ),
@TypeRemark varchar ( 100 ),
@TypeDate datetime
)
as
begin
exec ( '
update
' + @TabName + ' set [name]= ''' + @TypeName + ''' ,Remark= ''' + @TypeRemark + ''' ,Date= ''' + @TypeDate + '''
where ID=
''' + @TypeID + '''
' )
end

  可以看上面的给出的存储过程实例,观察到 以"Create Proc"的开头和以"/****Object:“结尾中包含一个完整的存储过程。本来笔者开始是以"Create"和"Object"

  但是发现如果存储过程命名包含了以上字符,那么程序就达不到理想的结果了。当然这里要注意注释里不要包含"Create Proc"和"Object:"那么就不会导致提取失败。

 
 
string sr = File .OpenText("存过过程位置");
StringBuilder ss_sqlcontent
= new StringBuilder();
strline
= string.Empty;
flag
= false;

// 这里笔者规定存储过程最后以GO代表结束
while ((strline = sr.ReadLine()) != " GO ")
{
if (strline.ToLower(). Contains (" create proc "))
{
flag
= true;
ss_sqlcontent.Append(strline);
ss_sqlcontent.Append(Environment.NewLine);
// s_sqlcontent.Append(" ");
}
else if (flag)
{
if (strline.ToLower(). Contains ("object:"))
{
flag
= false;
// 执行代码
ExecuteSql(connStr, dbname, ss_sqlcontent.ToString());
ss_sqlcontent.Clear();
}
else
{
ss_sqlcontent.Append(strline);
ss_sqlcontent.Append(Environment.NewLine);
// s_sqlcontent.Append(" ");
}
}
}
sr.
Close ();

  上面一段代码就是可以成功将导出的.sql文件成功写入数据库存储过程,那么对应的视图,函数等等都可以观察结构,然后编写对应的结构,由于笔者的函数和视图比较少,所以只用提取"cretae"和"object”之间或者"create"和"Exec"即可。

   那么笔者这个在asp.net中提取.sql文件中内容执行,将内容写入到sql数据库中应该解决上面的所有问题了吧。

   如果疑问欢迎继续探讨

目录
相关文章
|
10月前
|
监控 Cloud Native 测试技术
.NET技术深度解析:现代企业级开发指南
每日激励:“不要一直责怪过去的自己,他曾经站在雾里也很迷茫”。我是蒋星熠Jaxonic,一名在代码宇宙中探索的极客旅人。从.NET Framework到.NET 8,我深耕跨平台、高性能、云原生开发,践行领域驱动设计与微服务架构,用代码书写技术诗篇。分享架构演进、性能优化与AI融合前沿,助力开发者在二进制星河中逐光前行。关注我,共探技术无限可能!
.NET技术深度解析:现代企业级开发指南
|
SQL 小程序 API
如何运用C#.NET技术快速开发一套掌上医院系统?
本方案基于C#.NET技术快速构建掌上医院系统,结合模块化开发理念与医院信息化需求。核心功能涵盖用户端的预约挂号、在线问诊、报告查询等,以及管理端的排班管理和数据统计。采用.NET Core Web API与uni-app实现前后端分离,支持跨平台小程序开发。数据库选用SQL Server 2012,并通过读写分离与索引优化提升性能。部署方案包括Windows Server与负载均衡设计,确保高可用性。同时针对API差异、数据库老化及高并发等问题制定应对措施,保障系统稳定运行。推荐使用Postman、Redgate等工具辅助开发,提升效率与质量。
672 0
|
开发框架 算法 .NET
C#/.NET/.NET Core技术前沿周刊 | 第 15 期(2024年11.25-11.30)
C#/.NET/.NET Core技术前沿周刊 | 第 15 期(2024年11.25-11.30)
337 6
|
开发框架 Cloud Native .NET
C#/.NET/.NET Core技术前沿周刊 | 第 16 期(2024年12.01-12.08)
C#/.NET/.NET Core技术前沿周刊 | 第 16 期(2024年12.01-12.08)
377 6
|
机器学习/深度学习 人工智能 Cloud Native
在数字化时代,.NET 技术凭借其跨平台兼容性、丰富的类库和工具集以及卓越的性能与效率,成为软件开发的重要平台
在数字化时代,.NET 技术凭借其跨平台兼容性、丰富的类库和工具集以及卓越的性能与效率,成为软件开发的重要平台。本文深入解析 .NET 的核心优势,探讨其在企业级应用、Web 开发及移动应用等领域的应用案例,并展望未来在人工智能、云原生等方面的发展趋势。
523 3
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
966 0
|
存储 开发框架 前端开发
[回馈]ASP.NET Core MVC开发实战之商城系统(五)
经过一段时间的准备,新的一期【ASP.NET Core MVC开发实战之商城系统】已经开始,在之前的文章中,讲解了商城系统的整体功能设计,页面布局设计,环境搭建,系统配置,及首页【商品类型,banner条,友情链接,降价促销,新品爆款】,商品列表页面,商品详情等功能的开发,今天继续讲解购物车功能开发,仅供学习分享使用,如有不足之处,还请指正。
578 0
|
开发框架 前端开发 .NET
[回馈]ASP.NET Core MVC开发实战之商城系统(三)
[回馈]ASP.NET Core MVC开发实战之商城系统(三)
408 0
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
497 7
|
存储 开发框架 前端开发
ASP.NET MVC 迅速集成 SignalR
ASP.NET MVC 迅速集成 SignalR
408 0