我用Delphi7的ADO操作VisualFoxpro7的自由表(指的是单个后缀是DBF的表)
每次只能insert512条记录后出现too many variables的错误,为什么?
我的ADO是MDAC2.6sp2打过补丁的,adoconnection string 是
Provider=VFPOLEDB.1;Data Source=D:\myVFP;Mode=Share Deny None;Password="";Collating Sequence=MACHINE
ADO的类型是OLE DB Provider for Visual Foxpro
附源程序:
unit tube51;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, DB, ADODB;type
  TForm1 = class(TForm)
    ADOConnection1: TADOConnection;
    ADOQuery1: TADOQuery;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var
    i:Integer;
begin
    ADOConnection1.Open;
    ADOQuery1.Close;
    ADOQuery1.SQL.Clear;
    try
        ADOQuery1.SQL.Add('INSERT INTO TBZQDM (ZQDM,ZQMC) VALUES (:DM,:MC)');
        for i:=1 to 1000 do
        begin
           ADOQuery1.Parameters.ParamValues['dm']:='000001';
           ADOQuery1.Parameters.ParamValues['mc']:='深发展A';
           ADOQuery1.ExecSQL;
        end;
    finally
        ADOQuery1.Close;
        ADOConnection1.Close;
    end;
end;end.
但将
        ADOQuery1.SQL.Add('INSERT INTO TBZQDM (ZQDM,ZQMC) VALUES (:DM,:MC)');
改为
        ADOQuery1.SQL.Add('INSERT INTO TBZQDM (ZQDM,ZQMC) VALUES (:DM)');
只有一个
           ADOQuery1.Parameters.ParamValues['dm']:='000001';
           ADOQuery1.ExecSQL;又不会出错
为什么????
是不是Delphi本身的Bug?

解决方案 »

  1.   

    在ADOQuery1.Parameters.ParamValues['dm']:='000001';
    之前加这句话试试:
    ADOQuery1.ParamCheck:=true;
      

  2.   

    不行,加了一样,执行了512条后仍出现too many variables错误
    救救我呀
      

  3.   

    换个驱动看看,用ODBC里的Microsoft Visual FoxPro Driver
      

  4.   

    你试试改成这样:
        try
          for i:=1 to 1000 do
            begin
            ADOQuery1.sql.clear;
            ADOQuery1.SQL.Add('INSERT INTO TBZQDM (ZQDM,ZQMC) VALUES (:DM,:MC)');
               ADOQuery1.Parameters.ParamValues['dm']:='000001';
               ADOQuery1.Parameters.ParamValues['mc']:='深发展A';
               ADOQuery1.ExecSQL;
            end;
        finally
            ADOQuery1.Close;
            ADOConnection1.Close;
        end;
      

  5.   

    delphi和ADO的结合是不是不稳定
    我用ADO把汉字写进vfp的dbf中,老是莫名其妙的截掉半个字符
    用BDE没问题,操作环境是win2000,delphi7
    为什么????
    改版后怎么热心的高手不见了,我是业余爱好者,好多问题都搞不懂
    乞盼赐教
      

  6.   

    用ADO FOR ODBC里的Microsoft Visual FoxPro Driver,我一直都用这个驱动,非常稳定!!
      

  7.   

    应该是这样:
    你试试改成这样:
        try
          for i:=1 to 1000 do
            begin
            adoquery1.close;
            ADOQuery1.sql.clear;
            ADOQuery1.SQL.Add('INSERT INTO TBZQDM (ZQDM,ZQMC) VALUES (:DM,:MC)');
               ADOQuery1.Parameters.ParamValues['dm']:='000001';
               ADOQuery1.Parameters.ParamValues['mc']:='深发展A';
               ADOQuery1.ExecSQL;
            end;
        finally
            ADOQuery1.Close;
            ADOConnection1.Close;
        end;
      

  8.   

    据说是ADO的BUG,需要升级
    我也遇到类似问题
    想将日期插入到SQL数据库里,其中yeam是日期型的
     
     sql.add('insert ttime(yeam) values(''2002-9-18'')');//ok
     
    如果用参数形式
      sql.add('insert ttime(yeam) values(:yeam)');
      parameters.parambyname('yeam').value:=strtodatetime('2002-9-18');//error我在大富翁上看到了同样的问题,据说是ADO的问题,可是我把它升级了还是通不过,不知道是什么原因
      

  9.   

    VFP的ado驱动是什么版本的?
    不用Parameters.ParamValues
    adoconnection.exec一般没问题
      

  10.   

    这个日期类型的问题可以这样解决:用datetostr函数转换为字符串赋值进去。或者数据库里不用日期字段,改用字符类型,如varchar(8)等
      

  11.   

    建议不要用adoquery的Parameters属性,容易出现问题
    还是这么写吧
          for i:=1 to 1000 do
           begin
            Adoquery1.close;
            Adoquery1.Sql.clear;
            ADOQuery1.SQL.Add('INSERT INTO TBZQDM (ZQDM,ZQMC) VALUES ('00001','深发展A')');
               ADOQuery1.ExecSQL;
            end;
      

  12.   

    把:
            Adoquery1.close;
            Adoquery1.Sql.clear;
            ADOQuery1.SQL.Add('INSERT INTO TBZQDM (ZQDM,ZQMC) VALUES ('00001','深发展A')');
               ADOQuery1.ExecSQL;
    改成:
          adoconnection.execute('INSERT INTO TBZQDM (ZQDM,ZQMC) VALUES ('00001','深发展A')');不好吗?
      

  13.   

    真是百家争鸣呀!我正在用ado+sqlserver不知道会不会出现这种情况?有没有用过的,告诉我一声!谢谢!
      

  14.   

    ado和ms sql是最完美结合
    新的ado.net中mssql是用sqlconnection
    access或oracle、db2等符合old标准的数据库用oledbconnection
    其它用odbcconection
      

  15.   

    to shizhoubo()ado+sqlserver
    如果用delphi
    ado一定要升级否则会有问题
    当年苦思不得其解
    幸亏一同学
    一句“升级”点醒我梦中人不过说实话
    升级后是没什么问题了