繁体   English   中英

存储过程默认值

[英]Stored Procedure Default Value

谈到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;

result.Description为null。 在SQL中,这不应该默认为NULL(在我的情况下是'')

这是调用命令:

        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();
        }

更好的方法是将CommandText更改为SP的名称,将CommandType更改为StoredProcedure - 然后参数将更加干净地工作:

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

这也允许更简单的通过名称,而不是位置。

通常,ADO.NET需要DBNull.Value,而不是null。 我只是使用一个方便的方法循环我的args并用DBNull.Value替换任何空值 - 就像(包装)一样简单:

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

然而! 使用null指定值与使其采用默认值不同。 如果要使用默认值,请不要在命令中包含该参数。

如果您没有使用命名参数,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;

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();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM