2014-02-18 140 views
1

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

我写了一个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

+0

我承担cmd.Parameters.AddWithValue的第二个参数@(“@ datenow” ...是一个错字 – pquest

+5

“我不知道为什么会这样? “也许不是吞咽异常会给你一些有识之士 –

+0

@pquest这应该是罚款 - 你可以添加一个'@'交流#变量名称的前面 - 这是用来将保留字作为变量名(如'@class ') –

回答

1

我看到你的代码中的一些问题:

  • 测试是错了,需要修复所以NULL作为@datenow值,如果状态为-1
  • 我不知道这是作为字符串传递的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()); 
} 
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; 
+2

我很抱歉:这会因为AddWithValues不支持.NET“null”参数而崩溃。我建议把.AddWithValues(“@ datenow,dt ?? DBNull.Value); – Larry

+0

啊,我的坏,编辑。 – pquest