C#sqlserver存储过程参数

时间:2014-02-18 19:55:36

标签: c# sql-server stored-procedures

我有一个包含更新语句的存储过程。它需要3个参数:ID,状态,日期

我写了一个C#程序来调用这个程序。如果状态为-1,我希望表中的日期为空,如果状态为1,则日期应为当前日期。

Int32 rowsAffected = 0;
string datenow =null;

using (SqlConnection connection = new    SqlConnection(ConfigurationManager.ConnectionStrings["SQLConnectionString"].ConnectionString))
{
    connection.Open();
    SqlCommand cmd = new SqlCommand(
        "usp_UpdateProc", connection);

    cmd.CommandType = CommandType.StoredProcedure;
    cmd.Parameters.Add("@status", SqlDbType.Int);
    cmd.Parameters["@status"].Value = status;
    if(status != 1)
        datenow = DateTime.Now.ToString(@"MM\/dd\/yyyy h\:mm tt");

    cmd.Parameters.AddWithValue("@datenow", @datenow);
    cmd.Parameters.Add(
        new SqlParameter("@ID", @ID));

    try
    {
        rowsAffected = cmd.ExecuteNonQuery();
    }
    catch (Exception ep)
    {  //throw ep
    }

当我这样做时,状态和日期字段都是数据库中的空值。我不确定为什么会这样? 谢谢 Rashmi

2 个答案:

答案 0 :(得分:1)

我会尝试分配这样的值,看看它是否有所作为:

SqlParameter stat = cmd.Parameters.AddWithValue("@status" ,status);
stat.dbType = SqlDbType.Int;

DateTime? dt = (status == -1)? null : DateTime.Now;

SqlParameter dateParam = cmd.Parameters.AddWithValues("@datenow", dt ?? DBNull.Value);
dateParam.dbType = SqlDbType.DateTime;

答案 1 :(得分:1)

我在您的代码中看到了一些问题:

  • 测试错误,需要修复,因此如果状态为-1,则将NULL用作@datenow值
  • 我不确定以字符串形式传递的DateNow。你用什么不使用原生的.NET DateTime值?
  • 结果在很大程度上取决于存储过程的实现方式。

请不要放置空的尝试/捕获并显示异常,以便您可以更好地查看出现了什么问题。

我建议:

SqlCommand cmd = new SqlCommand("usp_UpdateProc", connection);
cmd.CommandType = CommandType.StoredProcedure;

cmd.Parameters.AddWithValue("@status", status);
if(status == -1)
    cmd.Parameters.AddWithValue("@datenow", DBNull.Value);
else
    cmd.Parameters.AddWithValue("@datenow", DateTime.Now.ToString(@"MM\/dd\/yyyy h\:mm tt"));

cmd.Parameters.AddWithValue("@ID", @ID);

try
{
    rowsAffected = cmd.ExecuteNonQuery();
}
catch (Exception ep)
{ 
    MessageBox.Show(ep.ToString());
}