如何利用程序动态创建数据库?(sql)
并自动创建表到数据库中、同时将基础表中的数据也导入到相应的表中?

解决方案 »

  1.   

    写SQL语句用数据库文件附加上去
      

  2.   

    我建议用拷贝的方式,然后用附加数据库,这样快点,我一直都是这样做的,顺便给你个例子:
    procedure TFrmDB.ButCreateClick(Sender: TObject);
    Var SourceFileName1,SourceFileName2,DestFileName1,DestFileName2: String;
    begin
       if Trim(Edit.Text)<> '' then   //检查路径
       begin
       //数据库名可随便取,但数据文件名不可更改
       SourceFileName1:=ExtractFilePath(paramstr(0))+'\data\DataBase_data.MDF';
       SourceFileName2:=ExtractFilePath(paramstr(0))+'\data\DataBase_Log.LDF';
       DestFileName1:=Trim(Edit.Text)+'DataBase_data.MDF';
       DestFileName2:=Trim(Edit.Text)+'DataBase_data.LDF';
       with TMemoryStream.Create do
       try  //拷贝文件
       LoadFromFile(SourceFileName1);
       SaveToFile(DestFileName1);
       LoadFromFile(SourceFileName2);
       SaveToFile(DestFileName2);
       try  //执行附加数据库命令,edtdbname.text是数据库名,由用户自定
       ADOQuery.SQL.Clear;
       ADOQuery.SQL.Add('exec sp_attach_Db @dbname = N'''+Trim(EdtDBName.Text)+''','
                               +'@filename1 = N'''+DestFileName1+''','
                               +'@filename2 = N'''+DestFileName2+'''');
       ADOQuery.ExecSQL;
       Application.MessageBox('创建成功!','恭喜');
       except
         Application.MessageBox('创建失败,检查数据库连接','创建失败');
       end;
     except
     Application.MessageBox('创建失败,检查硬盘是否有写入权限!','创建失败'); //可以提前
     Free;
       end;
       end;
    end;