【问题标题】:Stored Procedure Default Value存储过程默认值
【发布时间】:2010-09-14 09:08:05
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    更好的方法是将 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;
        }
    

    但是!用 null 指定一个值与让它采用默认值是不同的。如果您希望它使用默认值,请不要在命令中包含参数。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 不过,更容易将 CommandType 设置为 SPROC,将 CommandText 设置为“insert_test_result”。
      【解决方案3】:
      
      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();
      }
      

      【讨论】:

        猜你喜欢
        • 2015-11-12
        • 2012-08-06
        • 2014-04-27
        • 2018-05-09
        • 1970-01-01
        • 1970-01-01
        • 2010-11-11
        • 1970-01-01
        • 2018-12-06
        相关资源
        最近更新 更多