2008-09-30 2 views
3

Я новичок, когда дело доходит до SQL. При создании хранимой процедуры с параметрами как таковыми:Сохраненная процедура Значение по умолчанию

@executed   bit, 
@failure   bit, 
@success   bit, 
@testID    int, 
    @time    float = 0, 
@name    varchar(200) = '', 
@description  varchar(200) = '', 
@executionDateTime nvarchar(max) = '', 
@message   nvarchar(max) = '' 

Это правильная форма для значений по умолчанию в T-SQL? Я попытался использовать NULL вместо ''.

Когда я попытался выполнить эту процедуру с помощью C#, я получил ошибку, ссылаясь на то, что описание ожидается, но не указано. При называя это вот так:

 cmd.Parameters["@description"].Value = result.Description; 

результат. Если это не по умолчанию значение NULL (хорошо «в моем случае прямо сейчас») в SQL?

Вот вызова команды:

 cmd.CommandText = "EXEC [dbo].insert_test_result @executed, 
          @failure, @success, @testID, @time, @name, 
          @description, @executionDateTime, @message;"; 

     ... 
     cmd.Parameters.Add("@description", SqlDbType.VarChar); 
     cmd.Parameters.Add("@executionDateTime", SqlDbType.VarChar); 
     cmd.Parameters.Add("@message", SqlDbType.VarChar); 

     cmd.Parameters["@name"].Value = result.Name; 
     cmd.Parameters["@description"].Value = result.Description; 
     ... 

     try 
     { 
      connection.Open(); 
      cmd.ExecuteNonQuery(); 
     } 
     ... 
     finally 
     { 
      connection.Close(); 
     } 

ответ

11

Лучше было бы изменить CommandText только название SP, и CommandType к StoredProcedure - то параметры будут работать намного более аккуратно:

cmd.CommandText = "insert_test_result"; 
cmd.CommandType = CommandType.StoredProcedure; 

Это также позволяет упростить прохождение по имени, а не по положению.

В общем, ADO.NET хочет DBNull.Value, а не null. Я просто использовать удобный метод, который перебирает мои аргументы и заменяет любые аннулирует с DBNull.Value - так просто, как (в упаковке):

foreach (IDataParameter param in command.Parameters) 
    { 
     if (param.Value == null) param.Value = DBNull.Value; 
    } 

Однако! Указание значения с нулевым значением отличается от того, чтобы позволить ему принять значение по умолчанию. Если вы хотите, чтобы он использовал значение по умолчанию, не включайте параметр в команду.

0

Если вы не используете именованные параметры, MSSQL принимает параметры в полученном порядке (по индексу). Я думаю, что есть опция для этого в CMD-объекте.

так что ваш SQL должен быть больше похож

EXEC [dbo].insert_test_result 
@executed = @executed, 
@failure = @failure, 
@success = @success, 
@testID = @testID, 
@time = @time, 
@name = @name, 
@description = @description, 
@executionDateTime = @executionDateTime, 
@message = @message; 
+0

Легче всего установить CommandType в SPROC и CommandText к "insert_test_result", хотя. – 2008-09-30 21:09:40

0

cmd.CommandText = "insert_test_result"; 
cmd.Parameters.Add(new SQLParameter("@description", result.Description)); 
cmd.Parameters.Add(new SQLParameter("@message", result.Message)); 
try 
{ 
    connection.Open(); 
    cmd.ExecuteNonQuery(); 
} 
finally 
{ 
    connection.Close(); 
} 
Смежные вопросы