c# - 存储过程默认值

标签 c# sql sql-server tsql stored-procedures

我是 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 为空。这不应该在 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 指定值不同于让它采用默认值。如果您希望它使用默认值,请不要在命令中包含该参数。

关于c# - 存储过程默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/155074/

相关文章:

带有 getter 的 Java For Each

c# - .Net EF 核心 DbContext.Save() 在多个异步功能期间

java - 使用sql在java中为用户帐户创建一个表

.net - .Net 2.0 Web 服务中的 SSPI 连接

c# - 在C#中获取调用方法的实例

c# - 如何使用 C# 删除 Excel 复制焦点

sql - 如何让 SSIS 查找转换忽略字母大小写?

c# - 继承数据库的最佳方式

mysql - 如何模拟外键到多个相似表的分布?

mysql - 选择计算 SQL 的正值/负值