2014-02-18 7 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 
    } 

Когда я делаю это, поля статуса и даты являются нулями в базе данных. Я не знаю, почему это происходит? Благодаря Рашми

+0

Я предполагаю @ во втором параметре cmd.Parameters.AddWithValue («@ datenow» ... опечатка – pquest

+5

"Я не знаю, почему это происходит? «возможно, не проглатывание исключения дало бы вам некоторое представление? –

+0

@pquest, что должно быть хорошо - вы можете добавить' @ 'в начало имени переменной aC# - он используется для использования зарезервированных слов в качестве имен переменных (например,' @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

Смежные вопросы