C#中如何执行存储过程方法
功能 : 根据调用的方法名称 反射动态调用 sql command 的方法
/// <summary>
/// 存储过程的属性
/// procname 存储过程的名称
/// methodname 执行sqlcommand 方法的名称
/// prmlist 存储过程的参数
/// </summary>
public class exeproc
{
public string procname;
public string methodname;
public object[] prmvalue;
}
根据制定的存储过程的名称
和参数 来执行指定的存储过程 和 调用 sqlcommand 的方法
public class datahelper
{
private string connstring = null;
public datahelper(string constr)
{
this.connstring = constr;
}
/// <summary>
/// 执行存储过程
/// </summary>
/// <param name="ep">执行存储过程的属性
/// procname 存储过程的名称
/// methodname 执行sqlcommand 方法的名称
/// prmlist 存储过程的参数
/// </param>
/// <returns>返回执行的结果</returns>
public object execprocretobj(exeproc ep)
{
if (this.connstring != null && this.connstring != string.empty)
{
try
{
sqlconnection con = new sqlconnection(this.connstring);
sqlcommand cmd = new sqlcommand();
cmd.connection = con;
cmd.commandtext = "exec " + ep.procname + " ";
foreach (object obj in ep.prmvalue)
{
cmd.commandtext += obj + ",";
}
cmd.commandtext = cmd.commandtext.remove(cmd.commandtext.length - 1, 1);
type ty = cmd.gettype();
con.open();
//用反射根据输入的方法名 执行对应的方法
object retobj = ty.invokemember(ep.methodname, bindingflags.invokemethod, null, cmd, null);
if (retobj.gettype().fullname == "system.data.sqlclient.sqldatareader")
{
//将返回的object 转换成datatable
datatable retdt = new datatable();
retdt.load(retobj as sqldatareader);
con.close();
con.dispose();
return retdt;
}
return retobj;
}
catch (exception ex)
{
system.windows.forms.messagebox.show("获取数据发生错误\n" + ex.message);
}
}
return null;
}
}