存储过程默认值
时间:2020-03-06 14:56:52 来源:igfitidea点击:
我是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而不是""。
当我尝试通过CI执行此过程时,出现一条错误,该错误指的是期望但没有提供描述的事实。当这样调用时:
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(); }