delphi中,如何写SQL命令避免录入重复数据?

ooooh 2014-05-17 09:54:48
在不过滤重复数据时,下面编码能正常录入的,应该如何插入过滤编码,怎么写?
搞了一天,网上查了一堆资料都没有明确的。写出来的编码运行时都报错,实在没办法。

c:=list.Count-1;
with ADOQuery1 do
begin
close;
for I := 1 to c do
begin
txt:=list.Strings[i];
SQL.clear;
SQL.Add('insert into 三年级 (题目文本) values(a)');
parameters.ParamByName('a').Value:=txt;
execsql;
end;
end;


...全文
459 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
leandzgc 2014-05-23
  • 打赏
  • 举报
回复

.Close;
.SQL.Cearl;
.SQL.Text或.SQL.Add();
.Open或.ExecSql;
上面是一个标准流程(虽然我不确认是不是最全的)
leandzgc 2014-05-23
  • 打赏
  • 举报
回复
这个我只能解释为为了安全起见。每次在使用之前,先清空上次操作(close),然后再填充sql语句(SQL.Text),最后再根据需要调用打开数据集方法(Open)或执行更新操作(ExecSql);常规用法就是
ooooh 2014-05-22
  • 打赏
  • 举报
回复
引用 2 楼 leandzgc 的回复:
[quote=引用 1 楼 leandzgc 的回复:] 可以考虑先判断一下目标是否存在,存在不插入,或者改更新语句:

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) + ' WHERE 题目文本 = ' + QuotedStr(txt)
    else
        SQL.Add('insert into 三年级 (题目文本) values(' + QuotedStr(txt) + ')');
    execsql;
  end;
end;
刚刚上面更新的时候忘记加过滤条件了...[/quote] 修改了一下,能用了。但不明白为什么每次查询都要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;
coolingxyz 2014-05-22
  • 打赏
  • 举报
回复
表字段设置不能重复,具体语句上不用处理了吧。当插入重复的会报的。except处理下好了。
qq7118622 2014-05-20
  • 打赏
  • 举报
回复
语句: SQL.Add('insert into 三年级 (题目文本) values(a)'); 改 SQL.Add('insert into 三年级 (题目文本) values(:a)');
leandzgc 2014-05-17
  • 打赏
  • 举报
回复
引用 1 楼 leandzgc 的回复:
可以考虑先判断一下目标是否存在,存在不插入,或者改更新语句:

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) + ' WHERE 题目文本 = ' + QuotedStr(txt)
    else
        SQL.Add('insert into 三年级 (题目文本) values(' + QuotedStr(txt) + ')');
    execsql;
  end;
end;
刚刚上面更新的时候忘记加过滤条件了...
leandzgc 2014-05-17
  • 打赏
  • 举报
回复
可以考虑先判断一下目标是否存在,存在不插入,或者改更新语句:

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;

2,507

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧