我在做一个"课程设置"模块时,用到了数据集缓存技术,在提交到数据库按钮的运行中出现以下错误提示:
Key violation.
[Microsoft][ODBC SQL Server Driver][SQL Server]当IDENTITY_INSERT设置为OFF时,不能向表course中的标识列插入显式值.
可是我根本就找不到IDENTITY_INSERT这个值啊,这个提示应该如何解决啊?
其中用到的部分代码如下:
procedure TF_course.FormCreate(Sender: TObject);
begin
   Tabcourse.CachedUpdates  :=true;   
end;procedure TF_course.BtnsavtosrvClick(Sender: TObject);
begin
    Tabcourse.ApplyUpdates ;       //提交到数据库
end;
其他诸如修改、删除之类的代码在此就略去了。

解决方案 »

  1.   

    你的表有主键,而你插入的数据的主键有重复,就会出现Key violation.
    解决方法:
    1.删除表主键
    2.检查输入数据(不能插入主键相同的记录)
      

  2.   

    看看你的主键,然后添加记录前,对主键进行判断,看看是否有重复的信息录入。
    例如你的主键是userId,表名是tablename,那么可以这么作,
    with adoquery1 do
    begin
      close;
      sql.clear; 
      sql.add('select * from tablename where userid=:#userid');
      Parameters.ParamByName('#userid').value := edit1.text;
      open;
      if recordcount = 0 then
      begin
        //添加操作。
      end else showmessage('此记录已存在');
    end;
      

  3.   

    我插入的数据没有和主键相同的记录啊,提示说"当IDENTITY_INSERT设置为OFF时,不能向表course中的标识列插入显式值.",可我根本就找不到IDENTITY_INSERT这个值!
      

  4.   

    你的表中,有一个字段是IDENTITY(自增类型的), 当你POST的时候,对这个字段赋值,所以报这个错.
      

  5.   

    表结构如下:
    字段名称 数据类型 字段属性
    字段大小 作用 必填字段 索引 是否主键
    ID INT 4 自增长 是 有(无重复) 是
    COURSENO CHAR 6 课程代码 是 有(无重复)
    NAME VARCHAR 30 课程名称 是 无
    TEACHERNO CHAR 4 教师代码 是 无
    CREDIT INT 学分 是 无
    SELECTNUM INT 30 选课人数 否 无
    NOTE VARCHAR 50 备注信息 否 无
    我在添加记录后,点保存时,提示我ID必须要输入,输入ID后,“提交到数据库”,就报出上述错误了。整个模块的代码如下:
    unit course;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ComCtrls, DB, DBTables, ExtCtrls, DBCtrls, StdCtrls, Mask,
      Grids, DBGrids, ADODB;type
      TF_course = class(TForm)
        TreeView1: TTreeView;
        Label2: TLabel;
        Label3: TLabel;
        Label5: TLabel;
        Label6: TLabel;
        DBGrid1: TDBGrid;
        DBEdit2: TDBEdit;
        DBEdit3: TDBEdit;
        DBEdit4: TDBEdit;
        DBEdit5: TDBEdit;
        DataSource1: TDataSource;
        Label1: TLabel;
        DBEdit1: TDBEdit;
        Tabcourse: TTable;
        TabcourseID: TIntegerField;
        Tabcoursecourseno: TStringField;
        Tabcoursename: TStringField;
        Tabcourseteacherno: TStringField;
        Tabcoursecredit: TIntegerField;
        Tabcourseselectnum: TIntegerField;
        Btnadd: TButton;
        Btndlt: TButton;
        Btnedt: TButton;
        Btnsav: TButton;
        Btnsavtosrv: TButton;
        ADOQuery1: TADOQuery;
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure TreeView1DblClick(Sender: TObject);
        procedure BtnaddClick(Sender: TObject);
        procedure BtndltClick(Sender: TObject);
        procedure BtnedtClick(Sender: TObject);
        procedure BtnsavClick(Sender: TObject);
        procedure BtnsavtosrvClick(Sender: TObject);
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      F_course: TF_course;implementation{$R *.dfm}procedure TF_course.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      Action := caFree;
    end;procedure TF_course.TreeView1DblClick(Sender: TObject);
    begin   if TreeView1.Selected.Text='信息系' then
       begin
       Tabcourse.Filter :='courseno = ''xin*''';
       Tabcourse.Filtered :=true;
       end
       else if  TreeView1.Selected.Text='计算机系' then
       begin
       Tabcourse.Filter :='courseno = ''jsj*''';
       Tabcourse.Filtered :=true;
       end
       else if  TreeView1.Selected.Text='管理系' then
       begin
       Tabcourse.Filter :='courseno = ''gli*''';
       Tabcourse.Filtered :=true;
       end
       else
       Tabcourse.Filtered :=false;  // table1.Active :=false ;
       //table1.Active :=true ;
    end;procedure TF_course.BtnaddClick(Sender: TObject);
    begin
        Tabcourse.Append ;
    end;procedure TF_course.BtndltClick(Sender: TObject);
    begin
        if MessageDlg('是否确定要删除信息?',
        mtConfirmation, [mbYes, mbNo], 0) = mrYes then
        Tabcourse.Delete  ;
    end;procedure TF_course.BtnedtClick(Sender: TObject);
    begin
         Tabcourse.edit  ;
    end;procedure TF_course.BtnsavClick(Sender: TObject);
    begin
       Tabcourse.post  ;
    end;procedure TF_course.BtnsavtosrvClick(Sender: TObject);
    begin
        Tabcourse.ApplyUpdates        //提交到数据库
    end;procedure TF_course.FormCreate(Sender: TObject);
    begin   Tabcourse.CachedUpdates  :=true;   
    end;end.
    求高手指教!谢谢了!
      

  6.   

    我在添加记录后,点保存时,提示我ID必须要输入,输入ID后,“提交到数据库”,就报出上述错误了。可对于ID这种自增型的变量是不是不应该赋值啊,这不是与必须输入ID的提示信息相矛盾了吗?
      

  7.   

    是啊,可是我如果不赋值,一点保存,系统就提示我错误信息:
    检测到错误类EDatabaseError,错误信息:'Field'ID" must have a value'. 进程中止
      

  8.   

    建议:把你的自增长类型改为int,然后手动赋值。
      

  9.   

    我的表结构已经在上边贴出来了,类型就是int型的啊,还有代码也在上边了
      

  10.   

    是不是你的TabcourseID的Required属性被设置为true了?