谈到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(); }
Marc Gravell.. 11
更好的方法是将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指定值与使其采用默认值不同.如果要使用默认值,请不要在命令中包含该参数.
更好的方法是将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指定值与使其采用默认值不同.如果要使用默认值,请不要在命令中包含该参数.