【问题标题】:Cannot insert the value "Null" into column 'xyz'无法将值“Null”插入“xyz”列
【发布时间】:2014-08-22 11:36:57
【问题描述】:

我在将新患者添加到我的 SQL 数据库时遇到问题。当我这样做时,会出现以下错误,并引发 SQL 异常。

无法将值 NULL 插入到列“ID”、表“IntelliMedDB.dbo.PatientRecord”中;列不允许空值。插入失败。

作为参数添加的所有值中包含的信息实际上不为空。它们里面都有信息。

现在,为了防止 SQL 注入攻击,我的所有查询都使用参数化值。

我有一个 MS Access 数据库,可以很好地处理所有这些问题(同样的查询,我刚刚从使用 OleDBCommand 切换到 SqlCommand。除此之外,没有任何变化)。

这是“INSERT INTO”语句,后面跟着一个参数化查询,这样大家就可以看到我做了什么:

INSERT INTO PatientRecord (patientID, firstName, lastName, patientGender, dateOfBirth, residentialAddress, postalAddress, nationalHealthNumber, telephoneNumber, cellphoneNumber) 
                   VALUES (@patientIDNumber, @recepPatFirstName, @recepPatLastName, @recepPatGender,  @recepPatDateOfBirth, @recepPatResidentialAddress, @recepPatPostalAddress, @recepNHINumber, @recepPatTelephone, @recepPatCellularNumber)";

(对于查询的长度,我深表歉意)。

现在,参数化值之一:

recepPatRecordCommand.Parameters.AddWithValue("@recepPatFirstName", patRecepFirstName);

感谢您的帮助。

谢谢!

【问题讨论】:

  • 此程序是否用于创建新患者?如果是这样,您不太可能想要传递patientID。单步执行你的代码,插入前patientID的值是多少?
  • 如果存在recepPatRecordCommand.Parameters.AddWithValue("@patientID",..... 行,您可以显示吗?或者,您可以将PatientID 设置为表中的主键索引吗?那会更有意义。
  • 您的表有一个名为 ID 的列,该列可能是主键。检查是否在列属性中设置了 IDENTITY = Yes
  • 嗨,史蒂夫,我正在运行 SQL Server 2014。请给我一些有关如何执行此操作的说明吗? @Jason Evans ID 是 Access 用来跟踪数据库中有多少记录的自动编号。患者 ID 用于实际的患者记录(阻止 ID 到处乱跑)。
  • @DGibbs 一旦用户选择“新患者”选项,就会分配“患者ID”,因此该参数已经包含一个值。这是必要的,这样用户才能在屏幕上实际显示特定的 ID 记录(我通过使用阅读器来做到这一点)。

标签: c# sql


【解决方案1】:

您应该使用您正在使用的表和数据库的定义来编辑您的问题。

但是,问题很明显。 PatientRecord 表有一个名为id 的列,它被声明为NOT NULL。这意味着 NULL 值是不允许的——你会看到你看到的错误。通过不在insert 中显式设置值,该值被设置为默认值。没有默认值,值设置为NULL

通常,此类列具有默认值或声明为identity(或自动递增)。

我认为您可能应该修复表格,以便 NOT NULL 列具有默认值。或者,为id 列输入适当的值。为此,您需要将id 添加到列列表中,然后在值列表中添加相应的值。

【讨论】:

    【解决方案2】:

    虽然您的INSERT 语句引用了patientId,但您看到的错误消息引用了ID

    您看到此错误是因为未指定 ID 的值。

    【讨论】:

      【解决方案3】:
      Open your table in Design
      Select your column and go to Column Properties
      Under Indentity Specification, set (Is Identity)=Yes and Indentity Increment=1
      

      【讨论】:

      • 我假设 id 应该是一个递增值。
      • 是的,它是一个“自动编号”值。
      猜你喜欢
      • 1970-01-01
      • 2013-02-27
      • 2021-10-31
      • 2012-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多