1.你可以写一个程序在这个程序中将数据库建立起来,我们可以使用MSSQL的管理其生成每一个数据的SQL脚本,然后在程序中将这些脚本读取到程序中顺序执行,这样就可以在程序中建立数据库了,有一点要注意的是,看是没有Create数据库,你只能在Master数据库中建立目标数据库,然后你就需要通过一条Use database的语句来将当前数据库切换到你的目标数据库,然后再执行Create Table,Create View等建立数据库SQL语句。不过只能建立数据库的基本结构。
还有一种方法是充分利用SQL语句Restore Database的语句来建立数据库,这样就可以建立起包括数据在内的数据库,不过通用性不好。

解决方案 »

  1.   

    最近我也在考虑1.这个问题!
    但是在MASTER库和自己定义的库之间怎么做还是比较模糊!
    WINGSUN 能不能详细说明一下!!
      

  2.   

    WINGSUN :
      能不能详细说说如何用程序执行一段Sql语句?
      

  3.   

    用SQL语句CREATE、RESTORE数据库。
      

  4.   

    1
    declare @sql=nvarchar(1000)
    create datebase 'yourdbname'
    go
    select @sql='use yourdbname'
    select @sql=char(13)+@sql+'create table ....'
    select @sql=char(13)+@sql+'go'..............exec (@sql)
      

  5.   


        Dim cnn As New ADODB.Connection
        Dim rs As New ADODB.Recordset
        Dim strSql As String
    On Error GoTo errlabelstrPwd & "'"
        cnn.ConnectionString = CNN_STR
        cnn.CursorLocation = adUseClient  '客户端游标, 此时无法看见其他用户所作的添加、更改和删除
    ‘  cnn.CursorLocation=adUseServer   '服务器游标,OK
    '    cnn.Mode = adModeRead
        cnn.Open
        rs.Open strSql, cnn, adOpenDynamic, adLockBatchOptimistic关于ADO的使用可参考msdn,不过msdn98的太老,msdn2000有最新的特性说明
      

  6.   

    你也可以先把数据库作好,然后把文件(数据、日志)随Setup发行,然后使用
    EXECUTE sp_attach_db @dbname    = N'<database_name, sysname, test_db>', 
             @filename1 = N'<filename1, nvarchar(260), c:\program files\microsoft sql server\mssql\data\test_db.mdf>',
             @filename2 = N'<filename2, nvarchar(260), c:\program files\microsoft sql server\mssql\data\test_db_log.ldf>'
    GO把数据库挂上/.
      

  7.   

    不好意思,前段时间出差去了,现在才回来。我的办法可能比较笨了点,在SQL Server中为每一个数据库生成相应的脚本,然后去掉其中的一些注释性的语句和其他的一些Go语句。然后在你的程序中依次读出每一条SQL语句然后执行就可以了。建立数据库时(Create Database)应该在Master数据库中建立,然后你的任务是建立数据库中的每一张表,所以你需要讲你当前的数据库操作切换到你的目标数据库去(使用Use Yourdatabase语句),然后就是建立你的数据表单
      

  8.   

    1、先连接MASTER ,CAEATE DATABASE,USER,授权
    2、连接USER,创建TBALE、VIEW等
      

  9.   

    给你一个Delphi做的程序段。
    它会根据AllSqlLine的内容,一行一行执行建库。AllSqlLine是有SQL Server 7.0自动生成
    的。分段依据是“GO”。   :)var
      DbName: String;
      OldDbExist: Boolean;
      ErrStr, ErrMsg: String;
      ErrCode: Integer;
      AllSqlLine: TStrings;
      ThisSqlLine: TStrings;
      i, j: Integer;
    begin
      if not CheckBoxConnect.Checked then
      begin
        MessageDlg('请先选择“连接数据库”!', mtWarning, [mbOk], 0);
        Exit;
      end;  DbName := EditDataBaseName.Text;
      if MessageDlg(
        '注意, 请确认:' + #13 +
        '数据库' + DbName + '现在无其他用户在使用' + #13 + #13 +
        '开始建库吗?', mtConfirmation, mbOKCancel, 0) = mrCancel then
        Exit;
      MemoCreateDbMsg.Clear;  MemoCreateDbMsg.Lines.Add('正在建立数据库...');  // 检测指定数据库是否已经存在
      with DataModuleAv.QueryCreateDb.SQL do
      begin
        Clear;
        Add('BEGIN');
        Add('  USE ' + DbName);           // 尝试打开指定库
        Add('  USE ' + FMasterDb);
        Add('END');
      end;
      OldDbExist := True;
      try
        DataModuleAv.QueryCreateDb.ExecSQL;
      except // 打开数据库失败?
        OldDbExist := False;
      end;  if OldDbExist then // 已有此库?
      begin // 删除旧库
        if MessageDlg(
          '数据库"' + DbName + '"已存在, 覆盖吗?', mtWarning, mbOKCancel, 0)
          <> mrOK then
          begin
            MemoCreateDbMsg.Lines.Add('数据库"' + DbName + '"已存在, 取消操作。');
            Exit;
          end;
        DataModuleAv.QueryCreateDb.SQL.Text := ('DROP DATABASE ' + DbName);
        try
          DataModuleAv.QueryCreateDb.ExecSQL;
        except // 删除错误
          // 查找出错代码
          DataModuleAv.QueryCreateDb.SQL.Text := ('SELECT @@ERROR AS ErrCode');
          DataModuleAv.QueryCreateDb.Open;
          ErrStr := DataModuleAv.QueryCreateDb.FieldByName('ErrCode').AsString;
          if StrToInt(ErrStr) = 3702 then
            ErrStr := ErrStr + ': (数据库正被其他用户使用)';
          MessageDlg(
            '无法删除旧数据库! ' + #13 +
            '错误代码: ' + ErrStr,
            mtError, [mbOk], 0);
          Exit;
        end;
      end;  // 建立新数据库
      DataModuleAv.QueryCreateDb.SQL.Text := 'CREATE DATABASE ' + DbName;
      try
        DataModuleAv.QueryCreateDb.ExecSQL;
      except
        MemoCreateDbMsg.Lines.Add('数据库建立错误!');
        DataModuleAv.QueryCreateDb.SQL.Text := ('SELECT @@ERROR AS ErrCode');
        DataModuleAv.QueryCreateDb.Open;
        ErrCode := DataModuleAv.QueryCreateDb.FieldByName('ErrCode').AsInteger;
        MemoCreateDbMsg.Lines.Add('错误代码: ' + IntToStr(ErrCode));
        if ErrCode=262 then
          MemoCreateDbMsg.Lines.Add('提示信息: 用户权限不够')
        else if ErrCode=1802 then
          MemoCreateDbMsg.Lines.Add(
            '提示信息: SQL Server内部错误! 要创建的数据库文件已存在,请先手工删除。'
            );
        Exit;
      end;  DataModuleAv.QueryCreateDb.SQL.Text := 'USE ' + DbName;
      DataModuleAv.QueryCreateDb.ExecSQL;  AllSqlLine := TStringList.Create;
      ThisSqlLine := TStringList.Create;
      try
        AllSqlLine.LoadFromFile(GetRunPath + 'CreateDb.SQL');
      except
        MemoCreateDbMsg.Lines.Add('文件打开错误: ' + GetRunPath + 'CreateDb.SQL');
        Exit;
      end;  i := 0;
      while TRUE do
      begin
        if ExpandSqlLines(AllSqlLine, i, ThisSqlLine) then
          Break;
        DataModuleAv.QueryCreateDb.SQL := ThisSqlLine;    try
          DataModuleAv.QueryCreateDb.Params.Clear;
          DataModuleAv.QueryCreateDb.ExecSQL;
        except
          on E: Exception do
          begin
            ErrMsg := E.Message;
            DataModuleAv.QueryCreateDb.SQL.Text := ('SELECT @@ERROR AS ErrCode');
            DataModuleAv.QueryCreateDb.Open;
            ErrStr := DataModuleAv.QueryCreateDb.FieldByName('ErrCode').AsString;        MemoCreateDbMsg.Lines.Add('创建数据库失败!');
            MemoCreateDbMsg.Lines.Add('错误信息: ' + ErrMsg);
            MemoCreateDbMsg.Lines.Add('错误代码: ' + ErrStr);
            MemoCreateDbMsg.Lines.Add('-----产生错误的SQL语句-----(第'+IntToStr(i+1)+'个命令)。');
            for j:=0 to ThisSqlLine.Count-1 do
              MemoCreateDbMsg.Lines.Add(ThisSqlLine[j]);
            MemoCreateDbMsg.Lines.Add('---------------------------');
            Exit;
          end;
        end;
        Inc(i);
      end;  //Add the data into some tables
      //first is into the table tree
      MemoCreateDbMsg.Lines.Add('正在设定初始数据...');
      try
        AllSqlLine.LoadFromFile(GetRunPath + 'InitData.sql');
      except
        MemoCreateDbMsg.Lines.Add('文件打开错误: ' + GetRunPath + 'InitData.sql');
        Exit;
      end;
      i := 0;
      while TRUE do
      begin
        if ExpandSqlLines(AllSqlLine, i, ThisSqlLine) then
          Break;
        DataModuleAv.QueryCreateDb.SQL := ThisSqlLine;    try
          DataModuleAv.QueryCreateDb.ExecSQL;
        except
          DataModuleAv.QueryCreateDb.SQL.Text := ('SELECT @@ERROR AS ErrCode');
          DataModuleAv.QueryCreateDb.Open;
          ErrStr := DataModuleAv.QueryCreateDb.FieldByName('ErrCode').AsString;      MemoCreateDbMsg.Lines.Add('创建数据库失败!');
          MemoCreateDbMsg.Lines.Add('错误代码: ' + ErrStr);
          MemoCreateDbMsg.Lines.Add('-----产生错误的SQL语句-----(第'+IntToStr(i+1)+'个命令)。');
          for j:=0 to ThisSqlLine.Count-1 do
            MemoCreateDbMsg.Lines.Add(ThisSqlLine[j]);
          MemoCreateDbMsg.Lines.Add('---------------------------');
          Exit;
        end;
        Inc(i);
      end;
      MemoCreateDbMsg.Lines.Add('建库成功...');
    end;
      

  10.   

    请到http://www.etechbase.net/advsearch.php,将你这个问题输入到检索框,然后选择准确匹配查询,应该可以帮助你解决这个问题的。