读书人

批量数据保存到ms sql有关问题

发布时间: 2013-08-04 18:26:16 作者: rapoo

批量数据保存到ms sql问题
数据库MS SQL2008,TADODataSet+cxGrid
明细记录1000条,目前用TADODataSet.UpdateBatch方式要4分钟.
求优化解决思路! delphi mssql
[解决办法]
帮你顶一下,adodataset不熟,习惯用adoquery,感觉adoquery挺快的啊
[解决办法]
跟楼主一样,前段时间我一直在寻求通过Ado批量提交数据库的方法,Dephi的资料现在少了,最初我也是通过AdoQuery来实现的,如下:

connection.BeginTrans();
adoQuery.Active := False;
adoQuery.LockType := ltBatchOptimistic;
adoQuery.SQL.Clear();
adoQuery.SQL.AddStrings(sl);
adoQuery.Active := True;
//adoQuery.Post();
adoquery.ExecSQL();
adoQuery.UpdateBatch();
connection.CommitTrans();

但执行下来总有这样那样的问题,后面改成AdoCommand了,如下:

if sl.Count >= 100 then
begin
try
connection.BeginTrans();
command.CommandText := sl.Text;
command.Prepared := True;
command.Execute();
connection.CommitTrans();

目前用下来没有大的问题,sl为多个Insert Into语句。
[解决办法]
CXgrid数据多了速度会很慢,换DBgid或DBGRIDEH试试。
[解决办法]
保存成XML文件进行处理会更快
详细可以参考以下链接(是VB 语言实现):
http://www.perfectxml.com/articles/XML/ExportSQLXML.asp
[解决办法]
直接写update语句, 比如update tab1 set fld ='1' where ID in ('1', '2', ...., 'N')
[解决办法]
是循环取gird对应的数据集,求出('1', '2', ...., 'N')
然后一次性提交update语句。
比如我审批或作废1000个记录,就用这种方式,大概是几秒内完成的事情而已。



顺便说一句,这种保存一次,提交一次的算法,属于基础或教条式的方法。
遇到大数据量处理时,必须改为准备好数据,一次提交sqlserver。

这个似乎有点设计模式,或者有点哲学的味道。
[解决办法]
开二个线程同时使用数据库操作应该可以。

读书人网 >.NET

热点推荐