开发者社区 问答 正文

将空参数传递给存储过程

在我的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

因此,我应该进行哪些调整才能使存储过程获得空值?

展开
收起
心有灵_夕 2019-12-22 14:13:44 667 分享 版权
阿里云 AI 助理回答

在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值相对应,符合你的需求。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答