SqlException:无法将值 NULL 插入列“x”;列不允许空值。插入失败
Posted
技术标签:
【中文标题】SqlException:无法将值 NULL 插入列“x”;列不允许空值。插入失败【英文标题】:SqlException: Cannot insert the value NULL into column 'x'; column does not allow nulls. INSERT fails 【发布时间】:2017-10-31 01:33:18 【问题描述】:当我使用 NHibernate 执行我的“小”程序时收到此消息
SqlException: Cannot insert the value NULL into column 'EmployeeId', table 'NHibernateDemoDB.dbo.Employee'; column does not allow nulls. INSERT fails.
我的方法是:
private void SetEmployeeInfo(Employee employeeData)
employeeData.FirstName = txtFirstName.Text;
employeeData.LastName = txtLastName.Text;
还有我的映射文件:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" auto-import="true" namespace="NHibernateWinFormsApp" assembly="NHibernateWinFormsApp">
<class name="NHibernateWinFormsApp.Employee, NHibernateWinFormsApp" lazy="true">
<id name="EmployeeId">
<generator class="native"/>
</id>
<property name="FirstName" column="FirstName"/>
<property name="LastName" column="LastName"/>
</class>
</hibernate-mapping>
请问有人有想法吗? 谢谢,
【问题讨论】:
列 X 需要一个值,而您还没有传递一个值。什么是 X 列? 信息很清楚 我有一个想法!它希望EmployeeId
的值不为空。我赢了什么,一把锤子?
@user7879148 如果它不允许空值,试着想象你可以给它什么其他值。有没有一种不是null
值的值?也许有。也许这就是它想要的价值。试一试,你会失去什么?
如果它是表的主键并且不允许空值并且不会自动生成值,那么我的第一个猜测是值在另一个表中,或者表应该设置为自动生成值...这是您创建的表吗?查看IDENTITY 属性
【参考方案1】:
您的数据库表中的列定义肯定是错误的,缺少identity
规范。
由于您已将 id 映射到生成器 native
,它解析为 sql-server 的 identity
,NHibernate 尝试插入实体而不为 Id EmployeeId
指定值,因为它应该是自动的- 由数据库插入时生成。
由于此时它失败了,这意味着您的表定义无效,它没有将EmployeeId
设置为Identity
列,导致它在插入时不会自动生成,因此缺少值。
您必须在数据库中的表上修复列定义。
否则,为您的 id 选择另一个 generator strategy,与您的数据库架构兼容。
【讨论】:
是的,它是自动增量。而已!问题解决了。谢谢大家!【参考方案2】:该列不允许为空。如消息错误所述。
获取空值时需要指定一个值。使用 ISNULL 函数。
【讨论】:
这是一个 NHibernate 映射实体,其 id 的生成器不是assigned
。 NHibernate 不会让用户指定它的值。
嗯,明白了。不知道这个以上是关于SqlException:无法将值 NULL 插入列“x”;列不允许空值。插入失败的主要内容,如果未能解决你的问题,请参考以下文章
无法将值 NULL 插入列 - 如何强制标识增加? [关闭]