在使用batchmove组件进行数据转移拷贝时产生一个超时问题,如果解决?
具体情况如下:
两个TABLE连两个ODBC,源表是DBF表,目标表是SQLSERVER。又分别有两个DATABASE。DBGRID等组件。
在数据两小的时候还可以进行拷贝,如果数据太大,就产生ODBC超时或溢出//
我第一次这么急,下午要就工,没想到出这么一个问题。
如果不用BATCHMOVE是否还有其他方法也可以告之,先谢了。

解决方案 »

  1.   

    调整系统的虚拟内存你从源控制一下吧,一次性别抽太多数据:)我用它从Oracle往DB2里塞,超过40W就困难了
      

  2.   

    改用BDE试试,不用ODBC,再不用ADOQUERY
      

  3.   

    对了,设置一下TBatchMove.CommitCount到一定纪录就提交一次:)
      

  4.   

    用ADOQUERY无法做batchmove的source的..............
      

  5.   

    给个Email我发给你个Program是关于数据导入导出的
      

  6.   

    你是要写一个程序,还是要把数据导入呀。如是导入的话那你可以用SQLSERVER的导入来做呀。
      

  7.   

    楼主我刚刚试过了设置TBatchMove.CommitCount的确能够增加性能:))))
      

  8.   

    要不你这样,不用ODBC 直接把你的DBF的文件PATH 写入就可以在TABLENAME 
    中找到你的表名。而目标的就用BDE 这样如何。在线等待。
      

  9.   

    http://www.playicq.com/dispdoc.php?t=19&id=2042
      

  10.   

    Access2000的用provider(jet 4.0 ole Db provider),数据量大时会内存溢出。
    所以,呵呵
    A BUG
      

  11.   

    服了,我什么时候说用ADO了???我用就是BDE。我试下。
    还有我的ML:[email protected]
      

  12.   

    数据量大的情况应该用CommitCount如果你的DBF文件和SQLServer在一台机上的话,可以使用SQL命令来导入,具体则要试一下才知。就是sp_addlinkedserver之类的命令。
      

  13.   

    如果有15000条的话,那么COMMITCOUNT设为多少合适,还是不行,超时,大哥我真急啊!
      

  14.   

    设为100-500之间看看。我也没用过它来导,只是用DataSet来转成SQL一条条Insert。:(
      

  15.   

    还有在设置ODBC的驱动时,不是有个选项叫超时值之间的,将它设的大一点。
      

  16.   

    我以前写时就用SQL命令来insert的,简单一点:with DstDataSet do
    begin 
      DisableControls;
      First;
      SrcDataSet.SQL.Clear;
      while not Eof do 
      begin
        SrcDataSet.SQL.Add(Format('insert into table values(''%s'', ''%s''', [Fields[0].AsString, Fiedls[1].AsString]));
        if SrcDataSet.SQL.Count > 100 then
        begin
          SrcDataSet.ExecSQL;
          SrcDataSet.SQL.Clear;
        end;
        Next;
      end;
    end;类似这样吧。
      

  17.   

    我這里有一個關于数据转移拷贝的程序﹐你試試看行不行。
    ---- 在 计 算 机 应 用 系 统 的 软 件 升 级 改 造 过 程 中, 我 们 经 常 遇 到 这 样 一 个 问 题: 老 系 统 的 数 据 库 平 台 与 新 系 统 不 同。 例 如, 老 系 统 的 数 据 库 平 台 是Foxpro, 而 新 系 统 的 平 台 是SQL Server。 而 且, 我 们 需 要 把 旧 的 数 据 库 应 用 系 统 中 的 一 些 数 据 转 移 到 新 系 统 来。 但 是 因 为 新 老 系 统 在 定 义 数 据 类 型、 数 据 格 式 等 方 面 的 差 异, 就 很 难 用 人 工 录 入 的 方 法 来 实 现。 因 此, 需 要 有 一 个 能 实 现 这 种 功 能 的 程 序。  ---- 本 文 利 用Borland Delphi 实 现 了 这 个 转 移 过 程。  ---- 基 本 思 想 是: 在 一 个Form 中, 分 别 用 两 个TDatabase 控 件 连 接 新 老 数 据 库。 并 采 用 TTable、TDbGrid 作 为 数 据 转 移 的 中 心, 根 据DbGrid 中 的 数 据 生 成 标 准 的SQL 插 入 语 句。 这 样, 就 实 现 了 从 一 个 数 据 库 系 统 到 另 一 个 数 据 库 系 统 的 数 据 转 移。 在 这 里, 采 用TTable、TDbGrid 作 为 数 据 转 移 的 中 心 是 一 个 技 巧, 因 为:TTable 的Fields 属 性 能 指 示 出 某 字 段 的 字 段 名 称、 数 据 类 型 等, 这 为 数 据 转 移 过 程 中 的Insert 语 句 的 生 成 及 数 据 类 型 转 换 提 供 了 依 据。  ---- 下 面 的 例 子 展 示 了 从Foxpro 到SQL Server 的 数 据 转 移 方 法。 至 于 其 他 系 统 间 的 数 据 转 移, 只 要 根 据 目 标 系 统 的 数 据 定 义 要 求, 修 改 相 应 的Insert 语 句。  ---- 程 序 代 码 如 下:  unit ConvertDBF;  interface  uses  
    Windows, Messages, SysUtils, Classes,  
    Graphics, Controls, Forms, Dialogs,  
    StdCtrls, DBTables, Db, Grids, DBGrids;  type  
    TfrmConvertDB = class(TForm)  
    btnOK: TButton;  
    Label1: TLabel;  
    db1: TDatabase; {用于连接老数据库系统}  
    db2: TDatabase; {用于连接新数据库系统}  
    dbg: TDBGrid;  
    tblSource: TTable; {dbg的Datasource}  
    qryInsert: TQuery;  
    {用于存放生成的SQL Insert语句}  
    srcSource: TDataSource;  
    tblDest: TTable; {DBGrid1的Datasource}  
    DBGrid1: TDBGrid;  
    srcDest: TDataSource;  
    edFromtbl: TEdit;  
    Label2: TLabel;  
    Label3: TLabel;  
    edToTbl: TEdit;  
    procedure btnOKClick(Sender: TObject);  
    private  
    { Private declarations }  
    public  
    { Public declarations }  
    end;  var  
    frmConvertDB: TfrmConvertDB;  implementation  {$R *.DFM}  
    procedure TfrmConvertDB.btnOKClick  
    (Sender: TObject);  
    var iField :integer;  
    begin  
    if ((edTotbl.text<>'') and  
    (edFromtbl.text<>''))then begin  
    tblSource.TableName:=edFromtbl.text;  
    {指定TableName}  
    tblDest.TableName:=edTotbl.text;  
    with tblSource do begin  
    Open; {打开老系统的表}  
    while EOF=FALSE do begin  
    {逐条记录处理}  
    qryInsert.SQL.Clear;  
    qryInsert.sql.Add  
    ('Insert into '+edTotbl.text + '(');  
    for iField:=0 to dbg.FieldCount-1 do begin  
    qryInsert.sql.add  
    (dbg.Fields[iField].DisplayLabel);  
    if iField<>dbg.FieldCount-1 then  
    qryInsert.sql.add(',');  
    end;  
    qryInsert.sql.add(') values(');  
    for iField:=0 to dbg.FieldCount-1 do begin  
    {进行数据类型转换}  
    if dbg.fields[iField].DataType=ftInteger then  
    qryInsert.sql.add(inttostr  
    (dbg.fields[iField].asInteger));  
    if dbg.fields[iField].DataType=ftFloat then  
    qryInsert.sql.add(floattostr  
    (dbg.fields[iField].asFloat));  
    if dbg.fields[iField].DataType=ftDate then  
    qryInsert.sql.add(''''+datetostr  
    (dbg.fields[iField].asDateTime)+'''');  
    if dbg.fields[iField].DataType=ftString then begin  
    if dbg.fields[iField].asString<>'' then  
    qryInsert.sql.add(''''+dbg.fields  
    [iField].asString+'''')  
    else  
    qryInsert.sql.add('NULL');  
    end;  
    if iField<>dbg.FieldCount-1  
    then qryInsert.sql.add(',');  
    end;  
    qryInsert.sql.add(')');  
    qryInsert.ExecSQL;  
    {把数据插入到新系统的表中}  
    next;  
    end;  
    end;  
    tblDest.Close;  
    tblDest.Open;;  
    ShowMessage(' 转换完毕! ');  
    end  
    else  
    ShowMessage  
    ('请输入要插入数据的表的名称 ');  
    end;  
    end. 
      

  18.   

    用BDE不可能不行啊!我100万的记录也导过,没出现超时现象啊!
      

  19.   

    还不行?实在没法,就这样做吧。
    SrcDataSet.Append;
    SrcDataSet.Field[i].Value := DstDataSet.Fields[i].Value;
    ...改一下你的代码,速度应该很快的啊。
    记住使用前将DataSet.DisableControls了,不然速度会很慢的。
      

  20.   

    是不是因为ODBC的原因?你直接使用BDE进行连接,不要ODBC试试。。
      

  21.   

    同意copy_paste(木石三),我从来不用ODBC,为什么不直接用BDE来连呢?我一直在程序中使用BDE来导数据,速度还挺快的,当然,有时为了方便,我经常使用李颖的数据导出导入工具。
      

  22.   

    我在使用TABLE或者DATABASE连VFORPRO表的时,出现登陆框,然后无法连接到表,我不知道为什么所以实现不了,在使用ODBC的时候CommitCount设为多少都超时。虽然使用BCTCHMOVE是最好最快的办法,但是我在程序里无法实现。/
      

  23.   

    CDSoftwareWj(95927) ( )没有收到,不如传到一个地方吧。让大家都看看/问题我已经解决了,只是没有用任何一位的方法,我也不得不使用INSERT INTO了。
      

  24.   

    下载地址注意要BDE支持才行http://www.playicq.com/downsoft.php?id=499
      

  25.   

    楼主怎么解决的呢?贴出来看看啦!
    不过,那们组件我也常用,却没有见过这样的问题呢!
    我想你这样试行不行:
    在企业管理器中直接导,如果成功可以肯定SQLServer是没问题的,导入这么数据也是没问题的!
      

  26.   

    CDSoftwareWj(95927)  BDE??不用ODBC? 怎么连DBF表和SQLSERVER表?
      

  27.   

    to  l_xiaofeng(≈流水≈不腐≈) 建一个ODBC数据源,想连什么连什么BDE+ODBC ^^! program uses BDE API
      

  28.   

    想不通,用BATCHMOVE 来把一个VFP 下的DBF  表导入到SQLSERVER 7.0 中我都做过的。