C#执行存储过程的简化-.NET教程,C#语言_第1页
C#执行存储过程的简化-.NET教程,C#语言_第2页
C#执行存储过程的简化-.NET教程,C#语言_第3页
C#执行存储过程的简化-.NET教程,C#语言_第4页
C#执行存储过程的简化-.NET教程,C#语言_第5页
免费预览已结束,剩余3页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、来源:作者:发布时间:2007-12-26 10:42:08域名注册8年专业域名注册经验 com域名59元cmd. parameters.add( parmsr);虚拟主机提供国际CDN流量,可免备案超强控制面板,可开子站点VPS主机全国十余家优质机房可选 独立操作系统,无限开站点下面的方法是我在实际研发中摸索出来的,能在非常大程度上简化调用存储过程的代码首先来看一下c#调用存储过程的一般过程:1、打开数据库连接sqlconnection ;2、生成一个 sqlcommand ;3、向命令对象填充参数;4、执行存储过程;5、关闭连接;6、其他操作.我这里讲的主要是简化第 3步操作,最终在调用存

2、储过程的时候只需要传递存储过程的名字和相应的参数值。调用示例如下: dbaccess.run(''p_am_deletefile'', new objectloginid, request.userhostaddress, fileid);由于在填充参数的时候必须要两个值,一个是参数的名字,一个是参数的值。参数值是由外部传入的,不用考虑;而参数名称是和存储过程相关的 东西,应该能由存储过程名称来确定而不用每次调用的时候写上一遍。对于这个问题,如果能将存储过程的参数保存到一个全局的地方,那么在调/值对的方式用存储过程的时候只要能根据存储过程的名字去索引就能了。具体

3、实现的时候我是将这些信息保存在数据库访问组件里面,采用名字 代码如下:P ublic class infotable : nameobjectcollectionbase p ublic object thisstring key get return(this.baseget(key);setp rotected static infotable p rocinfotable = new infotable();p ublic static infotable p rocinfotable get return procin fotable;这样的话,在实际调用存储过程的时候就只需要去查这张

4、表就能知道存储过程的参数名了。实现代码如下:P ublic datatable run(string p rocname, object p arms, ref int retvalue) stri ng p aram info = (stri ng )(procin fotable procn ame);if (p aram info = n ull)errori nfo.seterrori nfo("未取得 ” + p roc name + " 的参数!");retu rn n ull;bool bopened = (dbc onn .state = conn

5、 ectio nstate. open);if (!b opened && !conn ect() retu rn n ull;dataset ds = new dataset();try sqlcomma nd cmd = new sqlcomma nd(procn ame, dbc onn);ma ndtype = comma ndtyp e.stored procedure;for (int i = 0; i < p arms.le ngth && i < p aram in fo.le ngth; +i) cmd .p arameters.a

6、dd (new sqlp arameter( param in foi, p armsi);sqlp arameter p armsr = new sqlp arameter("retu rn", sqldbt yp e.i nt);p armsr.directio n 二 p arameterdirecti on. retu rnv alue;sqldataada pter adp 二 new sqldataada pter(cmd);adp .fill(ds);retvalue = (in t)(cmd .p arameters"retu rn ”.value

7、);catch (exce pti on ex)errori nfo.seterrori nfo(ex.message);retvalue = -1;if (!b open ed)close();if (ds.tables.co unt > 0)retu rn ds.tablesO;elseretu rn n ull;能看岀,每个存储过程的参数列表存储为了一个string。接下来的工作就是将系统里头许多的存储过程的参数填充到表P roc in fotable 中。我所用的数据库是sql server 2000 ,下面给岀一个存储过程来解决这个烦人的问题:create pr ocedure

8、 dbo .p_am_procinfop roc name t_str64 -存储过程的名字as begi n set nocount on if procn ame = beg in select n ame as procn ame from sysobjects where substri ng(sysobjects .n ame, 1, 5) = p_am_ end else begi n select syscolum ns.n ame as p aram name from sysobjects, syscolum ns where sysobjects.id = syscolum

9、 ns.id and sysobjects .n ame = procn ame order by colidendend” p_am_开头的存储过程的名字;在传入了相应的存储过程这个存储过程有两个作用,在没有传递存储过程的名字的时候,该存储过程返回所有以 名字后,该存储过程返回该存储过程的参数列表。这样一来,我们在程式开始的地方就能将系统里的存储过程参数列表取出来并保存到数据库访问组件的Procinfotable属性中了。具体代码如下:span .dbaccess dbaccess = new span .dbaccess();/ /构造取存储过程的参数表 / span .dbaccess

10、.procin fotable” p_am_procinfo" = new stri ng" procn ame"/ /取得其他存储过程列表 / datatable dt = dbaccess.r un ("p_am_ procin fo", new object"");if (dt = n ull II dt.rows.co unt <= 0) return;/ /取得其他存储过程的参数表 / foreach (datarow dr in dt.rows) datatable dtp arams = dbaccess

11、.r un ("p_am_ procin fo", new objectdr" procn ame");if (dt params != n ull) stri ng p arami nfo = new stri ngdt params.rows.co un t;for (int i = 0; i < dtp arams.rows.co unt; +i) p aram in foi = dt params.rowsi” param name".tostri ng();span .dbaccess .procin fotabledr &qu

12、ot;procn ame".tostri ng() = p aram info;至此,全部技术细节介绍完毕。另外,数据库访问对象的几个接口函数也一并给出:/打开、关闭数据库连接P ublic bool connect(string strconn) p ublic bool connect()p ublic bool close()/执行sql命令(只有一个int返回)p ublic int exec(stri ng procn ame, object p arms) p ublic int exec(stn ng sql)/运行(返回一个datatable)P ublic data

13、table run (stri ng procn ame, object p arms, ref int retvalue)p ublic datatable run (stri ng procn ame, object p arms)p ublic datatable run (stri ng sql)/分页查询(页号从1开始,返回一个datatable) p ublic datatable p agequery( stri ng selectcmd,int p agesize,int p age number)C#调用存储过程的方法/数据库连接字符串(web.config来配置),可以动态

14、更改connectionString支持 多数据库.p ublic static stri ng connection Stri ng =System.C on figuratio n.Con figurati onMan ager.C onn ectio nStri ngs"C onn ectio nStri ng" .Connection Stri ng;/ <summary>/执行存储过程,返回SqlDataReader (注意:调用该方法后,一定要对 SqlDataReader®行 Close )/ </summary>/ vpar

15、am name="storedProcName"存储过程名 v/param>/ vparam name="parameters"存储过程参数 v/param>/ vretur ns>SqlDataReaderv/retur ns>p ublic static SqlDataReader RunP rocedure(stri ng stored ProcName,IData Parameter p arameters)SqlCo nn ecti on connection = new SqlC onn ectio n(co nn e

16、ctio nStri ng);SqlDataReader retur nReader;conn ecti on.Open();SqlComma nd comma nd = BuildQueryComma nd(co nn ectio n,stored ProcName, p arameters);comma nd.Comma ndType = Comma ndTyp e.Stored Procedure;retur nReader =comma nd.ExecuteReader(Comma ndBehavior.CloseCo nn ecti on); return retu rn Reade

17、r;/ <summary>/执行存储过程/ </summary>/ vparam name="storedProcName"存储过程名 v/param>/ vparam name="parameters"存储过程参数 v/param>/ vparam name="tableName">DataSe结果中的表名 v/param>/ vretur ns>DataSetv/retur ns>p ublic static DataSet RunP rocedure(stri ng s

18、tored ProcName,IData Parameter p arameters, stri ng tableName)using (SqlCo nn ecti on connection = newSqlCo nn ecti on(conn ecti on Stri ng)DataSet dataSet = new DataSet();conn ectio n.O pen();SqlDataAda pter sqlDA = new SqlDataAda pter(); sqlDA.SelectComma nd = BuildQueryComma nd(co nn ectio n, sto

19、red ProcName, p arameters);sqlDA.Fill(dataSet, tableName);conn ectio n.Close();return dataSet;p ublic static DataSet RunP rocedure(stri ng stored ProcName,IData Parameter p arameters, stri ng tableName, int Times)using (SqlCo nn ecti on connection = newSqlCo nn ecti on(conn ecti on Stri ng)DataSet d

20、ataSet = new DataSet();conn ectio n.O pen();SqlDataAda pter sqlDA = new SqlDataAda pter(); sqlDA.SelectComma nd = BuildQueryComma nd(co nn ectio n, stored ProcName, p arameters);sqlDA.SelectComma nd.Comma ndTimeout = Times; sqlDA.Fill(dataSet, tableName);conn ectio n.Close();return dataSet; / vsumma

21、ry>/构建SqlCommand对象(用来返回一个结果集,而不是一个整数 / v/summary>/ vparam name="connection">数据库连接 v/param>/ vparam name="storedProcName"存储过程名 v/param>/ vparam name="parameters"存储过程参数 v/param>/ vreturns>SqlComma ndv/returns>p rivate static SqlComma nd BuildQueryC

22、omma nd(SqlC onn ectio n conn ecti on, stri ng stored ProcName, IData Parameter p arameters)SqlComma nd comma nd = new SqlComma nd(stored ProcName,conn ecti on);comma nd.Comma ndType = Comma ndTyp e.Stored Procedure; foreach (Sq IP arameter p arameter in p arameters)if (p arameter != n ull)/检查未分配值的输

23、出参数,将其分配以DBNull.Value. if (p arameter.Directi on =P arameterDirect ion.Inpu tOut put | p arameter.Direct ion = P arameterDirect ion.Input) &&(p arameter.Value = nu II)p arameter.Value = DBNull.Value;comma nd.P arameters.Add( parameter); return comma nd; / <summary>/执行存储过程,返回Out put输出参数

24、值/ </summary>/ vparam name="storedProcName"存储过程名 v/param>/ vparam name="parameters"存储过程参数 v/param>/ vretur ns>objectv/retur ns>p ublic static object RunP rocedure(stn ng stored ProcName, IData Parameter p arame nters)using (SqlCo nn ecti on connection = newSqlCo

25、 nn ecti on(conn ecti on Stri ng)conn ectio n.O pen();SqlComma nd comma nd = BuildQueryComma nd(c onn ectio n, stored ProcName, p arame nters);comma nd.ExecuteN on Query();object obj=comma nd.P arameters"Out pu t_Value".Value;/Output_Value和具体的存储过程参数对应if (Object.Equals(obj, null) | (Object.

26、Equals(obj,System.DBNull.Value)return n ull;elsereturn obj; / <summary>/执行存储过程,返回影响的行数/ </summary>/ vparam name="storedProcName"存储过程名 v/param>/ vparam name="parameters"存储过程参数 v/param>/ vparam name="rowsAffected">影响的行数 v/param>/ vretur nsx/retur ns>p ublic static int RunP rocedure(stri ng stored ProcName, IData Parameter p arameters, out int rowsAffected)using (SqlCo nn ecti on connection = newSqlCo nn ecti on(conn ecti on Stri ng)int result;conn ec

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论