如何在程序中用 数据库的备份文件 创建数据库?环境:已装SQL Server
    
  数据库名和数据文件存放路径动态提供

解决方案 »

  1.   

    偶初学,只知道在sqlserver中用备份创建数据库啊,还不知道在程序中怎么实现呢
      

  2.   

    --创建数据库(查查CREATE DATABASE)
    CREATE DATABASE Sales
    ON 
    ( NAME = Sales_dat,
       FILENAME = 'c:\program files\microsoft sql server\mssql\data\saledat.mdf',
       SIZE = 10,
       MAXSIZE = 50,
       FILEGROWTH = 5 )
    LOG ON
    ( NAME = 'Sales_log',
       FILENAME = 'c:\program files\microsoft sql server\mssql\data\salelog.ldf',
       SIZE = 5MB,
       MAXSIZE = 25MB,
       FILEGROWTH = 5MB )
    --恢复数据库(RESTORE DATABASE)
    RESTORE DATABASE Sales--名称
       FROM TAPE = '\\.\tape0'--路径
      

  3.   

    //检查数据库是否存在,b并恢复
    procedure TLoginForm.InitDatabase(); 
    var
        FileName:string;
    begin
        CreateDir('c:\DataBaseData');    DM.ADOQuery.CommandTimeout := 500000;
        FileName := gsProgramPath+'\Backup';
        try
            ExecuteSql('use master');
            ExecuteSql(Format('RESTORE DATABASE %s FROM DISK =''%s''  with replace',[g_sDefaultdb,FileName]));
            ExecuteSql(Format('backup log %s with no_log',[g_sDefaultdb]));
            ExecuteSQL(Format('use %s',[g_sDefaultdb]));
        except
            bsSkinMessage1.MessageDlg('初始化数据库失败,请检查数据库是否安装完整!',mtInformation,[mbOK],0);
            Application.Terminate;
        end;
    end;
      

  4.   

    procedure TForm1.Button5Click(Sender: TObject);//还原之前必须先得到逻辑文件名
    var sqlstr :string;
    begin
       ADOQuery1.ConnectionString :='Provider=SQLOLEDB.1;Password='+EDIT3.TEXT+';Persist Security Info=True;User ID='+EDIT2.TEXT+';Initial Catalog=master;Data Source='+Edit1.TEXT+'';//连接数据库
       with ADOQuery1 do
       begin
         if active then close;
         sql.clear;
         sqlstr :=' RESTORE FILELISTONLY FROM DISK = '+QuotedStr(Edit13.text) ;//得到逻辑文件名
         sql.Add(sqlstr);
         open;
         first;
         Edit12.text:= fields[0].asstring;
         next;
         Edit14.text := fields[0].asstring ;
         close;
       end;
    end;procedure TForm1.Button4Click(Sender: TObject);//还原成新的数据库
    var sqlstr :string;
    begin
       sqlstr :='RESTORE DATABASE '+Edit10.text;
       sqlstr :=sqlstr+' FROM DISK = '+QuotedStr(Edit13.text);//备份文件位置
       sqlstr :=sqlstr+' WITH MOVE '+QuotedStr(Edit12.text)+' TO '+QuotedStr(Edit11.text)+',';//mdf逻辑文件名Edit12.text,新的mdf存放位置Edit11.text
       sqlstr :=sqlstr+' MOVE '+QuotedStr(Edit14.text)+' TO '+QuotedStr(Edit15.text);//log逻辑文件名Edit14.text,新的log存放位置Edit12.text
       ADOCommand1.ConnectionString:='Provider=SQLOLEDB.1;Password='+EDIT3.TEXT+';Persist Security Info=True;User ID='+EDIT2.TEXT+';Initial Catalog=master;Data Source='+Edit1.TEXT+'';
       ADOCommand1.CommandText:=sqlstr;
       ADOCommand1.Execute;
         showmessage('执行成功'); 
    end;
      

  5.   

    procedure TForm1.Button1Click(Sender: TObject);
    var S:String;
    begin
      s:='EXEC sp_attach_db @dbname = N'+char(39)+'数据库名'+char(39)+','+
            '@filename1 = N'+char(39)+ExtractFilePath(paramstr(0))+'数据库名_Data.MDF'+char(39)+
              ','+'@filename2 = N'+char(39)+ExtractFilePath(paramstr(0))+'数据库名_Log.LDF'+char(39);
      ADOCommand.CommandText := s;
      ADOCommand.Execute();
      Messagebox(handle,'数据库安装成功!','提醒',MB_OK+MB_ICONINFORMATION);
    end;
      

  6.   

    如ron_xin(星雨)所言,先连接到MASTER数据库,然后用CREATE DATABASE及RESTORE DATABASE进行还原
      

  7.   


    ron_xin(星雨) 
    sqlstr :='RESTORE DATABASE '+Edit10.text;
    _______
    如果Edit10.text和备份数据库里的数据库名称不一样会出错!
    Error:
    服务器: 消息 3141,级别 16,状态 1,行 1
    要还原的数据库先前命名为 'bs2'。请用 WITH REPLACE 选项重新发出该语句以重写数据库 'selfdb'。
    服务器: 消息 3013,级别 16,状态 1,行 1
    RESTORE DATABASE 操作异常终止。
      

  8.   

    procedure TForm1.Button5Click(Sender: TObject);//还原之前必须先得到逻辑文件名
    var sqlstr :string;
    begin
       ADOQuery1.ConnectionString :='Provider=SQLOLEDB.1;Password='+EDIT3.TEXT+';Persist Security Info=True;User ID='+EDIT2.TEXT+';Initial Catalog=master;Data Source='+Edit1.TEXT+'';//连接数据库
       with ADOQuery1 do
       begin
         if active then close;
         sql.clear;
         sqlstr :=' RESTORE FILELISTONLY FROM DISK = '+QuotedStr(Edit13.text) ;//得到逻辑文件名
         sql.Add(sqlstr);
         open;
         first;
         Edit12.text:= fields[0].asstring;
         next;
         Edit14.text := fields[0].asstring ;
         close;
       end;
    end;//你没有执行这个事件,代码是经过测试的...留下Email我可以发给你原代码
      

  9.   

    bs2是备份文件里的数据库名称
    selfdb是新创建的数据库名称 如果用 WITH REPLACE 选项重新发出该语句以重写数据
    备份文件里的数据库名称如何获取?
      

  10.   

    ^_^  现在好了,  谢谢大家的支持 !!! ron_xin(星雨) :在下面的后面最加  ‘,REPLACE’就好了,
       sqlstr :='RESTORE DATABASE '+Edit10.text;
       sqlstr :=sqlstr+' FROM DISK = '+QuotedStr(Edit13.text);//备份文件位置
       sqlstr :=sqlstr+' WITH MOVE '+QuotedStr(Edit12.text)+' TO '+QuotedStr(Edit11.text)+',';//mdf逻辑文件名Edit12.text,新的mdf存放位置Edit11.text
       sqlstr :=sqlstr+' MOVE '+QuotedStr(Edit14.text)+' TO '+QuotedStr(Edit15.text);//log逻辑文件名Edit14.text,新的log存放位置Edit12.text
       sqlstr :=sqlstr+‘,REPLACE’  **********
    结帖了 !!! 
      

  11.   

    ron_xin(星雨) 你QQ多少啊,或是QQ群也可以,以后还想请多帮忙呢我的QQ:155147