C#执行存储过程的简化-.NET教程,C#语言

  • 格式:doc
  • 大小:48.50 KB
  • 文档页数:9

下载文档原格式

  / 9
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

•C#执行存储过程的简化教程,C#语言

•来源:作者:发布时间:2007-12-26 10:42:08

•域名注册

o8年专业域名注册经验

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 object[]{loginid, erhostaddress, fileid});

由于在填充参数的时候必须要两个值,一个是参数的名字,一个是参数的值。参数值是由外部传入的,不用考虑;而参数名称是和存储过程相关的东西,应该能由存储过程名称来确定而不用每次调用的时候写上一遍。对于这个问题,如果能将存储过程的参数保存到一个全局的地方,那么在调用存储过程的时候只要能根据存储过程的名字去索引就能了。具体实现的时候我是将这些信息保存在数据库访问组件里面,采用名字/值对的方式。

代码如下:

public class infotable : nameobjectcollectionbase

{

public object this[string 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[])(procinfotable[procname]);

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 < paraminfo.length; ++i)

{

cmd.parameters.add(new sqlparameter(paraminfo[i], parms[i]));

}

sqlparameter parmsr = new sqlparameter("return", sqldbtype.int);

parmsr.direction = parameterdirection.returnvalue;

cmd.parameters.add(parmsr);

sqldataadapter adp = new sqldataadapter(cmd);

adp.fill(ds);

retvalue = (int)(cmd.parameters["return"].value);

}

catch (exception ex)

{

errorinfo.seterrorinfo(ex.message);

retvalue = -1;

}

if (!bopened)

close();

if (ds.tables.count > 0)

return ds.tables[0];

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

相关主题