一起谈.NET技术,ASP.NET调用.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数据库中应该解决上面的所有问题了吧。

   如果疑问欢迎继续探讨

时间: 2024-07-28 18:41:31

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

ASP.NET调用.sql文件(二)

笔者前一阵子发表了一篇<ASP.NET调用.sql文件>文章,主要是是解决数据库配置,减去传统手工附加数据库和自己改写web.config文件等等这些复杂的过程,而是配置的向导.其中给出关键的技术知识点,就是通过sql数据库生成数据库脚本即.sql文件,然后通过调用osql.exe来执行.sql文件. 这里,园友首先质疑了其安全性,认为程序存在被他人利用的危险.笔者对这方面没有太多经验,希望来位高人讲讲这方面的知识或者演示被利用的过程.所以这块还是一个未知的领域,笔者也不敢保证绝对安全,但是至

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

笔者前一阵子发表了一篇<ASP.NET调用.sql文件>文章,主要是是解决数据库配置,减去传统手工附加数据库和自己改写web.config文件等等这些复杂的过程,而是配置的向导.其中给出关键的技术知识点,就是通过sql数据库生成数据库脚本即.sql文件,然后通过调用osql.exe来执行.sql文件. 这里,园友首先质疑了其安全性,认为程序存在被他人利用的危险.笔者对这方面没有太多经验,希望来位高人讲讲这方面的知识或者演示被利用的过程.所以这块还是一个未知的领域,笔者也不敢保证绝对安全,但是至

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

笔者好久没有写随笔了,这次是遇到提出这样的问题"不用附加数据库,什么修改web.config什么的那么麻烦,而是直接运行一个页面,然后根据向导一步一步引导用户安装生成数据库"那么这样做就需要一个创建数据库的语句和创建这些数据库表的语句,还有这些创建数据库视图以及函数的语句.创建数据库语句好办. "IF Not EXISTS (select name from master.dbo.sysdatabases where name = N'" + DataBaseNam

一起谈.NET技术,不附加数据库 ASP.NET调用.sql文件

笔者好久没有写随笔了,这次是遇到提出这样的问题"不用附加数据库,什么修改web.config什么的那么麻烦,而是直接运行一个页面,然后根据向导一步一步引导用户安装生成数据库"那么这样做就需要一个创建数据库的语句和创建这些数据库表的语句,还有这些创建数据库视图以及函数的语句.创建数据库语句好办, "IF Not EXISTS (select name from master.dbo.sysdatabases where name = N'" + DataBaseNam

ASP.NET调用.sql文件

笔者好久没有写随笔了,这次是遇到提出这样的问题"不用附加数据库,什么修改web.config什么的那么麻烦,而是直接运行一个页面,然后根据向导一步一步引导用户安装生成数据库"那么这样做就需要一个创建数据库的语句和创建这些数据库表的语句,还有这些创建数据库视图以及函数的语句.创建数据库语句好办. "IF Not EXISTS (select name from master.dbo.sysdatabases where name = N'" + DataBaseNam

在asp中调用sql server的存储过程

在asp中调用sql server的存储过程可以加快程序运行速度,所以这些天在研究asp中利用sql server的存储过程,现总结如下,其中很多思想也是直接从chinaasp论坛中得出来,希望能给大家一些帮助.1.调用存储过程的一般方法先假设在sql server中有一存储过程dt_users:CREATE PROCEDURE [dbo].[dt_users] ASselect * from usersreturnGO第一种方法是不利用command对象,直接用recordset对象set r

一起谈.NET技术,JavaScript 调用 ASP.NET WebService 的简单方法

客户端 JavaScript 调用 ASP.NET WebService 的方法除了采用 WebServer.htc 和构造 SOAPAction 的方法外,下面介绍一个采用 Ajax调用的简单方法,并且可以传递参数.其实,ASP.NET WebService 就是一个网站,所以,Request 对象是可用的,这样,传递参数就很容易了.下面是一个WebService1.asmx的代码: ASMX 代码: <%@ WebService Language="C#" CodeBehin

一起谈.NET技术,LINQ to SQL快速上手 step by step

前言       最近接连遇到几个朋友问我同一个问题,就是关于.NET平台上ORM框架的选择.我想在这个讲求效率的时代,谁也不想手写SQL或存储过程去访问数据库了.大家都知道,在Java平台上,ORM这一块基本是Hibernate的天下.当然,相对轻量级的iBatis也有不错的表现.      不过谈到.NET平台,ORM框架似乎相对混乱了点.很多朋友问我的时候,往往会这样问:NHibernate.NBear和Castle该选择哪个?而当我反问:为什么不适用微软自带的Linq to Sql呢?对

一起谈.NET技术,异步调用与多线程的区别

随着拥有多个硬线程CPU(超线程.双核)的普及,多线程和异步操作等并发程序设计方法也受到了更多的关注和讨论.本文主要是想探讨一下如何使用并发来最大化程序的性能. 多线程和异步操作的异同 多线程和异步操作两者都可以达到避免调用线程阻塞的目的,从而提高软件的可响应性.甚至有些时候我们就认为多线程和异步操作是等同的概念.但是,多线程和异步操作还是有一些区别的.而这些区别造成了使用多线程和异步操作的时机的区别. 异步操作的本质 所有的程序最终都会由计算机硬件来执行,所以为了更好的理解异步操作的本质,我们