首页 > 解决方案 > DBNull.Value 从代码传递时 sql 变量的默认值

问题描述

我正在使用在多个项目之间使用的服务。在此服务中,我们使用存储过程调用插入/更新 sql 表。从项目中,如果变量为空或 null,则应用程序应传递 db null 值,然后 sql 应将默认值设置为“N”。但是,这会引发无法插入空值的异常。

为参数赋值:

     cmd.Parameters.AddWithValue("@PP_Ref", IIf(String.IsNullOrEmpty(ParkingPermit), DBNull.Value, ParkingPermit))

这是在 sql 存储过程中设置变量的方式:

    ALTER PROCEDURE [dbo].[SP_SaveCustomer]
          @PP_Ref           char(1) = 'N',

收到的异常:

     {"Cannot insert the value NULL into column 'Cust_PP_Ind', table 'dbo.Customer'; 
      column does not allow nulls. INSERT fails." & vbCrLf & "The statement has been terminated."}

传递的变量将在插入和更新语句中填充“Cust_PP_Ind”(Cust_PP_Ind = @PP_Ref)。如何通过 sql 而不是通过代码设置默认值(并允许从代码传递空值)?

标签: sqlsql-server

解决方案


不幸的是,这不是默认参数值的工作方式。默认值在参数未传递时应用,而不是在参数为空时应用。你有两个选择(我可以看到)。第一个是如果参数为空则不传递参数并保持存储过程不变(我已替换AddWithValue为,Add因为它是更好的做法

if (!String.IsNullOrEmpty(ParkingPermit))
{
    cmd.Parameters.Add("@PP_Ref", SqlDbType.Char, 1).Value = ParkingPermit;
}

第二种方法是在程序主体内设置默认值,并保持调用代码不变:

ALTER PROCEDURE [dbo].[SP_SaveCustomer] @PP_Ref CHAR(1) = NULL
AS
BEGIN

    SET @PP_Ref = ISNULL(NULLIF(@PPRef, ''), 'N');
    --REST OF THE PROCEDURE
END

推荐阅读