我的完整程序是下面这样的,除了提示这个错误之外,还有我表中的数据,除了第一行插进去了,其他数据都没插进去,然后我那个需要插入数据的表的主键是_id,类型是GpGUID (uniqueidentifier),我做了一个自动更新插入GUID数据的程序,大家帮帮忙,看看这个程序应该怎么修改啊!~很着急,在线等!~~
unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, RzButton, ADODB, Provider, DBClient, DB, Grids, DBGridEh,
  RzShellDialogs,comObj,ActiveX, StdCtrls;
type
  TForm1 = class(TForm)
    ADOConnection1: TADOConnection;
    DBGridEh1: TDBGridEh;
    DataSource1: TDataSource;
    ADOConnection2: TADOConnection;
    ADOQuery1: TADOQuery;
    DataSource2: TDataSource;
    DBGridEh2: TDBGridEh;
    RzBitBtn1: TRzBitBtn;
    ADOQuery2: TADOQuery;
    procedure FormCreate(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure RzBitBtn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;
implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
begin
try
  ADOConnection2.Connected:=true;
  ADOConnection1.Connected:=true;
 Except
  Application.MessageBox('数据库连接失败,请检查参数!','警告',mb_iconwarning)
 end;
end;procedure TForm1.RzBitBtn1Click(Sender: TObject);
var
  I:Integer;
  sGUID:string;
  TmpGUID:TGUID;
begin
with  ADOQuery2 do begin
  ADOQuery2.SQL.clear;
  ADOQuery2.SQL.add('select * from [sheet1$]');
  ADOQuery2.Open;
  ADOQuery2.First;
end;
begin
  for I := 0 to 10 do
  begin
    if CoCreateGUID(TmpGUID) = S_OK then
      sGUID := GUIDToString(TmpGUID)
  end;
end;
while not ADOQuery2.eof do
    begin
    ADOQuery1.SQL.Clear;
    ADOQuery1.SQL.add('select * from Pub_Btype');
    ADOQuery1.Open;
    ADOQuery1.Append;
    ADOQuery1.FieldByName('_id').asstring:=sguid;
    ADOQuery1.FieldByName('FullName').asstring:=adoquery2.fieldbyname('名称').asstring;
    ADOQuery1.FieldByName('UserCode').asstring:=adoquery2.fieldbyname('编码').asstring;
    ADOQuery1.FieldByName('abbrName').asstring:=adoquery2.fieldbyname('简码').asstring;
    ADOQuery1.FieldByName('Comment').asstring:=adoquery2.fieldbyname('备注').asstring;
    ADOQuery1.SQL.BeginUpdate;
    ADOQuery1.Post;
    ADOQuery2.next;
    end;
end;
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
//ADOConnection1.Connected:=false;
//ADOConnection2.Connected:=false;
end;end.

解决方案 »

  1.   

    上面的代码问题很多
    procedure TForm1.RzBitBtn1Click(Sender: TObject); 
    var 
      I:Integer; 
      sGUID:string; 
      TmpGUID:TGUID; 
    begin 
    with ADOQuery2 do 
    begin
      close; 
      SQL.clear; 
      SQL.add('select * from [sheet1$]'); 
      Open; 
      First; 
    end; for I := 0 to 10 do 
    begin 
      if CoCreateGUID(TmpGUID) = S_OK then 
        sGUID := GUIDToString(TmpGUID) 
    end; ADOQuery1.close;
    ADOQuery1.SQL.Clear; 
    ADOQuery1.SQL.add('select * from Pub_Btype'); 
    ADOQuery1.Open; 
    while not ADOQuery2.eof do 
    begin 
      ADOQuery1.Append; 
      ADOQuery1.FieldByName('_id').asstring:=sguid; 
      ADOQuery1.FieldByName('FullName').asstring:=adoquery2.fieldbyname('名称').asstring; 
      ADOQuery1.FieldByName('UserCode').asstring:=adoquery2.fieldbyname('编码').asstring; 
      ADOQuery1.FieldByName('abbrName').asstring:=adoquery2.fieldbyname('简码').asstring; 
      ADOQuery1.FieldByName('Comment').asstring:=adoquery2.fieldbyname('备注').asstring; 
      ADOQuery1.SQL.BeginUpdate; 
      ADOQuery1.Post; 
      ADOQuery2.next; 
    end; 
    end; 试试,看怎么样?
      

  2.   

    插入重复键,肯定是你的主键或者带索引无重复的字段,插入了相同值,看样子应该是_id这个字段吧,跟踪一下,看看为什么两次取值重复  if CoCreateGUID(TmpGUID) = S_OK then 
        sGUID := GUIDToString(TmpGUID) 
    是不是能够保证正确执行,并且得到唯一的GUID
      

  3.   

    interface uses 
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
      Dialogs, RzButton, ADODB, Provider, DBClient, DB, Grids, DBGridEh, 
      RzShellDialogs,comObj,ActiveX, StdCtrls; 
    type 
      TForm1 = class(TForm) 
        ADOConnection1: TADOConnection; 
        DBGridEh1: TDBGridEh; 
        DataSource1: TDataSource; 
        ADOConnection2: TADOConnection; 
        ADOQuery1: TADOQuery; 
        DataSource2: TDataSource; 
        DBGridEh2: TDBGridEh; 
        RzBitBtn1: TRzBitBtn; 
        ADOQuery2: TADOQuery; 
        procedure FormCreate(Sender: TObject); 
        procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); 
        procedure RzBitBtn1Click(Sender: TObject); 
      private 
        { Private declarations } 
      public 
        { Public declarations } 
      end; var 
      Form1: TForm1; 
    implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); 
    begin 
    try 
      ADOConnection2.Connected:=true; 
      ADOConnection1.Connected:=true; 
    Except 
      Application.MessageBox('数据库连接失败,请检查参数!','警告',mb_iconwarning) 
    end; 
    end; procedure TForm1.RzBitBtn1Click(Sender: TObject); 
    var 
      I:Integer; 
      sGUID:string; 
      TmpGUID:TGUID; 
    begin 
    with  ADOQuery2 do begin 
      ADOQuery2.SQL.clear; 
      ADOQuery2.SQL.add('select * from [sheet1$]'); 
      ADOQuery2.Open; 
      ADOQuery2.First; 
    end; 
    //上次好像回復過你,這個在這裏產生沒有意義。
    {
    begin 
      for I := 0 to 10 do 
      begin 
        if CoCreateGUID(TmpGUID) = S_OK then 
          sGUID := GUIDToString(TmpGUID) 
      end; 
    end;}    ADOQuery1.SQL.Clear; 
       ADOQuery1.SQL.add('select * from Pub_Btype'); 
       ADOQuery1.Open;    while not ADOQuery2.eof do 
       begin 
        { ADOQuery1.SQL.Clear; 
        ADOQuery1.SQL.add('select * from Pub_Btype'); 
        ADOQuery1.Open; }  // 這些放到前面去。不然反復打開,折騰死它了    if CoCreateGUID(TmpGUID) = S_OK then 
          sGUID := GUIDToString(TmpGUID) 
        else rais exception.create(' 產生序號出錯');    ADOQuery1.Append; 
        ADOQuery1.FieldByName('_id').asstring:=sguid; 
        ADOQuery1.FieldByName('FullName').asstring:=adoquery2.fieldbyname('名称').asstring; 
        ADOQuery1.FieldByName('UserCode').asstring:=adoquery2.fieldbyname('编码').asstring; 
        ADOQuery1.FieldByName('abbrName').asstring:=adoquery2.fieldbyname('简码').asstring; 
        ADOQuery1.FieldByName('Comment').asstring:=adoquery2.fieldbyname('备注').asstring; 
        ADOQuery1.SQL.BeginUpdate; 
        ADOQuery1.Post; 
        ADOQuery2.next; 
      end; 
    end; 
    procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); 
    begin 
    //ADOConnection1.Connected:=false; 
    //ADOConnection2.Connected:=false; 
    end; end.