可以考虑先判断一下目标是否存在,存在不插入,或者改更新语句:c:=list.Count-1;
with ADOQuery1 do
begin
  for I := 1 to c do 
  begin
    txt:=list.Strings[i];
    Close;
    SQL.clear;
    SQL.Text := 'SELECT COUNT(1) FROM 三年级 WHERE 题目文本 = ' + QuotedStr(txt);
    Open;
    if Fields[0].AsInteger > 0 then
        //代表已经有数据,改更新
        SQL.Text := 'UPDATE 三年级 SET 题目文本 = '  + QuotedStr(txt)
    else
        SQL.Add('insert into 三年级 (题目文本) values(' + QuotedStr(txt) + ')');
    execsql;
  end;
end;

解决方案 »

  1.   

    语句:
    SQL.Add('insert into 三年级 (题目文本) values(a)');

    SQL.Add('insert into 三年级 (题目文本) values(:a)');
      

  2.   

    表字段设置不能重复,具体语句上不用处理了吧。当插入重复的会报的。except处理下好了。
      

  3.   

    刚刚上面更新的时候忘记加过滤条件了...修改了一下,能用了。但不明白为什么每次查询都要OPEN?将OPEN放在CLOSE后就错?
      c:=list.Count-1;  with ADOQuery1 do
      begin
        close;
        for I := 1 to c do begin
          txt:=list.Strings[i];
          SQL.clear;
          SQL.Add('select 题目文本 from 三年级 where 题目文本=a');
          parameters.ParamByName('a').Value:=txt;
          open;
          if RecordCount=0 then begin
            SQL.clear;
            SQL.Add('insert into 三年级 (题目文本) values(a)');
            parameters.ParamByName('a').Value:=txt;
            execsql;
          end;
        end;
      end;
      

  4.   

    这个我只能解释为为了安全起见。每次在使用之前,先清空上次操作(close),然后再填充sql语句(SQL.Text),最后再根据需要调用打开数据集方法(Open)或执行更新操作(ExecSql);常规用法就是
      

  5.   


    .Close;
    .SQL.Cearl;
    .SQL.Text或.SQL.Add();
    .Open或.ExecSql;
    上面是一个标准流程(虽然我不确认是不是最全的)