




已阅读5页,还剩4页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
. C#执行存储过程的简化-.NET教程,C#语言 来源:作者: 发布时间:2007-12-26 10:42:08 域名注册o 8年专业域名注册经验 o com域名59元 虚拟主机o 提供国际CDN流量,可免备案 o 超强控制面板,可开子站点 VPS主机o 全国十余家优质机房可选 o 独立操作系统,无限开站点 下面的方法是我在实际研发中摸索出来的,能在非常大程度上简化调用存储过程的代码。 首先来看一下c#调用存储过程的一般过程: 1、打开数据库连接sqlconnection; 2、生成一个sqlcommand; 3、向命令对象填充参数; 4、执行存储过程; 5、关闭连接; 6、其他操作。 我这里讲的主要是简化第3步操作,最终在调用存储过程的时候只需要传递存储过程的名字和相应的参数值。调用示例如下: dbaccess.run(p_am_deletefile, new objectloginid, request.userhostaddress, fileid); 由于在填充参数的时候必须要两个值,一个是参数的名字,一个是参数的值。参数值是由外部传入的,不用考虑;而参数名称是和存储过程相关的东西,应该能由存储过程名称来确定而不用每次调用的时候写上一遍。对于这个问题,如果能将存储过程的参数保存到一个全局的地方,那么在调用存储过程的时候只要能根据存储过程的名字去索引就能了。具体实现的时候我是将这些信息保存在数据库访问组件里面,采用名字/值对的方式。代码如下: public class infotable : nameobjectcollectionbase public object thisstring key get return(this.baseget(key); set this.baseset(key, value); 。 protected static infotable procinfotable = new infotable(); 。 public static infotable procinfotable get return procinfotable; 这样的话,在实际调用存储过程的时候就只需要去查这张表就能知道存储过程的参数名了。实现代码如下: public datatable run(string procname, object parms, ref int retvalue) string paraminfo = (string)(procinfotableprocname); if (paraminfo = null) errorinfo.seterrorinfo(未取得 + procname + 的参数!); return null; bool bopened = (dbconn.state = connectionstate.open); if (!bopened & !connect() return null; dataset ds = new dataset(); try sqlcommand cmd = new sqlcommand(procname, dbconn); mandtype = commandtype.storedprocedure; for (int i = 0; i parms.length & i 0) return ds.tables0; else return null; 能看出,每个存储过程的参数列表存储为了一个string。接下来的工作就是将系统里头许多的存储过程的参数填充到表procinfotable中。我所用的数据库是sql server 2000,下面给出一个存储过程来解决这个烦人的问题: create procedure dbo.p_am_procinfo ( procname t_str64 -存储过程的名字 ) as begin set nocount on if procname = begin select name as procname from sysobjects where substring(, 1, 5) = p_am_ end else begin select as paramname from sysobjects, syscolumns where sysobjects.id = syscolumns.id and = procname order by colid end end 这个存储过程有两个作用,在没有传递存储过程的名字的时候,该存储过程返回所有以”p_am_”开头的存储过程的名字;在传入了相应的存储过程名字后,该存储过程返回该存储过程的参数列表。这样一来,我们在程式开始的地方就能将系统里的存储过程参数列表取出来并保存到数据库访问组件的procinfotable属性中了。具体代码如下: span.dbaccess dbaccess = new span.dbaccess(); / /构造取存储过程的参数表 / cinfotablep_am_procinfo = new stringprocname; / /取得其他存储过程列表 / datatable dt = dbaccess.run(p_am_procinfo, new object); if (dt = null | dt.rows.count = 0) return; / /取得其他存储过程的参数表 / foreach (datarow dr in dt.rows) datatable dtparams = dbaccess.run(p_am_procinfo, new objectdrprocname); if (dtparams != null) string paraminfo = new stringdtparams.rows.count; for (int i = 0; i dtparams.rows.count; +i) paraminfoi = dtparams.rowsiparamname.tostring(); cinfotabledrprocname.tostring() = paraminfo; 至此,全部技术细节介绍完毕。另外,数据库访问对象的几个接口函数也一并给出: /打开、关闭数据库连接 public bool connect(string strconn) public bool connect() public bool close() /执行sql命令(只有一个int返回) public int exec(string procname, object parms) public int exec(string sql) /运行(返回一个datatable) public datatable run(string procname, object parms, ref int retvalue) public datatable run(string procname, object parms) public datatable run(string sql) /分页查询(页号从1开始,返回一个datatable) public datatable pagequery ( string selectcmd, int pagesize, int pagenumber ) C#调用存储过程的方法/数据库连接字符串(web.config来配置),可以动态更改connectionString支持多数据库. public static string connectionString = System.Configuration.ConfigurationManager.ConnectionStringsConnectionString.ConnectionString; / / 执行存储过程,返回SqlDataReader ( 注意:调用该方法后,一定要对SqlDataReader进行Close ) / / 存储过程名 / 存储过程参数 / SqlDataReader public static SqlDataReader RunProcedure(string storedProcName, IDataParameter parameters) SqlConnection connection = new SqlConnection(connectionString); SqlDataReader returnReader; connection.Open(); SqlCommand command = BuildQueryCommand(connection, storedProcName, parameters); command.CommandType = CommandType.StoredProcedure; returnReader = command.ExecuteReader(CommandBehavior.CloseConnection); return returnReader; / / 执行存储过程 / / 存储过程名 / 存储过程参数 / DataSet结果中的表名 / DataSet public static DataSet RunProcedure(string storedProcName, IDataParameter parameters, string tableName) using (SqlConnection connection = new SqlConnection(connectionString) DataSet dataSet = new DataSet(); connection.Open(); SqlDataAdapter sqlDA = new SqlDataAdapter(); sqlDA.SelectCommand = BuildQueryCommand(connection, storedProcName, parameters); sqlDA.Fill(dataSet, tableName); connection.Close(); return dataSet; public static DataSet RunProcedure(string storedProcName, IDataParameter parameters, string tableName, int Times) using (SqlConnection connection = new SqlConnection(connectionString) DataSet dataSet = new DataSet(); connection.Open(); SqlDataAdapter sqlDA = new SqlDataAdapter(); sqlDA.SelectCommand = BuildQueryCommand(connection, storedProcName, parameters); sqlDA.SelectCommand.CommandTimeout = Times; sqlDA.Fill(dataSet, tableName); connection.Close(); return dataSet; / / 构建 SqlCommand 对象(用来返回一个结果集,而不是一个整数值) / / 数据库连接 / 存储过程名 / 存储过程参数 / SqlCommand private static SqlCommand BuildQueryCommand(SqlConnection connection, string storedProcName, IDataParameter parameters) SqlCommand command = new SqlCommand(storedProcName, connection); command.CommandType = CommandType.StoredProcedure; foreach (SqlParameter parameter in parameters) if (parameter != null) / 检查未分配值的输出参数,将其分配以DBNull.Value. if (parameter.Direction = ParameterDirection.InputOutput | parameter.Direction = ParameterDirection.Input) & (parameter.Value = null) parameter.Value = DBNull.Value; command.Parameters.Add(parameter); return command; / / 执行存储过程,返回Output输出参数值 / / 存储过程名 / 存储过程参数 / object public static object RunProcedure(string storedProcName, IDataParameter paramenters) using (SqlConnection connection = new SqlConnection(connectionString) connection.Open(); SqlCommand command = BuildQueryCommand(connection, storedProcName, paramenters); command.ExecuteNonQuery(); object obj=command.ParametersOutput_Value.Value; /Output_Value和具体的存储过程参数对应 if (Object.Equals(obj, null) | (Object.Equals(obj, System.DBNull.Value) return null; else return obj; / / 执行存储过程,返回影响的行数 / / 存储过程名 / 存储过程参数 / 影响的行数 / public static int RunProcedure(string storedProcName, IDataParameter parameters, out int rowsAffected) using (SqlConnection connection = new SqlConnection(connectionSt
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025版市政公用设施施工总承包合同示范文本(含公共安全)
- 2025车库租赁与智能充电设施建设合作协议
- 2025版雇主责任赔偿和解协议书
- 2025年度智能硬件供应商返点合作协议书下载
- 2025版水上乐园儿童游乐设施定制合作协议
- 2025标准托盘租赁与智慧物流服务合同
- 2025版外墙真石漆施工与质量追溯合同
- 2025垫资建设资金合作合同模板
- 2025年新能源汽车动力电池碳足迹评估与减排策略报告
- 2025版跨区域建筑工程材料采购合同样本
- 2025年吉林省中考语文真题(含答案)
- 2025高级会计师考试试题及答案
- 工地建筑钢板租赁合同范本
- 光传输业务配置课件
- 2025年辽宁省地质勘探矿业集团有限责任公司校园招聘笔试备考题库带答案详解
- 2025年青海辅警招聘考试题及答案
- 2025新外研版初中英语八年级上全册课文原文翻译
- 钢结构安装安全操作规程
- 流程优化活动方案
- 消防装备认识课件
- 2025年山西中考道德与法治真题解读及答案讲评课件
评论
0/150
提交评论