存储过程的调用在B/S系统中用的很多。传统的调用方法不仅速度慢,而且代码会随着存储过程的增多不断膨胀,难以维护。新的方法在一定程度上解决了这些问题。
在使用.NET的过程中,数据库访问是一个很重要的部分,特别是在B/S系统的构建过程中,数据库操作几乎成为了一个必不可少的操作。调用存储过程实现数据库操作使很多程序员使用的方法,而且大多数的程序员都是能使用存储过程就使用存储过程,很少直接使用SQL语句,所以存储过程是很有用而且很重要的。
存储过程简介 简单的说,存储过程是由一些SQL语句和控制语句组成的被封装起来的过程,它驻留在数据库中,可以被客户应用程序调用,也可以从另一个过程或触发器调用。它的参数可以被传递和返回。与应用程序中的函数过程类似,存储过程可以通过名字来调用,而且它们同样有输入参数和输出参数。
根据返回值类型的不同,我们可以将存储过程分为三类:返回记录集的存储过程, 返回数值的存储过程(也可以称为标量存储过程),以及行为存储过程。顾名思义,返回记录集的存储过程的执行结果是一个记录集,典型的例子是从数据库中检索出符合某一个或几个条件的记录;返回数值的存储过程执行完以后返回一个值,例如在数据库中执行一个有返回值的函数或命令;最后,行为存储过程仅仅是用来实现数据库的某个功能,而没有返回值,例如在数据库中的更新和删除操作。
使用存储过程的好处 相对于直接使用SQL语句,在应用程序中直接调用存储过程有以下好处:
(1)减少网络通信量。调用一个行数不多的存储过程与直接调用SQL语句的网络通信量可能不会有很大的差别,可是如果存储过程包含上百行SQL语句,那么其性能绝对比一条一条的调用SQL语句要高得多。
(2)执行速度更快。有两个原因:首先,在存储过程创建的时候,数据库已经对其进行了一次解析和优化。其次,存储过程一旦执行,在内存中就会保留一份这个存储过程,这样下次再执行同样的存储过程时,可以从内存中直接调用。
(3)更强的适应性:由于存储过程对数据库的访问是通过存储过程来进行的,因此数据库开发人员可以在不改动存储过程接口的情况下对数据库进行任何改动,而这些改动不会对应用程序造成影响。
(4) 布式工作:应用程序和数据库的编码工作可以分别独立进行,而不会相互压制。
由以上的分析可以看到,在应用程序中使用存储过程是很有必要的。
两种不同的存储过程调用方法 为了突出新方法的优点,首先介绍一下在.NET中调用存储过程的“官方”方法。另外,本文的所有示例程序均工作于SqlServer数据库上,其它情况类似,以后不再一一说明。本文所有例子均采用C#语言。
要在应用程序中访问数据库,一般性的步骤是:首先声明一个数据库连接SqlConnection,然后声明一个数据库命令SqlCommand,用来执行SQL语句和存储过程。有了这两个对象后,就可以根据自己的需要采用不同的执行方式达到目的。需要补充的是,不要忘记在页面上添加如下的引用语句:using System.Data.SqlClient。
就执行存储过程来说,如果执行的是第一类存储过程,那么就要用一个DataAdapter将结果填充到一个DataSet中,然后就可以使用数据网格控件将结果呈现在页面上了;如果执行的是第二和第三种存储过程,则不需要此过程,只需要根据特定的返回判定操作是否成功完成即可。
(1)执行一个没有参数的存储过程的代码如下:
复制代码 代码如下:
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;
然后只要选择适当的方式执行此处过程,用于不同的目的即可。
(2)执行一个有参数的存储过程的代码如下(我们可以将调用存储过程的函数声明为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);
这样就添加了一个输入参数。若需要添加输出参数:
复制代码 代码如下:
//设置存储过程的参数值,其中@ParameterName为存储过程的参数.
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);
执行: DataSet myds=new DataSet();
da.Fill(myds,"tableName");
从上面的代码我们可以看出,当存储过程比较多或者存储过程的参数比较多时,这种方法会大大影响开发的速度;另外一方面,如果项目比较大,那么这些用于数据库逻辑的函数在以后的维护中也是一个很大的负担。那么,有没有一种改进的方法可以解决这个问题呢?想到在执行没有参数的存储过程时只需要传入一个存储过程的名字就可以调用相应的存储过程,而且在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;
为了使代码更具有代表性,要调用的存储过程的第一个和第二个参数都为字符串类型,第三个参数为整型。执行以后发现,完全可以达到预期的效果!
两种调用方法的比较 通过比较我们可以看到,第二种方法具有一个很明显的优点,那就是可以提高开发速度,节省开发时间,而且代码容易维护,在一定程度上也减少了系统大小。但是,由于对存储过程参数的处理比较笼统,如果要获取输出参数或者得到存储过程的返回值,这种方法就不能满足需要了。虽然如此,但是,这种方法毕竟可以让开发人员少些很大一部分的代码。如果不需要获取输出参数和返回值,那么几乎可以做到“一劳永逸”。因此在实际的程序开发中,这种方法还是具有一定的实用价值的。
用来创建DataRead的存储过程调用;
复制代码 代码如下:
//数据库连接字符串
string connStr="Server=localhost;database=stuIMS;uid=sa;pwd=admin";
//建立连接
SqlConnection conn=new SqlConnection(connStr);
//建立查询命令
SqlCommand myCommand=new SqlCommand("存储过程名",conn);
//调用存储过程名
myCommand.CommandType=CommandType.StoredProcedure;
//设置存储过程的参数值,其中@id 为存储过程的参数.
SqlParameter id=myCommand.Parameters.Add("@id",SqlDbType.NText);
id.Value=存储过程参数值;
//执行命令
SqlDataReader reader=myCommand.ExecuteReader();//读取数据
//或者
SqlDataReader reader=myCommand.ExecuteNonQuery();//数据更新
相关推荐:
SEO努力:提升网站排名的关键策略,网站建设微企动力
AI缩短短文-提升创作效率,写作新体验,光速写作业ai写作app
AI.生成重新定义创造力的新纪元
SEO师:如何在数字时代为企业赢得流量与销量,十堰网站关键词优化教程
如何用AI写公众号文章?让创作更高效、更轻松
SEO技巧提升网站流量和排名,助力企业快速崛起,ai080206.
AI代写文章:高效创作的新风尚
如何选择适合你的AI工具?全面解析AI工具哪个好用
ChatGPT怎么打不开了?解决办法,轻松恢复畅通无阻!,ai订酒店ai对话
SEO站外优化策略:提升网站排名的关键因素,遵义公司网站推广
SEO职位:数字营销的核心,开启职业新高峰,汕尾网站建设推广厂商
ChatGPT网页版为什么不能用了?解析原因与解决办法,女人莫名其妙想ai
seo灰帽是什么,灰帽是指什么 ,ai绘画六边形
SEO王:掌控搜索引擎优化的至高法则,助力企业飞速腾飞,网站动作优化在哪里下载
SEO模块:提升网站排名,驾驭数字营销未来,营口网站建设制作平台
SEO差价如何用SEO优化帮助企业实现成本与效益的完美平衡,盐城seo收费贵吗
AI搜索相似文章怎么做?揭秘高效文章检索的核心技术!,程式ai软件
亚马逊产品seo什么意思,亚马逊平台产品专业术语 ,小新同学ai
好用的AI写作软件免费推荐:创作新境界!
SEO刷:让你的网站一夜之间登顶搜索引擎!,独特seo技巧
SEO定价策略:如何根据企业需求定制最佳价格方案,教育培训抖音营销推广
SEO网络营销:如何通过精准优化提升品牌价值,青州建设网站电话
《权重参谋:让您的网站轻松登顶搜索引擎的秘密武器》,设计微信社群私域营销推广简案
seo运营经理是什么,seo和运营的区别 ,皖妍ai宁慕晴o
SEO自从上线后的演变与未来发展趋势,拼多多增加关键词排名
SEO走动:提升网站流量的关键一步,SEO数据监控宝宝推荐
在线AI文章生成:内容创作新革命
SEO出超:如何通过精准优化实现网站流量大爆发,营销推广方式联系f火15星
SEO自行:提升网站流量的秘密武器,邹平县个人网站建设建议
seo网站是什么东西,seo网站是什么东西啊 ,ai锯齿消失
AI人工智能生成文章:开启写作新时代
文章AI生成软件高效创作新纪元
SEO优化顾问:让您的网站脱颖而出的秘密武器,ai ps 群
AI免费试用不需要登录:体验智能科技的魅力,轻松开启未来,华为ai身材
SEO代做:让你的企业轻松登顶搜索引擎,快速提升曝光率,seo 提高注册量
seo种草什么意思,seo yoo na ,三维地震反演AI
seo需要什么人才,seo需要做什么工作 ,探索ai照片
SEO每日:提高网站流量的秘密武器,助你脱颖而出,seo优化和排名技巧
为什么行业都要做seo,为什么要做seo ,ai明信片
seo站内优化包括什么营销,seo站内优化操作流程 ,ai 玻璃图标
如何下载免费AI软件,让你的工作和生活更智能
打造内容创作新高度:文章扩写AI的革命性优势
今时CMS:引领数字化转型的智慧之选,河南seo优化网站联系方式
SEO优化中怎么找关键词:全面解析与实战技巧,ai2002.4.8
Bing搜索不能预览了?搜索引擎的新变革与挑战,ai制作一张窗花
AI网页版智能问答,开启智慧沟通新时代,ai梦境档案用不了手柄
ChatGPT已识别但不可用?揭秘背后原因与解决方案!,小狸ai和斑马ai语文
AI搜索写文章是什么意思?人工智能赋能内容创作的未来,高德地图 ai
ChatGPT目前,我无法查看或打开附件,但我依然能为你提供全面的帮助,苹果ai谷歌ai
ChatGPT破解版:让人工智能助力你的工作与生活,ai cos帽