Значение по умолчанию для хранимой процедуры - PullRequest
3 голосов
/ 01 октября 2008

Я новичок, когда дело доходит до 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();
        }

Ответы [ 3 ]

11 голосов
/ 01 октября 2008

Лучшим подходом было бы изменить 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 голосов
/ 04 октября 2008

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();
}
0 голосов
/ 01 октября 2008

Если вы не используете именованные параметры, 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...