如何由查询ACCESS的结果生成ACCESS文件,即生成一个新的表格然后存储成一个mdb文件!
以下代码编译出错:找不到可安装的ISAM。
急!谢谢procedure  TForm1.RzCreateBtnClick(Sender:  TObject);
var
   AppPath,tablename,x,y,z,str,sqlstr:string;  
   CreateAccess,NewTable,CUM:Variant;  
begin  
       tablename:=DateTimeToStr(Now);
       x:=copy(tablename,17,2);  
       y:=copy(tablename,20,2);  
       z:=copy(tablename,23,2);
       tablename:='库'+copy(tablename,1,10)+'-'+x+y+z;  
       AppPath:=ExtractFilePath(paramstr(0));  
       CreateAccess:=CreateOleObject('ADOX.Catalog');
       CreateAccess.Create('Provider=Microsoft.Jet.OLEDB.4.0;Password="";Data Source='+AppPath+'\'+tablename+'.mdb');
       showmessage('数据库创建成功!');         ADOQuery1.ConnectionString:='';
       ADOQuery1.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Password="";Data  Source='+AppPath+'\'+Tablename+'.mdb';
       ADOQuery1.Close;  
       tablename:=DateTimeToStr(Now);  
       x:=copy(tablename,17,2);
       y:=copy(tablename,20,2);
       z:=copy(tablename,23,2);  
       tablename:='表'+x+y+z;  
       sqlstr:='Create  Table  ';  
       sqlstr:=sqlstr+tablename+'  (ID  int  NOT  NULL,Name  varchar(50)  NOT  NULL,Type  varchar(50)  NULL,';  
       sqlstr:=sqlstr+'length  int  NULL,CFormula  text  NULL,EFormula  text  NULL,Bvalue  varchar(50)  NULL';  
       sqlstr:=sqlstr+',Nodetype  varchar(50)  NULL,Parent  int  NULL,sort  int  NULL,Visible  bit,SB  bit,Readonly  bit)';  
       With  ADOQuery1  Do  
       Begin  
           Close;  
           SQl.Clear;  
           SQl.add(sqlstr);  
           open;  
       End;  
end; 
function  CreateDatabase(mDatabaseName:  string):  Boolean;  
var  
   CreateAccess:  OLEVariant;  
begin  
   Result  :=  False;  
   try  
       CreateAccess  :=  CreateOleObject('ADOX.Catalog');  
       try  
           CreateAccess.Create(Format('Provider=Microsoft.Jet.OLEDB.4.0;Password="";Data  Source=%s%s.mdb',[ExtractFilePath(paramstr(0)),  mDatabaseName]));
       finally
           CreateAccess  :=  Unassigned;
       end;  
   except
       Exit;
   end;
   Result  :=  True;  
end;function  CreateTable(mDatabaseName:  string;  mADOQuery:  TADOQuery):  Boolean;  
begin  
   Result  :=  False;  
   try  
       mADOQuery.Close;
       mADOQuery.ConnectionString  :=  Format(
           'Provider=Microsoft.Jet.OLEDB.4.0;Password="";Data  Source=%s%s.mdb',
           [ExtractFilePath(paramstr(0)),  mDatabaseName]);
       mADOQuery.SQL.Text  :=  'CREATE  TABLE  Table1  (Field1  varchar(10),  Field2  varchar(10))';
       mADOQuery.ExecSQL;  
   except  
       Exit;  
   end;  
   Result  :=  True;  
end;  procedure  TForm1.Button1Click(Sender:  TObject);  
begin  
   DeleteFile( ExtractFilePath(paramstr(0))  +  'test.mdb' );
   CreateDatabase('test');  
   CreateTable('test',  ADOQuery1);  
end;end.

解决方案 »

  1.   

    提供我自己使用的几个函数:1. 建立 mdb 文件:
    // 需要在 use: comobj、Variants
    function CreateMDBFile(const filename:string):boolean;
    var
      cat:Variant;
    begin
      result:=true;
      try
        cat:=CreateOleObject('ADOX.Catalog');
        cat.Create(Format(cCreateMDB,[filename]));
        cat:=Unassigned;
      except
        result:=false;
      end;
    end;2. 连接 mdb 文件:
    function TSeaFun.ConnMDB(Conn: TADOConnection; FileName: string;
      var sErr: string): boolean;
    var
      str:string;
    begin
      //判断连接控件是否存在
      if not Assigned(Conn) then
      begin
        result:=false;
        sErr:='所需 TADOConnection 控件不存在';
        exit;
      end;
      
      //连接 mdb 数据库
      str:='Provider=Microsoft.Jet.OLEDB.4.0;'+
           'Data Source='+filename+';'+
           'User Id=admin;Password=';
      try
        Conn.Close;
        Conn.LoginPrompt:=false;
        Conn.ConnectionString:=str;
        Conn.Open;
      except
        result:=false;
        sErr:=GetConnErrs(Conn); // GetConnErrs() 是一个从 conn 中提取错误信息的函数
        exit;
      end;  result:=true;
    end;3. 在 Conn 上面执行sql 语句的函数
    function TSeaFun.RunSQL(sql: string; var sErr: string;
      Conn: TADOConnection; CanTran: boolean): boolean;
    begin
      sErr:='';
      
      result:=false;
      if not Assigned(Conn) then
      begin
        if Assigned(DBConn) then
          Conn:=DBConn
        else
          exit;
      end;  if CanTran then
        Conn.BeginTrans;    
      try
        Conn.Execute(sql);
        if CanTran and Conn.InTransaction then
          Conn.CommitTrans;
        result:=true;
      except
        if CanTran and Conn.InTransaction then
          Conn.RollbackTrans;
        sErr:=GetConnErrs(Conn);
        raise exception.Create('发生错误!'#13#10#13#10+sErr);
        exit;
      end;
    end;---------------------------------------
    上面三个函数可以是实现文件的建立、连接、执行sql 对于导数据的方法,可以参考 delphibbs.com 上的一片文章:http://www.delphibbs.com/delphibbs/dispq.asp?lid=1691966
      

  2.   

    上面的函数是我从我的 TSeaFun 类中提出来的,有几个变量和函数需要注意
    当然,您自己理解就可以了,不要照抄代码
      

  3.   

    出错?什么提示啊?
    有没有在 uses 中加入几个单元文件啊?
      

  4.   

    修改了一下,建库成功,可以找到建好的空库。但是还是在建表执行到open时提示:没有可安装的ISAM。个人觉得是SQL出错,各位帮忙看看:
    procedure  TForm1.RzCreateBtnClick(Sender:  TObject);
    var
       AppPath,tablename,x,y,z,str,sqlstr:string;  
       CreateAccess,NewTable,CUM:Variant;  
    begin
           tableName := 'abc.mdb';
           AppPath:=ExtractFilePath(paramstr(0));
           CreateAccess:=CreateOleObject('ADOX.Catalog');
           if FileExists( ExtractFilePath(paramstr(0)) + tableName ) then
               deletefile(ExtractFilePath(paramstr(0)) + tableName );
           CreateAccess.Create('Provider=Microsoft.Jet.OLEDB.4.0;Password="";Data Source='+AppPath+'\'+tablename);
           showmessage('数据库创建成功!');             ADOQuery1.ConnectionString:='';
           ADOQuery1.Close;
           sqlStr := 'CREATE  TABLE  MyTable (Field1  varchar(10),  Field2  varchar(10))';          //该句放到ACCESS下编译成功生成表MyTable
           With  ADOQuery1  Do
           Begin
               Close;
               SQl.Clear;
           ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Password="";Persist Security Info=True;Data Source='+AppPath+'\'+Tablename;
               SQl.add(sqlstr);
               open;
           End;  
    end;