我用DBEXPRESS+SQLSERVER时候遇见一个问题
SQLSERVER表中有字段ID是自增长字段也是非空主键
用SIMPEDATASET.insert以后报错不能插入NULL字段
这个问题用ADO控件没问题 为什么DBEXPRESSS会不识别自增长字段?

解决方案 »

  1.   

    我只能根据我使用INTERBASE的经验给你一些提示。IB没有自增长字段,是通过生成子+触发器的方法实现Auto Increment字段的。SQL Server虽然有自增字段,但是内在的处理机制应该同上。这样的问题在于,如果不使用SQL语言进行插入,而使用数据库控件,那么触发器是不会被触发的。
      

  2.   

    所以,你要么直接用SQL来完成数据插入;要么对表进行AfterInsert/BeforePost的事件处理。
      

  3.   

    那为什么用ADO的控件没这个问题?
      

  4.   

    是啊!~ 可怎么解决这个问题拉?SIMPLEDATASET不识别自增长字段啊!
      

  5.   

    我已经说了呀:所以,你要么直接用SQL来完成数据插入;要么对表进行AfterInsert/BeforePost的事件处理。
      

  6.   

    能说具体点么?
    AfterInsert/BeforePost 如何处理自增长字段?
      

  7.   

    给你个例子吧。//建立生成子并赋初值为0
    CREATE GENERATOR GENRECORDID;
    SET GENERATOR GENRECORDID TO 0;
    …//创建存储过程
    CREATE PROCEDURE GETRECORDID RETURNS (
      detailid INTEGER
    ) AS  BEGIN
    detailid=gen_id(genrecordid, 1);
    END;
      

  8.   

    在程序中,要开始使用已经定义好的生成子和存储过程,我们必须在窗体或数据模块中放一个IBStoredProc控件并将其与数据库相连,然后选择在数据库中定义的存储过程。
    我们假定我们使用一个名称为DetailTbl的表,并且该表中设置了永久字段,那么典型的代码段如下:
    void __fastcall TDMForm::DetailTblAfterInsert(TDataSet *DataSet)
    {
        DetailTblDETAILID->Value=0;
    }
    //---------------------------------------------------------void __fastcall TDMForm::DetailTblBeforePost(TDataSet *DataSet)
    {
        if(DetailDS->State==dsInsert)
        {
             DetailIDSP->Prepare();
             DetailIDSP->ExecProc();
            DetailTblDETAILID->AsInteger=DetailIDSP->
    ParamByName("detailid")->AsInteger;
        }
    }
      

  9.   

    这个问题不是Acquarius(二当家)所说的原因,我想应该是DbExpress的BUG,通过DBEXpress取得的数据集不认识自增长数据类型,把它作为普通的int类型处理,如果你把自增长字段设置为主键,那就更可怕了。
      

  10.   

    其实使用bde时也有这样类似的问题,害的我只能自己来完成id的创建
      

  11.   

    DBEXPRESS对自增字段的问题解决的不好,建议不要使用自增字段
      

  12.   

    是这样的是DBEXPRESS的BUG 不识别自增长字段