Sql server 塔多克利邮报:“;无法使用null“更新不可为null的列;关于标识列

Sql server 塔多克利邮报:“;无法使用null“更新不可为null的列;关于标识列,sql-server,delphi,post,ado,identity,Sql Server,Delphi,Post,Ado,Identity,我试图在遗留的delphi项目中使用MS SQL Server的TAdoquery。 数据集包含一个表示SQL表中标识列的字段。它有AutogenerateValue=arAutoInc和ProviderFlags[pfInWhere,pfInKey]。它还有Required=false 执行adquery.AppendI预填充字段后,尝试执行adquery.Post,但出现以下错误: 不可为Null的列无法更新为Null 所有不可为空的字段在post之前都设置为非空,因此标识列是唯一可疑的字段

我试图在遗留的delphi项目中使用MS SQL Server的TAdoquery。 数据集包含一个表示SQL表中标识列的字段。它有
AutogenerateValue=arAutoInc
和ProviderFlags
[pfInWhere,pfInKey]
。它还有
Required=false

执行
adquery.Append
I预填充字段后,尝试执行
adquery.Post
,但出现以下错误:
不可为Null的列无法更新为Null

所有不可为空的字段在post之前都设置为非空,因此标识列是唯一可疑的字段。TADOQuery没有联接(从my_表中简单选择*),但它有查找字段和计算字段,这些字段可能为空。对于查找字段和计算字段,我删除了提供程序标志,以确保这些字段不会出现在insert或update语句中

在post之前,identity字段为NULL,我在探查器中没有看到服务器上触发insert命令,我只是得到了这个错误

  • 是否可以预览Tadoquery生成的sql语句以插入新行
      我解决了这个问题,这个问题当然与身份栏无关。 最初的sql是
      select*fromMyTable
      ,这意味着它还加载了一些额外的列,这些列没有绑定到我的DBGridEh中的任何网格列。
      将*替换为我需要的列的显式列表后,插入工作正常。

      与其尝试预览TAdoQuery生成的Sql,不如使用MS Sql server的探查器工具查看实际发送到服务器的Sql,因为MDac层经常将您期望的简单的INSERT/SELECT/UPDATE语句转换为对该层创建的临时参数化存储过程的调用。标识字段是只读的吗?感谢MartynA,问题是Profiler根本不显示任何内容。似乎在我点击
      post
      (我选择了“所有事件”,但仍然没有任何内容)Uwe,yes identity字段是readonly@user3243551您是否检查过,当您的项目执行SELECT或UPDATE时,您可以在探查器中看到发生的任何事情?