动态创建一个VFP表。通过ADOQUERY和数据源outinterface连接。outinterface是ODBC的一个连接VFP的数据源
ADOQUERY。的SQL语句为: create table table1 (aa char(20) null,bb char(30) null)执行sql语句 ADOQUERY.ExecSQL 后在outinterface指定的目录下没有表table1创建。可是也没有任何错误。可是下面的方法却可以: 用一个savedialog选择一个目录。选择好以后创建一个ODBC数据源outinterface 然后在执行上面同样的SQL语句。结果却有表出现。不知道是什么原因。还请大家赐教。。

解决方案 »

  1.   

    procedure TForm1.FormShow(Sender: TObject);
    begin
      ADOConnection1.ConnectionString:= 'Provider=MSDASQL.1;Persist Security Info=False;Data Source=OutInterface';end;//动态创建一个ODBC数据源
    function TFormMain.CreateVfpDsn(aDsnName, aPath: string;
      isDb: boolean): integer;
    const
      vfpDriver='vfpodbc.dll';
      AccessDriver='odbcjt32.dll';
      SQLDriver='sqlsrv32.dll';
    var
      MyRegister:TRegistry;
      SysDir:array[0..255]of char;
      systemPath:string;
    begin
      GetSystemDirectory(SysDir,255);
      systemPath:=SysDir;
      try
        MyRegister:=TRegistry.Create; //建立一个Registry实例
        with MyRegister do
        begin
          RootKey:=HKEY_CURRENT_USER; //设置根键值为HKEY_CURRENT_USER
          if OpenKey('Software\ODBC\ODBC.INI\ODBC Data Sources',True) then //找到Software\ODBC\ODBC.INI\ODBC Data Sources      writeString(aDsnName,'Microsoft visual FoxPro Driver');
          CloseKey;
          if OpenKey('Software\ODBC\ODBC.INI\'+aDsnName,true) then
          begin
            writeString('BackgroundFetch','yes');
            writeString('Collate','Machine');
            writeString('Deleted','yes');
            writeString('Description','');
            writeString('driver',systemPath+'\'+vfpDriver);
            writeString('Exclusive','No');
            writeString('Null','yes');
            writeString('SetNoCountOn','No');
            writeString('SourceDB',aPath);
            if isDb then
              writeString('SourceType','DBC')
            else
              writeString('SourceType','DBF');
          end;
          CloseKey;
        end;
      finally
        MyRegister.Free;
      end;
    end;//连接数据源并且执行SQL语句  有故障
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      CreateVfpDsn('OutInterface','c:\',false);  
      ADOQuery1.Connection:= ADOConnection1;
      ADOQuery1.Close;
      ADOQuery1.SQL.Clear;
      ADOQuery1.SQL.Add('create table table1 (aa char(20) null,bb char(30) null)');
      ADOQuery1.ExecSQL;
    end;procedure TForm1.Button2Click(Sender: TObject);//这个竟然就可以了。
    begin
      SaveDialog.Filter:= 'VFP 文件(dbf)|*.dbf';
      if SaveDialog.Execute then
      begin
        ODBCPath.Text:= ExtractFilePath(SaveDialog.FileName);
        CreateVfpDsn('OutInterface',ODBCPath.Text,false);
      end;
      ADOQuery1.Connection:= ADOConnection1;
      ADOQuery1.Close;
      ADOQuery1.SQL.Clear;
      ADOQuery1.SQL.Add('create table table1 (aa char(20) null,bb char(30) null)');
      ADOQuery1.ExecSQL;
    end;//这个是部分代码。完全能表现我说的现象。
      

  2.   

    为什么不采用通过在 ADOCONNECTION 中指定工作目录的方法呢?
      

  3.   

    我用BDE连VFP也总是出错,很郁闷,BLD也不再升级BDE了
      

  4.   

    peterluolaw 你能否举例以说明?