`
lxcaoxin
  • 浏览: 125166 次
  • 性别: Icon_minigender_1
  • 来自: 南宁
社区版块
存档分类
最新评论

存储过程和SQL语句比较及存储过程在C#中调用方法(转)

阅读更多

存储过程与SQL语句的恩怨情仇

      程序员说:存储过程还是SQL语句,这是一个问题。 江湖现在有三个流派,一个是SQL语句流的,崇尚使用SQL语句,一派是存储过程派的,崇尚用存储过程说话,还有一派是中庸派的,讲求和谐,所以也就前两派吵得厉害,中庸派的看热闹。    

     现在SQL派的有Nhibernate为首的众多ORM助阵,最近风生水起比较得意,存储过程派也有自己的杀手秘籍,两派互不相让,争斗由来已久。 存储过程派的追求速度,所谓天下无功无坚不破,唯快不破,这也是存储过程派的人行走江湖的最大本钱。

      之前存储过程派的攻击SQL语句派的还有一个秘籍就是安全,不过现在都没人用连接String的动态SQL的了,这招也就失效了。 SQL语句派是资格很老的流派,但是新手居多,老资格很多投奔敌营存储过程派了。Java帮的人很多都是SQL语句派的,而存储过程派的以微软帮的居多。

      不过存储过程派也有软肋,可移植性就是其一,还有一点就是可扩展性,因为一般大型的Web应用程序都是多Web服务器,然后用双数据库服务器做双机热备,其中一台开机,但是是闲置的,这里只是解决单点故障的问题,但是形成了多Web应用服务器,单数据库服务器的情况,如果所有的运算都用存储过程实现,那么会造成数据库服务器负担过重,而Web服务器负荷不足的情况,而扩展数据库服务器的话就会非常的麻烦,而且投资较大,程序也需要改,而投资Web服务器就相对便宜而且扩容更加简单。

     人在江湖漂哪有不挨刀,所以中庸一点比较保险,我比较倾向于用把较多的负担放到程序里来,而降低数据库得负担,因为只要数据库扛得住,再增加Web服务器那是比较容易的,但是一旦数据库服务器扛不住了我们就只有哭了。一般报表阿,还有一些结果集比较复杂的我就用存储过程来包装,一般的查询和CUID操作我都是找个ORM来搞定。 其实主要是在说存储过程的软肋。

     1)从部署上看,存储过程要比sql

2) 从性能看,存储过程要比SQL

3) 从安全性将,存储过程比SQL防注入 过程可以减少网络数据传输量,把计算都放在服务器上 前端程序可以直接访问数据库的表,可以直接用SQL语言直接对数据库的表进行读写操作; 为安全,可以编程,使用存储过程进行数据表的读写操作,而前端程序直接访问这些存储过程,而不是数据库的表; 更安全的方法是:在前端程序和数据库之间,增加数据库访问层;前端将数据的读写请求提交给中间层,有中间层与数据库连接进行数据库的实际操作,将结果送给前端,这种方式可以避免前端机器直接连接到数据库的可能,数据库更安全。

C#两种不同的存储过程调用方法 ====================================================

两种不同的存储过程调用方法 为了突出新方法的优点,首先介绍一下在.NET中调用存储过程的官方方法。另外,本文的所有示例程序均工作于SqlServer数据库上,其它情况类似,以后不再一一说明。本文所有例子均采用C#语言。    要在应用程序中访问数据库,一般性的步骤是:首先声明一个数据库连接SqlConnection,然后声明一个数据库命令SqlCommand,用来执行 SQL语句和存储过程。有了这两个对象后,就可以根据自己的需要采用不同的执行方式达到目的。需要补充的是,不要忘记在页面上添加如下的引用语句: using System.Data.SqlClient   就执行存储过程来说,如果执行的是第一类存储过程,那么就要用一个 DataAdapter将结果填充到一个DataSet中,然后就可以使用数据网格控件将结果呈现在页面上了;如果执行的是第二和第三种存储过程,则不需要此过程,只需要根据特定的返回判定操作是否成功完成即可。

<!--[if !supportLists]-->(1)  <!--[endif]-->执行一个没有参数的存储过程的代码如下:

 SqlConnection conn=new SqlConnection(“connectionString”);

SqlDataAdapter da = new SqlDataAdapter();

 da.SelectCommand = new SqlCommand();

da.SelectCommand.Connection = conn;

da.SelectCommand.CommandText = "NameOfProcedure"; da.SelectCommand.CommandType = CommandType.StoredProcedure;  

 然后只要选择适当的方式执行此处过程,用于不同的目的即可。   

<!--[if !supportLists]-->(2)  <!--[endif]-->执行一个有参数的存储过程的代码如下(我们可以将调用存储过程的函数声明为ExeProcedure(string inputdate)): SqlConnection conn=new SqlConnection(“connectionString”); SqlDataAdapter da = new SqlDataAdapter(); da.SelectCommand = new SqlCommand(); da.SelectCommand.Connection = conn; da.SelectCommand.CommandText = "NameOfProcedure"; da.SelectCommand.CommandType = CommandType.StoredProcedure; (以上代码相同,以下为要添加的代码)

param = new SqlParameter("@ParameterName", SqlDbType.DateTime); param.Direction = ParameterDirection.Input; param.Value = Convert.ToDateTime(inputdate);

da.SelectCommand.Parameters.Add(param);   

这样就添加了一个输入参数。若需要添加输出参数:

 param = new SqlParameter("@ParameterName", SqlDbType.DateTime); param.Direction = ParameterDirection.Output; param.Value = Convert.ToDateTime(inputdate); da.SelectCommand.Parameters.Add(param);   若要获得参储过程的返回值:

 param = new SqlParameter("@ParameterName", SqlDbType.DateTime); param.Direction = ParameterDirection.ReturnValue;

param.Value = Convert.ToDateTime(inputdate); da.SelectCommand.Parameters.Add(param);   

从上面的代码我们可以看出,当存储过程比较多或者存储过程的参数比较多时,这种方法会大大影响开发的速度;另外一方面,如果项目比较大,那么这些用于数据库逻辑的函数在以后的维护中也是一个很大的负担。那么,有没有一种改进的方法可以解决这个问题呢?想到在执行没有参数的存储过程时只需要传入一个存储过程的名字就可以调用相应的存储过程,而且在SqlServer数据库中我们可以直接在查询分析器中敲入存储过程名(参数列表)样的字符串就可以执行存储过程,那么,是否可以把这种思想应用到应用程序中呢?  

 于是在编译器中键入相应代码。这些代码是在调用不带参数的存储过程的代码的基础上改的。具体代码如下:

SqlConnection conn=new SqlConnection(“connectionString”);

 SqlDataAdapter da = new SqlDataAdapter();

da.SelectCommand = new SqlCommand();

da.SelectCommand.Connection = conn;

da.SelectCommand.CommandText = "NameOfProcedure’para1’,’para2’,para3"; da.SelectCommand.CommandType = CommandType.StoredProcedure;  

 为了使代码更具有代表性,要调用的存储过程的第一个和第二个参数都为字符串类型,第三个参数为整型。执行以后发现,完全可以达到预期的效果! SQL Server 2005帮助文档中关于存储过程返回值使用的例子和说明 RETURN 语句无条件终止查询、存储过程或批处理。存储过程或批处理中 RETURN 语句后面的语句都不执行。 当在存储过程中使用 RETURN 语句时,此语句可以指定返回给调用应用程序、批处理或过程的整数值。如果 RETURN 未指定值,则存储过程返回 0 大多数存储过程按常规使用返回代码表示存储过程的成功或失败。没有发生错误时存储过程返回值 0。任何非零值表示有错误发生。例如:

 USE AdventureWorks; GO -- Create a procedure that takes one input parameter -- and returns one output parameter and a return code. CREATE PROCEDURE SampleProcedure @EmployeeIDParm INT, @MaxTotal INT OUTPUT AS -- Declare and initialize a variable to hold @@ERROR. DECLARE @ErrorSave int; SET @ErrorSave = 0; -- Do a SELECT using the input parameter. SELECT c.FirstName, c.LastName, e.Title FROM HumanResources.Employee AS e JOIN Person.Contact AS c ON e.ContactID = c.ContactID WHERE EmployeeID = @EmployeeIDParm; -- Save any nonzero @@ERROR value. IF (@@ERROR 0) SET @ErrorSave = @@ERROR; -- Set a value in the output parameter. SELECT @MaxTotal = MAX(TotalDue) FROM Sales.SalesOrderHeader; IF (@@ERROR 0) SET @ErrorSave = @@ERROR; -- Returns 0 if neither SELECT statement had -- an error, otherwise returns the last error. RETURN @ErrorSave; GO 执行存储过程的 Transact-SQL 批处理或存储过程可以将返回代码检索到整数变量中: DECLARE @ReturnStatus int; DECLARE @MaxTotalVariable int; DECLARE @MaxTotal int; EXECUTE @ReturnStatus = SampleProcedure @EmployeeIDParm = 65 ,@MaxTotal = @MaxTotalVariable OUTPUT; PRINT ' '; PRINT 'Return code = ' + CAST(@ReturnStatus AS CHAR(10)); PRINT 'Maximum Order Total = ' + CAST(@MaxTotalVariable AS CHAR(15)); GO 调用存储过程的应用程序可以将返回代码所对应的参数标记与整型变量绑定。

分享到:
评论

相关推荐

    C# winform调用SQL存储过程-菜鸟入门 详细注释

    内容概要:简单的C# winform调用存储过程实例,创建存储过程入参,通过SqlConnection对象和SqlCommand对象调用存储过程,获取存储过程的出参并显示出来,详细代码注释,希望对用到C#调用存储过程的小伙伴有帮助 ...

    C#中SQL语句调用

    SQL2005 C#中对SQL语句的调用 SQL2005 C#中对SQL语句的调用 SQL2005 C#中对SQL语句的调用 SQL2005 C#中对SQL语句的调用

    SQL Server中存储过程比直接运行SQL语句慢的原因

    1. 存储过程只在创造时进行编译即可,以后每次执行存储过程都不需再重新编译,而我们通常使用的SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。 2. 经常会遇到复杂的业务逻辑和对数据库的...

    C#连接数据库执行存储过程和SQL语句的类

    C#连接数据库,执行SQL语句和存储过程的代码,封装好了的,直接调用就可以

    C# SQL数据库操作语句

    同时附上在C#IDE开发时,调用执行这些SQL语句的方法! 以上代码都有实际试验验证过的!(其中SQL数据库差异数据库恢复在C#里执行一直不成功,但SQL里恢复是没有问题的,你知道详情的朋友可以指点下(nanmosiam@...

    C#调用oracle储存过程例子

    包含从建表空间、用户、表、新增数据、建立储存过程、C#编程调用的完整过程,提供完整SQL语句和C#源码,适合初学者学习使用。

    c#中两种不同的存储过程调用与比较

    调用存储过程实现数据库操作使很多程序员使用的方法,而且大多数的程序员都是能使用存储过程就使用存储过程,很少直接使用SQL语句,所以存储过程是很有用而且很重要的。 存储过程简介 简单的说,存储过程是由一些SQL...

    存储过程实例解释 事务实例解释 C#中使用带返回值的存储过程

    简单的存储过程 如何在ASP.NET中调用这个存储过程 带参数的存储过程 如何在ASP.NET中调用这个带参数的存储过程 如何根据传入的参数判断执行哪条SQL语句 C#中使用带返回值的存储过程 SqlServer存储过程的事务处理

    C#调用SQL语句时乘号的用法

    主要介绍了C#调用SQL语句时乘号的用法,可避免因符号引起的程序错误,是C#程序设计人员有必要掌握的,需要的朋友可以参考下

    C# 连接各种数据库返回DataTable的方法

    基于C# Access连接 , SqlServer连接,Oracle连接 ,MySql连接 的连接方法,通过执行SQL语句返回DataTable

    精通sql结构化查询语句

    讲解SQL语言的应用,提供了近500个曲型应用,读者可以随查随用,深入讲解SQL语言的各种查询语句,详细介绍数据库设计及管理,详细讲解存储过程、解发器和游标等知识,讲解了SQL语言在高级语言中的具体应用。...

    最全C#基础类库

    使用C#实现对Sql数据库的操作,执行存储过程,Sql语句,返回影响行数,返回DateTable,DataSet,DataReader,以及表集等方法。实现多个数据库的切换功能。功能强大,希望大家喜欢 2.一个操作Sql2005数据库的类(备份...

    DBHelper数据库操作类(支持OleDb、MySQL、Oracle、SQL、SQLite).zip

    执行带一个存储过程参数的的SQL语句。 向数据库里插入图像格式的字段 执行一条计算查询结果语句,返回查询结果 执行查询语句,返回MySqlDataReader 执行查询语句,返回DataSet 执行SQL语句,返回影响的记录数 执行多...

    c#实现用SQL池,多线程定时批量执行SQL语句的方法

    构建SQL池,分离业务逻辑层和数据访问层,让业务逻辑层从低效的数据库操作解脱,以提高系统整体性能

    C#写的 SQL Builders

    .net项目中开发中有时会用到动态构建SQL语句,根据本人使用SQL的经验,写出了一些常用的SQL语句构建类,使得SQL的生成更自然。比起用字符串拼接不但好用而且不易出错。 如: InsertBuilder insertBuilder = new ...

    C# 调用DBF DBF2SQL

    这是本人花了两天时间编写的,一个完全不依赖第三方(如odbc、jet等)直接读取...支持dbf导出sql建表语句及insert语句以及返回datatable类型。具体参考http://blog.csdn.net/xiaowu218/archive/2010/08/13/5809804.aspx

    根据表名及字段,自动生成insert,update,select语句

    首先在数据库中创建存储过程和方法,然后调用创建好的存储过程,生成带有与表名及字段相关的insert,update,delete语句,变量与表字段名相同,例如: "insert into temp (col1,col2,col3) values ('"+col1+"','"+col2...

    C#-数据库知识点及连接数据库方法.docx

    第二,建立SqlCommand对象,负责SQL语句的执行和存储过程的调用; 第三,对SQL或存储过程执行后返回的"结果"进行操作。 对返回"结果"的操作可以分为两类: 一是用SqlDataReader直接一行一行的读取数据集; 二是...

    C#开发经验技巧宝典

    0808 在C#应用程序中控制输入法 488 0809 打开“区域和语言选项”对话框并指定选项卡 489 0810 如何执行命令行命令? 489 0811 如何修改计算机的默认打印机 490 0812 如何实现行业软件系统注销功能 490 ...

Global site tag (gtag.js) - Google Analytics