可以做一个安装程序把自己的程序安装到机器上,数据库(SQL Server2000已安装到机器上)能不能也在这个过程安装上呢,就是把所有的表和存储过程也建好,这个能用什么安装程序做上去呢?
另外,用于数据库连接的字符串如“DSN=db;UID=test;PWD=123”大家是怎么设置的呢?是定死在程序中还是写在配置文件中,用户可更改也可以看见呢?

解决方案 »

  1.   

    当然可以,用installshield可以做到
      

  2.   

    首先SQL Server2000肯定是要装的了,对于你的数据库表啊什么的是可以用自动安装的(看看Setup API)
      

  3.   

    当然可以。你可以把整个数据库导成sript语句,然后在你的安装程序中执行这些sript就可以了。
      

  4.   

    to fantong(迷茫中的 饭桶) 
    能不能具体一点啊to ytweiwei(爱江山憎恨美人) 
    看MSDN的API吗?
      

  5.   

    你可以用installshield做安装程序,程序中调用sql server的工具isqlw来生成数据库及运行脚本。当然你也可以通过ado来生成数据库。
       下面是我做这个的时候,别人给我的指导。
    http://www.csdn.net/expert/topic/652/652012.xml?temp=.6688349
    http://www.csdn.net/expert/topic/644/644566.xml?temp=.8845331
      

  6.   

    http://www.csdn.net/expert/topic/741/741259.xml?temp=.2647821
      

  7.   

    请问installshield哪里有VC光盘吗?
      

  8.   

    installshield的教材!
    http://www.yesky.com/20010128/154960.shtml
      

  9.   

    (转贴)InstallShield创建SQL server数据库,恢复数据库,创建WEB_FTP站点.txt
    ///////////////////////////////////////////////////////////////////////////////
    //
    //  FUNCTION:   OnFirstUIAfter
    //
    //  EVENT:      FirstUIAfter event is sent after file transfer, when installation 
    //              is run for the first time on given machine. In this event handler 
    //              installation usually displays UI that will inform end user that
    //              installation has been completed successfully.
    //
    ///////////////////////////////////////////////////////////////////////////////
    function OnFirstUIAfter()
        STRING szTitle, szMsg1, szMsg2, szOption1, szOption2;
        NUMBER bOpt1, bOpt2;  
        
        
    string szMsg;   
    string szField1;
    string svEdit1;
    string svEdit2;
    string svRsPath;
    string svUSPath,svMEPath; 
    object WebSite,  WebServer,  WebRoot,  VDir;
    object FTPSite,  FTPServer,  FTPRoot,objISAdmin,cat,sp;
    object server,db,res,dbf,fg,dbs;
        object Server;
    begin  
           //得到服务器参数
    SdShowDlgEdit1 ( "输入服务器IP地址" , "输入服务器IP地址" , "服务器IP地址" , svEdit1 );
    SdShowDlgEdit1 ( "输入sa密码" , "输入sa密码" , "输入sa密码" , svEdit2 );

        AskPath ( "资源文件存放目录" ,"" , svRsPath ); 
        svUSPath=TARGETDIR+"\\userupload";
        AskPath ( "媒体文件存放目录" ,"" , svMEPath); //创建Web站点
    try    
        set WebSite=CreateObject ("IISNamespace");   
        set WebSite=WebSite.GetObject("IIsWebService",  svEdit1+"/w3svc");  
        set WebServer=WebSite.create("IIsWebServer",911); //  
        WebServer.ServerComment="中小学教育资源库";
        WebServer.Serverbindings=":8010:";
        WebServer.defaultDoc="default.asp";
        WebServer.AccessScript= TRUE;
        WebServer.AccessExecute=TRUE;
        WebServer.AccessRead= TRUE;
        WebServer.SetInfo;
        set WebServer  =  WebSite.GetObject("IIsWebServer", 911);
        set VDir  =  WebServer.Create("IIsWebVirtualDir",  "root");
        VDir.AccessRead  =  TRUE;
        VDir.Path  =  TARGETDIR+"\\web";
        VDir.AccessScript = TRUE;
        VDir.AccessExecute =TRUE;
        VDir.AccessRead= TRUE;
        VDir.SetInfo;  
        set VDir  =  WebServer.Create("IIsWebVirtualDir",  "root/resource");
        VDir.AccessRead  =  TRUE;
        VDir.Path  = svRsPath ;
        VDir.AccessScript = TRUE;
        VDir.AccessExecute =TRUE;
        VDir.AccessRead= TRUE;
        VDir.SetInfo;    set VDir  =  WebServer.Create("IIsWebVirtualDir", "root/data");
        VDir.AccessRead  =  TRUE;
        VDir.Path  =  svUSPath;
        VDir.AccessScript = TRUE;
        VDir.AccessExecute =TRUE;
        VDir.AccessRead=TRUE;
        VDir.SetInfo; 
        WebServer.Start;  
    catch  
        SdShowMsg ( "web 服务创建失败!" , TRUE );
    endcatch;
    try    
        //创建FTP站点
        set FTPSite  =  CreateObject("IISNamespace");
        set FTPSite  =  FTPSite.GetObject("IIsFTPService",  svEdit1+"/MSFTPSVC");
        set FTPServer=FTPSite.create("IIsFTPServer",913);
        FTPServer.ServerComment="中小学教育资源库FTP";
        FTPServer.Serverbindings=":211:";
        FTPServer.AccessRead= TRUE;
        FTPServer.AccessWrite= TRUE;
        FTPServer.SetInfo;
        set FTPServer  =  FTPSite.GetObject("IIsFTPServer",913);
        set VDir  =  FTPServer.create("IIsFTPVirtualDir",  "root");
        VDir.AccessRead  =  TRUE;
        VDir.Path  = svRsPath ;//edit8.Text;
        VDir.AccessRead= TRUE;
        VDir.AccessWrite=TRUE;
        VDir.SetInfo;    set VDir =  FTPServer.create("IIsFTPVirtualDir",  "root/resource");
        VDir.AccessRead  =  TRUE;
        VDir.Path  =  svRsPath;//edit8.Text;
        VDir.AccessRead= TRUE;
        VDir.AccessWrite=TRUE;
        VDir.SetInfo;    set VDir  =  FTPServer.create("IIsFTPVirtualDir",  "root/data");
        VDir.AccessRead  =  TRUE;
        VDir.AccessWrite=TRUE;
        VDir.Path  = svUSPath;// edit9.Text;
        VDir.AccessRead= TRUE;
        VDir.SetInfo;
        FTPServer.Start; 
     catch 
        SdShowMsg ( "ftp 服务创建失败!" , TRUE );
     endcatch;
     
       //配置Index Server
     try
        set objISAdmin = CreateObject("Microsoft.ISAdm");
        set cat=objISAdmin.AddCatalog("mettsc-zyk","c:\\");     set sp=cat.AddScope(svRsPath,FALSE); 
        sp.Alias="resource";
        set sp=cat.AddScope(svUSPath,FALSE);
        sp.Alias="data";
     catch 
        SdShowMsg ( "索引服务创建失败!" , TRUE );
     endcatch;  //创建媒体服务 
     try
      set Server = CreateObject("NsoAdminControl.NsoAdminControl.1");
      Server.Connect(svEdit1);
      Server.VirtualRoots.Item("/").DirectoryPath=svMEPath;   
     catch 
      SdShowMsg ( "媒体服务创建失败!" , TRUE );
     endcatch;  
     //配置注册表
     RegDBSetDefaultRoot(HKEY_LOCAL_MACHINE);
     RegDBSetKeyValueEx ( "SOFTWARE\\Mettsc\\EduRes\\IIS" ,"AppPath"  , REGDB_STRING , TARGETDIR , -1 );
     RegDBSetKeyValueEx ( "SOFTWARE\\Mettsc\\EduRes\\IIS" ,"DBIP"  , REGDB_STRING , svEdit1 , -1 ); 
     RegDBSetKeyValueEx ( "SOFTWARE\\Mettsc\\EduRes\\IIS" ,"DBname"  , REGDB_STRING , "ziyuanku_db" , -1 ); 
     RegDBSetKeyValueEx ( "SOFTWARE\\Mettsc\\EduRes\\IIS" ,"DBPWD"  , REGDB_STRING , svEdit2 , -1 ); 
     RegDBSetKeyValueEx ( "SOFTWARE\\Mettsc\\EduRes\\IIS" ,"DBUser"  , REGDB_STRING , "sa" , -1 );
     RegDBSetKeyValueEx ( "SOFTWARE\\Mettsc\\EduRes\\IIS" ,"FTPIP"  , REGDB_STRING , svEdit1 , -1 );
     RegDBSetKeyValueEx ( "SOFTWARE\\Mettsc\\EduRes\\IIS" ,"FtpPort"  , REGDB_STRING , "211" , -1 ); 
     RegDBSetKeyValueEx ( "SOFTWARE\\Mettsc\\EduRes\\IIS" ,"HttpIP"  , REGDB_STRING , svEdit1 , -1 );
     RegDBSetKeyValueEx ( "SOFTWARE\\Mettsc\\EduRes\\IIS" ,"HttpPort"  , REGDB_STRING ,"8010" , -1 );
     RegDBSetKeyValueEx ( "SOFTWARE\\Mettsc\\EduRes\\IIS" ,"mediaIP"  , REGDB_STRING ,svEdit1 , -1 );
     RegDBSetKeyValueEx ( "SOFTWARE\\Mettsc\\EduRes\\IIS" ,"resourcePath"  , REGDB_STRING ,svRsPath , -1 ); 
     RegDBSetKeyValueEx ( "SOFTWARE\\Mettsc\\EduRes\\IIS" ,"UsrUpload"  , REGDB_STRING ,svUSPath , -1 ); 
     RegDBSetKeyValueEx ( "SOFTWARE\\Mettsc\\EduRes\\IIS" ,"webpath"  , REGDB_STRING ,TARGETDIR+"\\web" , -1 ); 
     RegDBSetKeyValueEx ( "SYSTEM\\CurrentControlSet\\Control\\ContentIndex\\Catalogs\\mettsc-zyk" ,"W3SvcInstance"  , REGDB_NUMBER ,"911" , -1 ); 
     RegDBSetKeyValueEx ( "SYSTEM\\CurrentControlSet\\Control\\ContentIndex\\Catalogs\\mettsc-zyk" ,"IsIndexingW3Svc"  , REGDB_NUMBER ,"1" , -1 );  LaunchAppAndWait (SRCDIR+"\\udlsave.exe","udlsave.exe", WAIT );
     LaunchAppAndWait (SRCDIR+"\\update.exe","update.exe", WAIT );   
        
        
        
        Disable(STATUSEX);    ShowObjWizardPages(NEXT); bOpt1  = FALSE;
        bOpt2  = FALSE;
        szMsg1 = SdLoadString(IFX_SDFINISH_MSG1);
        SdFinishEx(szTitle, szMsg1, szMsg2, szOption1, szOption2, bOpt1, bOpt2);
    end;// --- include script file section ---
      

  10.   

    to liad() 
    我的数据库在本地,怎么写呢?
      

  11.   

    用InstallShield,楼上的同志太不负责任了,贴了一大堆,我看了半天,没说怎么建数据库的,我自己写过过一个这样的东西。
    基本思想是:
    1、将要安装的数据库文件(就是.mdf和.ldf文件)从SQLServer中剥离出来,用sp_detach_db命令;
    2、将这两个文件拷到目标计算机中;
    3、得到目标计算机的数据库管理员的帐号和密码(不一定是sa的);
    4、检验这个帐号是否为管理员而且密码正确;
    5、检查注册表得到数据库系统的数据目录(比如C:\mssql7\data"),并将两个数据库文件拷到目录下;
    6、运行isql命令,将数据库文件挂接到数据库系统中;
    7、添加一个属于自己的帐号和密码用于连接自己的数据库(可选)。
    具体InstallShield代码如下:function OnFirstUIBefore()
        NUMBER  nResult,nSetupType;
        STRING  szTitle, szMsg;
        STRING  szLicenseFile, szQuestion;
        STRING  svName, svCompany, svSerial;
        STRING  szFile;
        STRING  szDir;
        STRING  szfolder;
        LIST    listStartCopy;
        LIST    list;
        
    //RegDBKeyExist
    STRING szSubKey;
    //RegDBGetKeyValueEx
    STRING szKey, szName, svValue;
    NUMBER nvType, nvSize; 
    //SdShowDlgEdit2
    STRING szField1, szField2, szEdit1, szEdit2; 
    //LaunchAppAndWait
    STRING szProgram, szCmdLine; 
    //OpenFile, GetLine
    STRING szPath, szFileName, svLine;
    NUMBER nvFileHandle;              
    //Temp dir
    STRING szTempDir;          
    //AskPath
    STRING szDefPath , svResultPath;
    BOOL bTargetDirOk; 
    //GetSystemInfo
    NUMBER nvResult;
    STRING svResult;begin
    szTitle = "安装数据库";
    szMsg = "请输入具有数据库管理员权限的帐号和密码,以便建立数据库";
    szField1 = "帐号:";
    szField2 = "密码:";
    szEdit1 = "sa";
    szEdit2 = "";
    nResult = SdShowDlgEdit2(szTitle, szMsg, 
    szField1, szField2, szEdit1, szEdit2);
    if (nResult = NEXT) then
    szUid = szEdit1;
    szPwd = szEdit2;

    //得到临时目录名称
    szTempDir = "C:\\";
     
    //测试帐号及密码的合法性
    szFileName = szTempDir ^ "result.txt";
    szProgram = "isql";
    szCmdLine = "-U " + szEdit1 + " -P "+ szEdit2 + 
    "-Q \"select name from master..syslogins where " + 
    "name = '" +szEdit1 + "' and sysadmin = 1\" -o " +
    szFileName;
    nResult = LaunchAppAndWait(szProgram, szCmdLine, WAIT);
    if (nResult < 0) then
    szMsg = "数据库连接失败,即将退出!";
    MessageBox(szMsg, INFORMATION );
    abort;
    endif;             
    szPath = szTempDir;
    OpenFileMode(FILE_MODE_NORMAL);
    OpenFile(nvFileHandle, szPath, "result.txt");
    nResult = 0;
    while (GetLine(nvFileHandle, svLine) = 0)
    //如果合法则继续
    if (StrCompare(svLine, "(1 row affected)") = 0) then
    nResult = 1;                 
    endif;
    endwhile;
    CloseFile(nvFileHandle);
    //如帐号不合法则提示重新输入
    if (nResult = 0) then
    szMsg = "验证帐号和密码失败,请检查数据库服务器是否启动并重新输入!";
    MessageBox(szMsg, INFORMATION );      
    goto Dlg_GetDBUser;
    endif; 
    else
    goto Dlg_ObjDialogs;
    endif;
    DeleteFile(szFileName);
    end;function OnFirstUIAfter()
        STRING szTitle, szMsg1, szMsg2, szOption1, szOption2;
        NUMBER bOpt1, bOpt2;  
        
    //SQL Server Data Dir
    STRING szDataDir;
    //Temp dir
    STRING szTempDir;     
    //RegDBGetKeyValueEx
    STRING szKey, szName, svValue;
    NUMBER nvType, nvSize; 
    //Function result
    NUMBER nResult;
    //SdShowDlgEdit2
    STRING szMsg, szField1, szField2, szEdit1, szEdit2; 
    //LaunchAppAndWait
    STRING szProgram, szCmdLine; 
    //OpenFile, GetLine
    STRING szPath, szFileName, svLine;
    NUMBER nvFileHandle;
    //CopyFile
    STRING szSrcFile , szTargetFile;
    //DeleteDir
    STRING szDir;  
    //WriteProfString
    STRING szSectionName , szKeyName , szValue;
    //RegDBKeyExist, RegDBCreateKeyEx 
    STRING  szClass;
    NUMBER  nzSize;
    begin
        Disable(STATUSEX);
        ShowObjWizardPages(NEXT);
       
    Config_Database: 
        //安装并配置数据库系统 
        //检查是否已安装mydb数据库
        szTempDir = TARGETDIR ^ "Database\\";
    szFileName = szTempDir ^ "result.txt";
    szProgram = "isql";
    szCmdLine = "-U " + szUid + " -P "+ szPwd + 
    "-Q \"select name from master..sysdatabases where name = 'mydb'\"" +
    " -o \"" + szFileName + "\"";
    nResult = LaunchAppAndWait(szProgram, szCmdLine, WAIT);
    szPath = szTempDir;
    OpenFileMode(FILE_MODE_NORMAL);
    OpenFile(nvFileHandle, szPath, "result.txt");
    nResult = 0;
    while (GetLine(nvFileHandle, svLine) = 0)
    //如果合法则继续
    if (StrCompare(svLine, "(1 row affected)") = 0) then
    nResult = 1;                 
    endif;
    endwhile;
    CloseFile(nvFileHandle);
    //如果数据库存在,则跳过数据库安装步骤
    if (nResult = 0) then
    //得到数据库存放数据文件的目录 szDataDir = "...\\MSSQL7\\Data"
    szMsg = "正在安装数据库文件";
    SdShowMsg ( szMsg , TRUE );
    RegDBSetDefaultRoot(HKEY_LOCAL_MACHINE );
    szKey = "SOFTWARE\\Microsoft\\MSSQLServer\\Setup";
    szName = "SQLDataRoot"; 
    nvType = REGDB_STRING;
    RegDBGetKeyValueEx(szKey, szName, nvType, svValue, nvSize);
    szDataDir = svValue ^ "Data\\";

    //拷贝数据库文件和日志文件到szDataPath
    Disable(LOGGING);    
    szSrcFile = TARGETDIR ^ "Database\\mydb.mdf";
    szTargetFile = szDataDir ^ "mydb.mdf";
    CopyFile ( szSrcFile , szTargetFile );
    szSrcFile = TARGETDIR ^ "Database\\mydb_log.ldf";
    szTargetFile = szDataDir ^ "mydb_log.ldf";
    CopyFile ( szSrcFile , szTargetFile );      
    Enable(LOGGING);

    //执行SQL文件恢复数据库文件与系统的连接
    szProgram = "isql"; 
    szTempDir = TARGETDIR ^ "Database\\";
    szFileName = szTempDir ^ "result.txt";
    szCmdLine = "-U " + szUid + " -P "+ szPwd + 
    "-Q \"exec sp_attach_db @dbname=N'mydb', @filename1=N'" +
    szDataDir ^ "mydb.mdf', @filename2=N'" +
    szDataDir ^ "mydb_log.ldf'\"" +
    " -o \""+ szFileName + "\"";  
    LaunchAppAndWait(szProgram, szCmdLine, WAIT); 
    SdShowMsg ( szMsg , FALSE );
    endif;
                             
    szMsg = "正在添加数据库帐号";
    SdShowMsg ( szMsg , TRUE );
    //添加数据库专用帐号(uid=mydbsa;pwd=mypwd)并设为数据库dbo
    szProgram = "isql";
    szCmdLine = "-U " + szUid + " -P "+ szPwd + 
    " -i \""+ TARGETDIR ^ "Database\\addlogin.sql\"" +   
    " -o \""+ TARGETDIR ^ "Database\\result.txt\"";  
    LaunchAppAndWait(szProgram, szCmdLine, WAIT);
    SdShowMsg ( szMsg , FALSE );         

    //删除数据库相关的临时文件
    szDir = TARGETDIR ^ "Database";
    DeleteDir ( szDir , ALLCONTENTS );

        //添加ODBC数据源
        RegDBSetDefaultRoot ( HKEY_LOCAL_MACHINE ); 
        szKey = "SOFTWARE\\ODBC\\ODBC.INI\\mydb";
        szClass = "";
        if (RegDBKeyExist ( szKey ) < 0) then
         //如果数据源不存在则创建 
         RegDBCreateKeyEx ( szKey , szClass );
        else             
         //如果数据源已存在,则关闭日志,使之在卸载时不被删除
         Disable(LOGGING);
        endif;                               
        nzSize = -1;  
        szName = "Driver";
        szValue = WINSYSDIR ^ "sqlsrv32.dll";
        RegDBSetKeyValueEx ( szKey , szName , REGDB_STRING , szValue , nzSize );    szName = "Database";
        szValue = "mydb";
        RegDBSetKeyValueEx ( szKey , szName , REGDB_STRING , szValue , nzSize );    
                                                                                  
        szName = "Server";
        szValue = "(local)";
        RegDBSetKeyValueEx ( szKey , szName , REGDB_STRING , szValue , nzSize );
        
        Enable(LOGGING);
    end;
      

  12.   

    上面是我对于自动安装数据库的解决办法。
    关于数据库连接的字符串如“DSN=db;UID=test;PWD=123”,我是这样做的:在自己程序中使用自己定义的帐号和密码(如myuid和mypwd),然后在安装的数据库中添加这个帐号并给予自己数据预的dbowner权限。这样别人就不能得到自己的密码了。具体添加和设置帐号的方法在上面的代码中已经有了。
      

  13.   

    to Eaglehorn(Phoenix) 
    非常感谢!请问你用的是for VC 的InstallShield吗?
    我如果只要数据库的表结构和存储过程能不能更简单些呢?有没有什么办法使得在数据库中看不到存储过程的源代码?
      

  14.   

    to Eaglehorn(Phoenix) 
    请问Dlg_GetDBUser和Dlg_ObjDialogs是什么啊?
    另外我的installShield for VC 6.0(光盘自带)中不支持LaunchAppAndWait()
    这么办啊?
      

  15.   

    好久没来了,真不好意思,不知道有没有耽误你的事。不过我想我还是写上来或许后来有人会从中受益也不一定。
    1、我用的是Installshield 6.2 专业版,不是for VC的。后者功能极其有限,不推荐。
    2、想不看到存储结构的代码,在生成时有一个对应的参数(SQL语法)可以将代码加密。
    3、Glg_DBUser & Dlg_ObjDialogs都是代码片断,可以用Goto直接跳转过去。
    4、找一个IS专业版,买一个正版吧,4000元,支持正版嘛,反正不是自己掏钱:)。