存储过程默认值
问题描述:
当谈到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。我只是用那些遍历我指定参数和使用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();
}
容易,只需设置的CommandType到存储过程和CommandText中为 “insert_test_result”,虽然。 – 2008-09-30 21:09:40