ASP.NET调用.sql文件(二“.NET研究”)

简介:   笔者前一阵子发表了一篇《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上海闵行企业网站设计与制作an>(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 上海企业网站制作"color: #0000ff;">ON
GO
CREATE PROCEDURE [dbo].[UP_UserLogin_userPwd_LX]
@loginId DECIMAL,
@oldUserPwd VARCHAR(60),
@newUserPwd VARCHAR(60),
@result INT上海徐汇企业网站制作pan> 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 =上海企业网站设计与制作"color: #000000;"> @loginId
END
GO
/****** Object: StoredProcedure [dbo].[UP_user_readState_LX] Script Date: 11/25/2010 10:25:34 ******/
SET ANSI_NULLS ON上海徐汇企业网站设计与制作style="color: #000000;">
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数据库中应该解决上面的所有问题了吧。

   如果疑问欢迎继续探讨

目录
相关文章
|
1月前
|
C# Windows
.NET开源免费的Windows快速文件搜索和应用程序启动器
今天大姚给大家分享一款.NET开源(MIT License)、免费、功能强大的Windows快速文件搜索和应用程序启动器:Flow Launcher。
|
2月前
|
SQL Oracle Java
sql文件批处理程序-java桌面应用
sql文件批处理程序-java桌面应用
27 0
|
2月前
|
SQL 数据库 C#
C# .NET面试系列十一:数据库SQL查询(附建表语句)
#### 第1题 用一条 SQL 语句 查询出每门课都大于80 分的学生姓名 建表语句: ```sql create table tableA ( name varchar(10), kecheng varchar(10), fenshu int(11) ) DEFAULT CHARSET = 'utf8'; ``` 插入数据 ```sql insert into tableA values ('张三', '语文', 81); insert into tableA values ('张三', '数学', 75); insert into tableA values ('李四',
75 2
C# .NET面试系列十一:数据库SQL查询(附建表语句)
|
4月前
|
开发框架 前端开发 JavaScript
盘点72个ASP.NET Core源码Net爱好者不容错过
盘点72个ASP.NET Core源码Net爱好者不容错过
76 0
|
4月前
|
开发框架 .NET
ASP.NET Core NET7 增加session的方法
ASP.NET Core NET7 增加session的方法
39 0
|
2月前
|
SQL 数据可视化 数据处理
使用SQL和Python处理Excel文件数据
使用SQL和Python处理Excel文件数据
57 0
|
6天前
|
SQL 存储 小程序
数据库数据恢复—Sql Server数据库文件丢失的数据恢复案例
数据库数据恢复环境: 5块硬盘组建一组RAID5阵列,划分LUN供windows系统服务器使用。windows系统服务器内运行了Sql Server数据库,存储空间在操作系统层面划分了三个逻辑分区。 数据库故障: 数据库文件丢失,主要涉及3个数据库,数千张表。数据库文件丢失原因未知,不能确定丢失的数据库文件的存放位置。数据库文件丢失后,服务器仍处于开机状态,所幸未写入大量数据。
数据库数据恢复—Sql Server数据库文件丢失的数据恢复案例
|
14天前
|
SQL 分布式计算 DataWorks
DataWorks操作报错合集之在DataWorks中使用ODPS SQL时遇到"该文件对应引擎实例已失效,请重新选择可用的引擎实例"的错误提示”,是什么导致的
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
34 0
|
4月前
|
SQL Java 流计算
Flink SQL UDF(用户自定义函数)需要打包成JAR文件并上传到Flink集群中
【1月更文挑战第1天】【1月更文挑战第2篇】Flink SQL UDF(用户自定义函数)需要打包成JAR文件并上传到Flink集群中
98 0
|
1月前
|
SQL 数据库
导入 sql 文件,如果发生 ERROR 1046 (3D000) no database selected 错误
导入 sql 文件,如果发生 ERROR 1046 (3D000) no database selected 错误
10 0