在数据库处理过程中,经常有如下情况:
if SQLQuery1.Locate(‘参数名’,‘MonitorName’,[]) then
begin
SQLQuery1.Edit;
SQLQuery1.FieldByName(‘参数值’).AsString :=s1;
end
else
begin
b:=true;
SQLQuery1.Append;
Inc(RecNo);
SQLQuery1.FieldByName(‘序号’).AsInteger:=RecNo;
SQLQuery1.FieldByName(‘参数名’).AsString:=‘MonitorName’;
SQLQuery1.FieldByName(‘参数值’).AsString :=s1;
SQLQuery1.FieldByName(‘类型’).AsString:=‘String’;
SQLQuery1.FieldByName(‘说明’).AsString:=‘监控程序的软件名称’;
end;
SQLQuery1.Post;
SQLQuery1.ApplyUpdates;
SQLTransaction1.Commit;
上面的程序第一次跑没问题,第二次出错,跟踪一下,发现发生在:
SQLQuery1.ApplyUpdates;
经过检查发现,使用TQuery控件编辑记录(在使用edit时)不用进行ApplyUpdates(提示:No update query specified and failed to generate one. (No fields for inclusion in where statement found.)),所以对以上代码进行修改如下:
if SQLQuery1.Locate(‘参数名’,‘MonitorName’,[]) then
begin
SQLQuery1.Edit;
SQLQuery1.FieldByName(‘参数值’).AsString :=s1;
SQLQuery1.Post;
//无法提交这个修改!!!
{致歉一下,本文还是有问题,经测试,Edit的内容无法最终更新到库中,先用Update修改一下,具体的问题没弄清楚
SQLQuery1.Close;
SQLQuery1.SQL.clear;
SQLQuery1.SQL.Add(‘Update TableName Set 参数值 = "’ + s1 + ‘" where 参数名 = “MonitorName”’);
SQLQuery1.ExecSQL;
SQLQuery1.SQL.clear;
SQLQuery1.SQL.Add(‘Select * From TableName’);
SQLQuery1.Open;
}
end
else
begin
b:=true;
SQLQuery1.Append;
Inc(RecNo);
SQLQuery1.FieldByName(‘序号’).AsInteger:=RecNo;
SQLQuery1.FieldByName(‘参数名’).AsString:=‘MonitorName’;
SQLQuery1.FieldByName(‘参数值’).AsString :=s1;
SQLQuery1.FieldByName(‘类型’).AsString:=‘String’;
SQLQuery1.FieldByName(‘说明’).AsString:=‘监控程序的软件名称’;
SQLQuery1.Post;
SQLQuery1.ApplyUpdates;
end;
SQLTransaction1.Commit;
这样就不会发生报错,具体错误原因就不清楚了…
追加一个记录:
在SQLite3中如果用Sqlite3Dataset控件可以在Append时自动生成序号(字段定义为ftAutoInc),但使用Query控件进行Append操作时,是不会自动生成序号的,须要程序代码实现这个字段。