如何使用C#动态地将参数传递给存储过程?
例如,我有一个名为Person
的表,其中包含Name
,City
,Zipcode
等列。
所以代码是:
cmd.Parameters.Add("@Name", SqlDbType.varchar);
cmd.Parameters.Add("@City", SqlDbType.varchar);
cmd.Parameters.Add("@Zipcode", SqlDbType.varchar);
现在我要添加两列,让我们说State
和Country
。
所以代码现在是:
cmd.Parameters.Add("@Name", SqlDbType.varchar);
cmd.Parameters.Add("@City", SqlDbType.varchar);
cmd.Parameters.Add("@Zipcode", SqlDbType.varchar);
cmd.Parameters.Add("@State", SqlDbType.varchar);
cmd.Parameters.Add("@Country", SqlDbType.varchar);
还有更好的办法吗?
编辑:
在线搜索后,我想出了以下解决方案
aspx.cs文件后面的:
词典dicPersonHash =新词典();
dicPersonHash .Add("@Name", txtName.Text);
dicPersonHash .Add("@City", txtCity.Text);
dicPersonHash .Add("@Zipcode", txtZipcode.Text);
dicPersonHash .Add("@State", txtState.Text);
dicPersonHash .Add("@Country", txtName.Text);
dicPersonHash.Add("@returnID", null);
dicPersonHash .Add("mode", "Insert");
dicPersonHash .Add("spName", "ManagePerson");
并且有一个名为clsDataAccess.cs的类,并且有一个名为ManageData的方法
public int ManageData(Dictionary<string, object> dicDataHash)
{
int i = 0;
string[] excludeKeyHash = { "mode", "spName" };
try
{
cn.Close();
cn.Open();
cmd = new SqlCommand(dicDataHash["spName"].ToString(), cn);
cmd.CommandType = CommandType.StoredProcedure;
foreach (KeyValuePair<string, object> kvp in dicDataHash)
{
if (!excludeKeyHash.Contains(kvp.Key))
{
if (kvp.Key == "@returnID")
{
cmd.Parameters.Add(kvp.Key, SqlDbType.Int).Direction = ParameterDirection.Output;
}
else
{
cmd.Parameters.AddWithValue(kvp.Key, kvp.Value);
}
}
}
i = cmd.ExecuteNonQuery();
if (dicDataHash["mode"] == "Insert")
{
i = Convert.ToInt32(cmd.Parameters["@returnID"].Value.ToString());
}
}
catch (Exception ex)
{
throw ex;
i = -1;
}
finally
{
cn.Close();
}
return i;
}
这些怎么样?有没有更好的方法来做这些?请给我这些评论/建议