下面的方法是我在实际开发中摸索出来的,可以在很大程度上简化调用存储过程的代码。
首先来看一下C#调用存储过程的一般过程:
1、打开数据库连接SqlConnection;
2、生成一个SqlCommand;
3、向命令对象填充参数;
4、执行存储过程;
5、关闭连接;
6、其他操作。
我这里讲的主要是简化第3步操作,最终在调用存储过程的时候只需要传递存储过程的名字和相应的参数值。调用示例如下:
dbAccess.run("p_am_deleteFile", new object[]{LoginId, Request.UserHostAddress, 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);
cmd.CommandType = 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






