sql - 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 而不是通过代码设置默认值(并允许从代码传递空值)?
解决方案
不幸的是,这不是默认参数值的工作方式。默认值在参数未传递时应用,而不是在参数为空时应用。你有两个选择(我可以看到)。第一个是如果参数为空则不传递参数并保持存储过程不变(我已替换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
推荐阅读
- r - 如何计算拟二项式模型的 AIC?
- sqlite - Sqlite 如何在一个查询中从两个表中选择 sum()
- javascript - React Ref:对象数组的 Ref 函数仅记录第一项
- firebase-hosting - 尝试在托管 Web Flutter 应用程序的 Firebase 中部署
- c - 如何在c中重命名文件
- events - 点击传单标记
- python - 从 AWS Lambda 层导入 cffi python 模块时出错
- typescript - 根据变量输入键入回调函数
- google-bigquery - Google Cloud Data Fusion 将 Excel 提取到 Bigquery
- php - 传递参数的php soap调用问题