我是一个新手
问题一
用adoquery读取数据,只对一个表进行插入数据(一次插入30-40条左右),是用adoquery.append post插入好还是用sql.add(insert) execsql好上面两种插入方法有什么区别,在什么情况下用那种方法,谢谢了问题二
如果要对两个表进行插入(用adoquery.append post)这种方法,先插入一个表,在插入第二个表时发生错误,希望进行回滚,撤销已插入第一个的数据,该怎么实现呢?
问题一
用adoquery读取数据,只对一个表进行插入数据(一次插入30-40条左右),是用adoquery.append post插入好还是用sql.add(insert) execsql好上面两种插入方法有什么区别,在什么情况下用那种方法,谢谢了问题二
如果要对两个表进行插入(用adoquery.append post)这种方法,先插入一个表,在插入第二个表时发生错误,希望进行回滚,撤销已插入第一个的数据,该怎么实现呢?
解决方案 »
- delphi余数判断
- 再问一个DLL的函数返回字符串的问题。
- 关于SQLTable的问题
- 动态创建一个TDatabase, free后,内存怎么回收呢?
- 兄弟们新问题想了好长时间没想通!!!!!!!!!!!!!!!!!!!!!!! 高手高手高高手啊!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- 怎样控制FastReport中通过CrossObject产生的报表的各字段的属性(如宽度,折行等)?
- SUIPack中动态建立菜单还是Windows原来的风格。
- 谁知道哪有MSI类型的安装程序制作工具下载!?
- 我研究了一下午,發現teamsource好像不能取得以前的版本,不像VSS一樣.是嗎???
- 欢迎网络编程人员来讨论(高分馈赠)
- IdTCPServer和IdTCPClient客户端服务器端都发record数据包的例子谁有啊,谢谢
- 怎样做成office 2003风格的那种淡蓝色皮肤效果?
问题二 如果是联合查询得到的表,append,post肯定要出错,post对单表有效,这时要用sql语句更新
1. Add insert 語句。 AdoQuery1.prepare; 後執行 execql . 效率會高點2. 可以通過事務來處理; if not AdoQuery.connection.inTransAction then AdoQuery.Connection.BeginTran;
try
post...; adoquery.connection.Commit;
except
AdoQuery.Connection.Rollback;
end;上面都是直接手寫的,可能有筆誤,見諒,意思應該表達清楚了。呵呵
ADOConnectionDM.ADOConnection2.BeginTrans;
adoq.SQL.Add('select * from tabbar');
adoq.open;
c1:='0';
while not adoq.Eof do
begin
adoq1.SQL.Add('insert into dbo.tabbar(barcode,scantime,userid,lip) values ('''+adoq.Fields[0].AsString+''','''+adoq.Fields[1].AsString+''','''+adoq.Fields[2].AsString+''','''+adoq.Fields[3].AsString+''')');
adoq.Next;
c1:='1';
end;
adoq1.ExecSQL;
adoq.Close;
adoq.SQL.Clear;
adoq.SQL.Add('delete from tabbar');
adoq.ExecSQL;
b1:=true;
ADOConnectionDM.ADOConnection2.CommitTrans;
except
ADOConnectionDM.ADOConnection2.RollbackTrans;
b1:=false;
end;这是批量提交的例子
问题一:
可以考虑利用delphi中ADO组件的批量更新模式或拼接SQL语句实现。
问题二:
考虑第一个表在利用即时更新模式处理,即Append,post方式。
同时对于第二个需要提交的数据集可以使用事务+批量更新模式处理。
1、begin tran
2、ExecSQL('Insert into Table1 values() ');
3、ADOQuery1.LockType := ltBatchOptimistic;
SQL条件...
ADOQyery1.open;
while not ADOQuery1.Eof do
begin
ADOQuery1.Append;
ADOQuery1.fieldbyName('XX').value := 'aa';
...
...
ADOQuery1.Next;
end;
ADOQuery1.UpdateBatch(arAll);
4、commit tran
ADOQuery1.UpdateBatch(arAll);
才会真正提交到数据库中。