你insert时不要往indentity列里insert了,他会自动insert的

解决方案 »

  1.   

    产生这种问题的原因是这样的,其实自增子段在插入一个新的纪录时自动的生成一个值,可是这个值不会自动的反映到应用程序中,甚至是SQLServer的企业管理器,插入新纪录后,你的应用程序不知道这个自增字段已经有值了,在更新其他字段时,Delphi默认的设置是根据所有的字段来定位一个记录,或者可能你已经设置了用这个字段来定位一个记录,这样Delphi定位时并更新时就不会正确了,就会有
    key violation
    [microsft][odbc aql serer driver][sql server]
    这样的错误,如果允许其他字段为空,那么你可以在插入一个字段后,刷新一下数据集,这样,自增字段的值就会反映到程序中来了。最好的做法是,不要使用自增字段,而让你的应用程序来控制,使这个字段的值唯一,要使这个字段唯一,你可以使用GUID的类型,并且在应用程序中生成新的GUID,生成新的唯一的GUID你可以使用CoCreateGuid这个函数(Win32)。或者你可以用一个存储过程来做插入纪录的动作,而应用程序不干预,不过这种做法其实适合于早期的没有人机交互的批处理的方式,在现代应用软件中很讲究人机交互,所以这种做法并不适合。
      

  2.   

    补充:在上面我说的用存储过程的方法,你可以让存储过程返回这个自动增长字段的值,要返回这个值需要一些技巧,你可参考SQLServer的帮助(上帝保佑你用的是中文版),其中有一部分篇幅是关于如何在存储过程中获取改变了得字段的值的讨论。你的应用程序获得了这个值以后,可以在DataSetProvider元件的AfterUpdateRecord事件中,将返回的新值付给DeltaDS.FieldByName('你的字段的名称').NewValuw,并且设置DataSetProvider元件中Options中的poPropogateChanges为True,这样新的值就可以返回给客户端了。
      

  3.   

    应该可以
    你post后看看会增加吗