我用的是Sql server 7.0+delphi 开发了一个程序,现在想打包,希望能把数据库结构,初始数据一次性在安装程序的时候给客户装好,客户上的Sql server 已经装好了。请问哪位有高见,请指教!

解决方案 »

  1.   

    你的意思是安装的时候自动建立数据库和在数据库中写入一些数据?
    这就必须自己编写安装程序了,用 query来运行 sql语句
      

  2.   

    自动建库怎么用代码来做呢?
    我们发布一般都是把Sql Server 中的库备份文件或用.LDF和.MDF文件,但是怎么把他们回导到库里去?
    听说可以用sql的工具osql执行一段sql就可以。我去试一下,这个问题我都忘了来看了。
      

  3.   

    用delphi 写个 执行sql语句来初始化数据库 ,比如 建库,建表, 最好是那些执行语句写成一个。sql文件delphi调用执行它 问题是怎么样 把程序安装上去的时候 SQL SERVER也装上去了 ?
      

  4.   

    我好像见过这样的,他会自带一个osql.exe文件,应该是调用这个执行Sql语句吧,不过你说的用delphi写一个应该行的。那是不是也是写一个数据库初始化程序,让安装完后自动执行呢。
    这个问题已经不急,来跟大家讨论讨论。
    另外,我在cmd下执行osql老是不成功,不知道怎么回事,
      

  5.   

    Delphi的ADO控件可以运行由Sqlserver管理器生成的Sql脚本。
      

  6.   

    程序初始化,过程中,将数据库附加到SQL SERVER 服务器上。
    打包工具,最好只完成文件拷贝等常规工作。这样应该比较好·
      

  7.   

    用InstallShield打包,自已写一个添加数据库和数据库的小程序,在安装程序中调用。
      

  8.   

    附加数据库程序
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, Buttons,ADODB, DB, DBTables, ExtCtrls;type
      TForm1 = class(TForm)
        BitBtn1: TBitBtn;
        OpenDialog1: TOpenDialog;
        Edit1: TEdit;
        SpeedButton1: TSpeedButton;
        Label1: TLabel;
        SpeedButton2: TSpeedButton;
        Edit2: TEdit;
        Label2: TLabel;
        OpenDialog2: TOpenDialog;
        BitBtn2: TBitBtn;
        DB: TDatabase;
        Bevel1: TBevel;
        Label3: TLabel;
        Edit3: TEdit;
        procedure SpeedButton1Click(Sender: TObject);
        procedure SpeedButton2Click(Sender: TObject);
        procedure BitBtn2Click(Sender: TObject);
        procedure BitBtn1Click(Sender: TObject);
        procedure Edit1Change(Sender: TObject);
        procedure Edit2Change(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}
    procedure FJdatabase(Databasename,MDF,LDF:string;var fjmessage:integer);//附加数据库
    var ADOCommand:TADOCommand;
        sqltxt,cstr:string;
    begin
    ADOCommand:=TADOCommand.create(application.owner);
    try
    cstr:='Provider=SQLOLEDB.1;';
    cstr:=cstr+'Persist Security Info=False;';
    cstr:=cstr+'User ID=sa;';
    cstr:=cstr+'Initial Catalog=master;';
    cstr:=cstr+'Data Source=(local)';
    try
    ADOCommand.ConnectionString:=cstr;
    except
    fjmessage:=0;
    exit;
    end;
    sqltxt:='IF EXISTS (SELECT * FROM sysdatabases WHERE name = '''+Databasename+''')'+chr(10);
    sqltxt:=sqltxt+'BEGIN'+chr(10);
    sqltxt:=sqltxt+'DROP database '+Databasename+chr(10);
    sqltxt:=sqltxt+'END;'+chr(10);
    ADOCommand.CommandText:=sqltxt;
    ADOCommand.Execute;
    sqltxt:='EXEC sp_attach_db @dbname = N'''+Databasename+''','+chr(10);
    sqltxt:=sqltxt+'   @filename1 = N'''+MDF+''','+chr(10);
    sqltxt:=sqltxt+'   @filename2 = N'''+LDF+''''+chr(10);
    ADOCommand.CommandText:=sqltxt;
    ADOCommand.Execute;
    fjmessage:=1;
    finally
    ADOCommand.free;
    end;
    end;procedure TForm1.SpeedButton1Click(Sender: TObject);
    begin
    OpenDialog1.InitialDir:=extractfilepath(Application.exename)+'data\';
    if OpenDialog1.Execute then
    edit1.Text:= OpenDialog1.FileName;
    end;procedure TForm1.SpeedButton2Click(Sender: TObject);
    begin
    OpenDialog2.InitialDir:=extractfilepath(Application.exename)+'data\';
    if OpenDialog2.Execute then
    edit2.Text:= OpenDialog2.FileName;
    end;procedure TForm1.BitBtn2Click(Sender: TObject);
    begin
    close;
    end;procedure TForm1.BitBtn1Click(Sender: TObject);
    var ADOQuery:TADOQuery;
        cstr,sqltxt:string;
        fjmessage:integer;
    begin
    cstr:='Provider=SQLOLEDB.1;';
    cstr:=cstr+'Persist Security Info=False;';
    cstr:=cstr+'User ID=sa;';
    cstr:=cstr+'Initial Catalog=master;';
    cstr:=cstr+'Data Source=(local)';
      ADOQuery:=TADOQuery.create(application.owner);
      ADOQuery.ConnectionString:=cstr;
    try
      sqltxt:='SELECT * FROM sysdatabases WHERE name ='''+edit3.Text+'''';
      ADOQuery.SQL.Clear;
      ADOQuery.SQL.Add(sqltxt);
      ADOQuery.open;
      if ADOQuery.RecordCount=0 then
      begin
    fjdatabase(edit3.Text,edit1.Text,edit2.Text,fjmessage);
    if fjmessage=1 then
    Application.MessageBox('数据库添加成功!','成功',MB_OK)
    else
    Application.MessageBox('数据库添加失败!','错误',MB_OK);
    end else Application.MessageBox('该数据库已经存在,不能创建!','错误',MB_OK);finally
    ADOQuery.free;
    end;
    end;procedure TForm1.Edit1Change(Sender: TObject);
    begin
    edit1.Hint:=edit1.Text;
    edit1.ShowHint:=true;
    end;procedure TForm1.Edit2Change(Sender: TObject);
    begin
    edit2.Hint:=edit2.Text;
    edit2.ShowHint:=true;
    end;end.
      

  9.   

    zdq801104(我很笨,但是我不傻!) 真牛
      

  10.   

    也可以写好脚本,安装时调用个批处理
    inst_uidb70.bat
    echo installing UIDB, please wait...isql -Usa -P -i"2.´´½¨ÀúÊ·»°µ¥µÄÊý¾Ý¿â±í70.SQL"
    isql -Usa -P -i"3.´´½¨ICDƽ̨Êý¾Ý¿â±íProxyµ÷Óò¿·Ö70.SQL"
    isql -Usa -P -i"4.´´½¨ICDƽ̨Êý¾Ý¿â±í¹ÜÀį́²¿·Ö70.SQL"
    isql -Usa -P -i"5.´´½¨Êý¾Ý¿âË÷Òý70.SQL"
    isql -Usa -P -i"6.´´½¨ICDƽ̨Êý¾Ý¿â´æ´¢¹ý³ÌProxyµ÷Óò¿·Ö70.SQL"
    isql -Usa -P -i"7.´´½¨ICDƽ̨Êý¾Ý¿â´æ´¢¹ý³Ì¹ÜÀį́²¿·Ö70.SQL"
    isql -Usa -P -i"8.´´½¨Öʼį̀Óô洢¹ý³Ì70.sql"
    isql -Usa -P -i"9.´´½¨Óû§¼°ÊÚȨ70.sql"
    isql -Usa -P -i"11.ͨÓñ¨±í½Ó¿Ú´æ´¢¹ý³Ì70.sql"
    cmd.exe /C "del c:\uidb_temp\INST_UIDB70.bat"
    echo the installation end.