从网上找了一个调了半天也没有出来,最后又翻了翻,算是出来了,原来那个有错......看来不经过亲自实验的代码还是不要贴了......
经修改为以下,试了试没有问题,贴出来喽.....
public class StoreProcedure
{
//存储过程名称。
private string _name;
//数据库连接字符串。
private string _conStr;
//构造函数
//sprocName: 存储过程名称;
//conStr: 数据库连接字符串。
public StoreProcedure(string sprocName, string conStr)
{
_conStr = conStr;
_name = sprocName;
}
//执行存储过程,不返回值。
//paraValues: 参数值列表。
//return: void
public void ExecuteNoQuery(params object[] paraValues)
{
using (SqlConnection con = new SqlConnection(_conStr))
{
SqlCommand comm = new SqlCommand(_name, con);
comm.CommandType = CommandType.StoredProcedure;
AddInParaValues(comm, paraValues);
con.Open();
int count = comm.ExecuteNonQuery();
con.Close();
}
}
// 执行存储过程返回一个表。
// paraValues: 参数值列表。
// return: DataTable
public DataTable ExecuteDataTable(params object[] paraValues)
{
SqlCommand comm = new SqlCommand(_name, new SqlConnection(_conStr));
comm.CommandType = CommandType.StoredProcedure;
AddInParaValues(comm, paraValues);
SqlDataAdapter sda = new SqlDataAdapter(comm);
DataTable dt = new DataTable();
sda.Fill(dt);
return dt;
}
// 执行存储过程,返回SqlDataReader对象,
// 在SqlDataReader对象关闭的同时,数据库连接自动关闭。
// paraValues: 要传递给给存储过程的参数值类表。
// return: SqlDataReader
public SqlDataReader ExecuteDataReader(params object[] paraValues)
{
SqlConnection con = new SqlConnection(_conStr);
SqlCommand comm = new SqlCommand(_name, con);
comm.CommandType = CommandType.StoredProcedure;
AddInParaValues(comm, paraValues);
con.Open();
return comm.ExecuteReader(CommandBehavior.CloseConnection);
}
// 获取存储过程的参数列表。这是最重要的一个过程,我调了半天才出来的......
private ArrayList GetParas()
{
//sp_sproc_columns为系统存储过程
//@procedure_name为其列名
SqlCommand comm = new SqlCommand("sp_sproc_columns", new SqlConnection(_conStr));
comm.CommandType = CommandType.StoredProcedure;
comm.Parameters.AddWithValue("@procedure_name", (object)_name);
SqlDataAdapter sda = new SqlDataAdapter(comm);
DataTable dt = new DataTable();
sda.Fill(dt);
sda.Dispose();
ArrayList al = new ArrayList();
for (int i = 1; i < dt.Rows.Count; i++)//记得从1开始算起
{
al.Add(dt.Rows[i][3].ToString());
}
return al;
}
// 为 SqlCommand 添加参数及赋值。
private void AddInParaValues(SqlCommand comm, params object[] paraValues)
{
comm.Parameters.Add(new SqlParameter("@RETURN_VALUE", SqlDbType.VarChar));
comm.Parameters["@RETURN_VALUE"].Direction = ParameterDirection.ReturnValue;
if (paraValues != null)
{
ArrayList al = GetParas();
for (int i = 0; i < paraValues.Length; i++)
{
//这是从i算起,注意啦......
comm.Parameters.AddWithValue(al[i].ToString(), paraValues[i]);
}
}
}
}
调用时:只列一个返回Table的
object[] para ={ 参数值1,参数值2,...... };
//类的实例
StoreProcedure store = new StoreProcedure("存储过程名称", "server=.;database=cspro;user id=sa;pwd=sa");
//执行带参数的存储过程
DataTable dt = store.ExecuteDataTable(para);
this.dataGridView1.DataSource = dt;