在我的Create方法中,我正在对INSERT INTOSQL Server数据库使用存储过程。有时,诸如之类的字段Comment将留空。但是,它不符合我的期望。
首先,这是我的方法的样子:
using (SqlConnection connection = new SqlConnection(connectionString))
{
string sql = "CreateTask";
using (SqlCommand command = new SqlCommand(sql, connection))
{
command.CommandType = CommandType.StoredProcedure;
.....................
parameter = new SqlParameter
{
ParameterName = "@Condition",
Value = task.Condition,
SqlDbType = SqlDbType.NVarChar
};
command.Parameters.Add(parameter);
.....................
当task.Condition为null时,command.ExecuteNonQuery();出现以下错误:
:'过程或函数'CreateTask'需要参数'@Condition',但未提供。
但是,表中的列设置为允许空值。
存储过程也如下所示:
ALTER PROCEDURE [dbo].[CreateTask]
@Name NVARCHAR(50),
@IsGate BIT,
@Condition Varchar(450),
@Precondition Varchar(450),
@Comments Varchar(450),
@StartDate DateTime,
@EndDate DateTime,
@AssignedTo Nvarchar(450),
@PhaseId int
AS
BEGIN
Insert Into dbo.Tasks (Name, IsGate, Condition, Precondition, Comments, StartDate, EndDate, AssignedTo, PhaseId, InProgress, Finished, Aborted) Values (@Name, @IsGate, @Condition, @Precondition, @Comments, @StartDate, @EndDate, @AssignedTo, @PhaseId, '0', '0', '0')
END
因此,我应该进行哪些调整才能使存储过程获得空值?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在C#代码中,当task.Condition
为null时,你直接将null值赋给了SqlParameter的Value属性,这在SQL Server存储过程中可能会导致问题,因为数据库层可能期望一个明确的空值(DBNull.Value)而不是.NET中的null。要解决这个问题,你需要在添加参数值时检查是否为null,并相应地分配DBNull.Value。修改你的参数赋值部分如下:
parameter = new SqlParameter
{
ParameterName = "@Condition",
SqlDbType = SqlDbType.NVarChar,
Size = 450 // 指定大小以匹配存储过程定义,可选,取决于你的需求
};
if (task.Condition != null)
{
parameter.Value = task.Condition;
}
else
{
parameter.Value = DBNull.Value; // 当task.Condition为null时,使用DBNull.Value
}
command.Parameters.Add(parameter);
这样,当task.Condition
为null时,存储过程将会接收到一个DBNull.Value,这与数据库中的NULL值相对应,符合你的需求。