下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 操场借用协议书
- 放弃胚胎协议书
- 断绝朋友协议书
- 2025年高职道路桥梁工程(桥梁施工技术)试题及答案
- 2025年大学第一学年(药学)药物分析学基础综合测试试题及答案
- 知识点及2025秋期末测试卷(附答案)-冀教版(三起)(新教材)小学英语四年级上册
- 2025年中职金属材料与热处理(材料热处理工艺)试题及答案
- 2025年高职旅游管理(导游服务)试题及答案
- 2025年大学园艺(观赏园艺学)试题及答案
- 2025年大学医学检验技术(医学检验分析技术)试题及答案
- 电力线路架设安全操作方案
- 桥台钢筋专项施工方案
- (正式版)DB65∕T 4229-2019 《肉牛、肉羊全混合日粮(∕TMR)搅拌机》
- 诚信教育主题班会诚就未来信立人生课件
- 2025年高压电工考试题库:安全事故应急响应与救援措施试题卷
- 《数控机床编程与仿真加工》课件-项目9斯沃数控铣仿真软件的操作
- 2025年税务考试题库大题及答案
- 江西省赣州市2024-2025学年高一上学期1月期末考试生物试题(含答案)
- 奉贤区2024-2025学年六年级上学期期末考试数学试卷及答案(上海新教材沪教版)
- 渝20Q01 建设工程施工现场围挡及大门标准图集(2020版)DJBT50-133
- 肉制品运输管理制度
评论
0/150
提交评论