我遇到了一个利用ADOCONNECTION--ADOQUERY--连接服务器超时的问题,经过查找资料,建议用ADODATASET 替换 ADOQUERY,解决超时问题,但我要用ADODATASET 来解决添加数据操作:
例如一条INSERT INTO XX (SELECT * FROM YY) 语句,此语句可以添加多条记录,请大家指点如何用ADODATASET 来写。多谢。

解决方案 »

  1.   

    我在存储过程中,已经用到事务了,但是现在插入的数据有8万条左右,老提示超时。所以我采用ADODATASET .
      

  2.   

    CommandTimeout的值设置的大一些。
      

  3.   

    if ADOConnection.InTransaction then
      ADOConnection.RollbackTrans;
    try
      ADOConnection.BeginTrans;
      with ADODATASET do
      begin
        Active := False;
        CommandText := 'INSERT INTO XX (SELECT * FROM YY)';
        Active := True;
      end;
        ADOConnection.CommitTrans;
    except
        ADOConnection.RollbackTrans;
    end;
      

  4.   

    TO:Wally_wu(拒绝编码) 
    但是我也是这样试验的,返回错误信息。
      

  5.   

    TO :soaringsouth(栈桥捉鳖)
    CommandTimeout的值设置的大一些。ADODATASET 的值可以设大,但是ADODATASET执行不过来呀
      

  6.   

    我现在又利用ADOCOMMAND,ADOCOMMAND的确可以添加进去,不超时,但是提示我,有主键冲突
    ,但是我在查询分析器,调用存储过程,可以插入,请大家指点。
      

  7.   

    当A D O开始处理数据后,应用程序必须等到A D O处理完毕之后才可以继续执行。但
    是除了同步执行方式之外, A D O也提供了异步执行的方式,允许当A D O处理时,
    应用程序仍然能够先继续执行。而当A D O处理数据完毕之后, A D O会以事件的方
    式通知应用程序,此时应用程序可以再根据A D O执行的结果来采取相应的动作。
    使用异步执行方式有许多用途,例如,如果应用程序需要处理花费大量时间的动
    作,那么A D O可以选择以异步执行方式让A D O在后台执行,而让应用程序继续处
    理图形用户接口或用户输入的数据。
    在A D O中使用异步执行方式非常简单,只需要对A D O数据集的E x e c u t e O p t i o n s
    属性值进行适当的设定即可。现在就让我们以一实际的范例应用程序来说明如何让
    A D O以异步的方式来处理数据。
    下载
    1) 在D e l p h i集成开发环境中关闭所有的项目。
    2) 建立一个新的应用程序项目,在主窗体中放入TA D O C o n n e c t i o n对象连接到
    数据库。
    3) 在主窗体中放入TA D O D a t a S e t组件。设定它的C o n n e c t i o n属性值为步骤2) 的
    TA D O C o n n e c t i o n,并且在它的C o m m a n d Te x t属性值中使用Select * from ADOTe s t D a t a s
    以取得所有的数据。再设定它的A c t i v e属性值为Tr u e以打开范例数据表。
    4) 放入TDataSource组件,设定它的DataSet属性值为步骤3) 加入的TADODataSet
    组件。
    5) 放入T D B N a v i g a t o r和T D B G r i d组件,设定它们的D a t a S o u r c e组件为步骤4加
    入的T D a t a S o u r c e组件。
    6) 在主窗体中放入两个T B u t t o n组件以及一个T P r o g r e s s B a r组件,并且设定它
    的相关属性值。此时主窗体如图3 - 1 2所示。
    图3-12 范例应用程序的主窗体
    7) 最后在主窗体中放入一个TA D O C o m m a n d组件。设定它的C o n n e c t i o n属性
    值为步骤2) 的TA D O C o n n e c t i o n,并且在它的C o m m a n d Te x t属性值中使用S e l e c t
    count(*) from ADOTe s t D a t a s以便从A D O Te s t D a t a s数据表中取得所有数据的笔数。
    8) 在主窗体的O n A c t i v a t e事件处理程序中撰写如下的程序代码:
    第3章撰写使用A D O技术的应用系统(二) 1 1 1
    下载
    p r o c e d u r e TForm1.FormActivate(Sender: TObject);
    v a r
    sRecNo : String;
    b e g i n
    ProgressBar1.Max := ADOCommand1.Execute.Fields.Item[0].Value;
    sRecNo := IntToStr(ProgressBar1.Max);
    Self.Caption := '共有' + sRecNo + ' 笔数据' ;
    e n d ;
    O n A c t i v a t e事件处理程序首先执行TA D O C m m a n d的S Q L命令,并且从它回传
    的暂时R e c o r d s e t对象中取出A D O Te s t D a t a s数据表中所有数据的笔数,然后再指定
    给T P r o g r e s s B a r的M a x值,最后指定给窗体的C a p t i o n属性值。
    9) 双击窗体中的e o A s y n c F e t c h N o n B l o c k i n g按钮,并且在它的O n C l i c k事件处
    理程序中撰写如下的程序代码:
    p r o c e d u r e TForm1.Button2Click(Sender: TObject);
    b e g i n
    t r y
    ADODataSet1.Active := False;
    ADODataSet1.ExecuteOptions := [eoAsyncFetchNonBlocking];
    f i n a l l y
    lStart := GetTickCount;
    ADODataSet1.Active := True;
    e n d ;
    e n d ;
    在上面的程序代码中先关闭步骤3) 的TA D O D a t a S e t,再设定它的E x e c u t e O p t i o n s
    属性值为使用异步方式来存取数据。最后再打开步骤3) 的TA D O D a t a S e t组件,从
    A D O Te s t D a t a s数据表中取得数据。
    10) 双击窗体中的e o A s y n c F e t c h按钮,并且在它的O n C l i c k事件处理程序中撰
    写如下的程序代码:
    p r o c e d u r e TForm1.Button1Click(Sender: TObject);
    b e g i n
    t r y
    ADODataSet1.Active := False;
    ADODataSet1.ExecuteOptions := [eoAsyncFetch];
    f i n a l l y
    lStart := GetTickCount;
    1 1 2 Delphi 5.x ADO/MTS/COM+高级程序设计篇
    下载
    ADODataSet1.Active := True;
    e n d ;
    e n d ;
    在上面的程序代码中先关闭步骤3) 的TA D O D a t a S e t,再设定它的E x e c u t e O p t i o n s
    属性值为使用同步方式来存取数据,再打开步骤3) 的TA D O D a t a S e t组件,从
    A D O Te s t D a t a s数据表中取得数据。
    在异步方式中, A D O会以O n F e t c h P r o g r e s s事件来通知应用程序A D O还在处理
    数据之中,并且以O n F e t c h C o m p l e t e事件来通知应用程序A D O已经处理数据完毕了。
    程序员可以在这两个事件处理程序中撰写程序代码来处理这两种情形。下面是范
    例应用程序在这两个事件处理程序中实现的程序代码。
    11) 在步骤3) 的TA D O D a t a S e t组件的O n F e t c h P r o g r e s s事件处理程序中撰写如下
    的程序代码:
    p r o c e d u r e TForm1.ADODataSet1FetchProgress(DataSet: TCustomADODataSet;
    Progress, MaxProgress: Integer; v a r EventStatus: TEventStatus);
    b e g i n
    ProgressBar1.Position := Progress;
    e n d ;
    上面的程序代码只是在A D O持续处理数据时不断更新主窗体中T P r o g r e s s B a s e
    的显示状态。
    12) 在步骤3) 的TA D O D a t a S e t组件的O n F e t c h C o m p l e t e事件处理程序中撰写如
    下的程序代码:
    p r o c e d u r e TForm1.ADODataSet1FetchComplete(DataSet: TCustomADODataSet;
    c o n s t Error: Error; v a r EventStatus: TEventStatus);
    b e g i n
    lEnd := GetTickCount;
    S h o w M e s s a g e ( '总共花了' + FloatToStr((lEnd - lStart) / 1000.0) + ' 秒' ) ;
    e n d ;
    上面的程序代码是当A D O处理完数据之后便显示一个对话框,显示A D O处理
    数据所花费的时间。
    现在请编译并且执行这个范例应用程序。图3 - 1 3是以异步的方式来存取
    A D O Te s t D a t a s这个范例数据表中数据的画面。从图中可以看到,当A D O存取数据
    第3章撰写使用A D O技术的应用系统(二) 1 1 3
    下载
    时应用程序仍然可以不断地更新主窗体中的T p r o g r e s s B a r。如果使用同步的方式执
    行,T P r o g r e s s B a r便无法这样更新状态。此时我们也可以移动主窗体的位置等,可
    见应用程序不会因为A D O在存取大量的数据而造成应用程序无法继续工作。
    图3-13 范例应用程序以异步方式执行的画面
    图3 - 1 4是当A D O处理数据完毕并且触发O n F e t c h C o m p l e t e事件处理程序时显示的
    画面。从这两个画面中我们可以看到,当A D O以异步的方式执行时,O n F e t c h P r o g r e s s
    和O n F e t c h C o m p l e t e事件可以帮助程序员取得非常有用的状态信息。
    图3-14 范例应用程序以异步方式执行的画面如果你也执行这个范例应用程序,那么可以比较一下当A D O在同步执行模式
    和异步执行模式中处理数据时哪一种模式比较有效率。可能你会惊讶地发现异步
    执行模式可以提供更好的执行效率
      

  8.   

    TO Drate(书虫) 
    但是我现在用ADODATASET无法实现插数裾功能,还望指点
      

  9.   

    adoquery1.active:=false;
    adoquery1.sql.clear;
    adoquery1.sql.add('insert into table(field) values('+''''+trim(edit1.text)+''''+')');
    adoquery1.execsql;
      

  10.   

    ADOQUERY无法设置超时时间,这也是DELPHI的一个BUG,所以我采用ADODATASET
    ,请大家指点ADODATASET的插入语法,例如一条INSERT INTO XX (SELECT * FROM YY) 语句,此语句可以添加多条记录,请大家指点如何用ADODATASET 来写。多谢。
      

  11.   

    adoquery1同样可以设置超时的。
    设置adoquery1的commandtime为100