目的 : 在用户服务器端生成空数据库 . 并用自写的服务器程序读写数据库

使用本方式首先要在用户机器上安装 SQL2005, 然后方可顺利安装 .

 

一 ). 创建部署项目
1. 打开 VS.NET2005 。
2 .在 “ 文件 ” 菜单上指向 “ 新建项目 ” 。
3. 在 “ 新建项目 ” 对话框中,选择 “ 项目类型 ” 窗格 中的 ” 其他项目类型 ” 中的 “ 安装和部署 ” ,然后选择 “ 模板 ” 窗格中的 “ 安装项目 ” 。在 “ 名称 ” 框中键入 Setup1 。
4. 单击 “ 确定 ” 关闭对话框。
5. 项目被添加到解决方案资源管理器中,并且文件系统编辑器打开。如下图所示:
 
6. 在 “ 属性 ” 窗口中,选择 ProductName 属性,并键入 数据库打包安装。

 

二 ). 创建安装程序类
1. 在 “ 解决方案资源管理器 ” 中的 ” 解决方 Setup1” 上右键选择 ” 添加 ” 后选择 “ 新建项目 ” 。
2. 在 “ 添加新项目 ” 对话框中,选择 “ 项目类型 ” 窗格中的 “Visual C#” 下的 ”Windows” ,然后选择 “ 模板 ” 窗格中的 “ 类库 ” 。在 “ 名称 ” 框中键入 InstallDB 。
3. 单击 “ 确定 ” 关闭对话框。
4. 从 “InstallDB” 类库下右键选择 ” 添加 ” 中的 ” 新建项 ” 。
5. 在 “ 添加新项 ” 对话框中选择 “ 安装程序类 ” 。在 “ 名称 ” 框中键入 InstallDB 。
6. 单击 “ 添加 ” 关闭对话框。
7. “InstallDB” 安装程序类详细代码附后。
如下图所示 :
 
三 ). 创建自定义安装对话框
1. 在解决方案资源管理器中选择 “setup1” 项目。右键然后在 “ 视图 ” 菜单上选择 “ 用户界面 ” 。
2. 在用户界面编辑器中,选择 “ 安装 ” 下的 “ 启动 ” 节点选择 “ 添加对话框 ” 。
3 在 “ 添加对话框 ” 对话框中,选择 “ 文本框 (A)” 对话框,然后单击 “ 确定 ” 关闭对话框。
4. 在 “ 文本框 (A)” 右键菜单上,选择 “ 上移 ” 。重复此步骤,直到 “ 文本框 (A)” 对话框位于 “ 安装文件夹 ” 节点之上。
5 在 “ 文本框 (A)” 的 “ 属性 ” 窗口中,选择 BannerText 属性并键入:安装数据库。
6. 选择 BodyText 属性并键入:安装程序将在目标机器上安装数据库。
7. 选择 Edit1Label 属性并键入:数据库名称 :
8 选择 Edit1Property 属性并键入 DBNAME
9. 选择 Edit1Value 属性并键入: budgetSysDB
10. 选择 Edit2Label 属性并键入:服务器名 :
11. 选择 Edit2Property 属性并键入 SERVER
12. 选择 Edit2Value 属性并键入: (local)
13. 选择 Edit3Label 属性并键入:用户名 :
13. 选择 Edit3Value 属性并键入: sa
15. 选择 Edit3Property 属性并键入 USER
16. 选择 Edit4Label 属性并键入:密码 :
18. 选择 Edit4Property 属性并键入 PWD
19. 选择 Edit1Visible 属性,设置为 false( 数据库名称用不到 ); 选择 Edit2Visible 、 Edit3Visible 和 Edit4Visible 属性,并将它们设置为 true
 

 

四 ). 创建自定义操作
1. 在解决方案资源管理器中选择 “setup1” 项目 , 右键在 “ 视图 ” 菜单上选择 “ 自定义操作 ” 。
2. 在自定义操作编辑器中选择 “ 安装 ” 节点。右键选择 “ 添加自定义操作 ” 。
3. 在 “ 选择项目中的项 ” 对话框中,双击 “ 应用程序文件夹 ” 。
4. 单击 ” 添加输出 ” 按钮选择 ” 项目 ” 中的 ” InstallDB”, 在下面框中选择 ” 主输出 ”( 此项一般为默认 ) ,然后单击 “ 确定 ” 关闭对话框。
5. 在 ” 主输出来自 InstallDB( 活动 ) 的属性窗口中,选择 CustomActionData 属性并键入: /dbname=[DBNAME] /server=[SERVER] /user=[USER] /pwd=[PWD]  /targetdir="[TARGETDIR]\" 。 ( 注意空格 !!)
附 :/targetdir="[TARGETDIR]\" 是安装后的目标路径,为了在 installDB 类中获得安装后的路径,我们设置此参数。
  如下图所示:
 

 

五 ) 生成数据库

1. 在自己的 SQL 数据库 DB 上 ( 例如数据库名称为 :DB), 右击 -> 任务 -> 生成脚本 . 将该脚本存储为 Mydb2005.sql

2. 编辑 ”Mydb2005.sql”, 并在文档前段附加以下内容 :

-- 生成数据库

use master

if not exists( select name from sysdatabases where name = ' 你要生成的数据库名称 ' )

begin

create database 你要生成的数据库名称

end

go

 

-- 创建登录名 / 密码

IF not   EXISTS ( SELECT * FROM sys.server_principals WHERE name = N' 你的登录名 ' )

begin

create login [succeed] with PASSWORD = 你的密码 , CHECK_EXPIRATION= OFF , CHECK_POLICY= ON

end

go

 

use MineMonitoringSystem

-- 添加用户

IF NOT EXISTS ( SELECT * FROM sys.database_principals WHERE name = N' 你的登录名 ' )

CREATE USER [ 你的用户名称 ] FOR LOGIN [ 你的登录名 ] WITH DEFAULT_SCHEMA= [dbo]

GO

-- 分配角色

exec   sp_addrolemember   'db_owner' , ' 你的用户名称 '

go

后面是 SQL 自动生成的脚本 , 主要是创建表格 , 存储过程之类的 .

注意 : 添加用户可能会在 SQL 自动生成的脚本中存在 , 注意不要重复 .

 

六 ).”InstallDB” 安装程序类代码

view plaincopy to clipboardprint?
namespace  InstallDB  
{  
    [RunInstaller (true )]  
    public partial class InstallerDB : Installer  
    { 
#if DEBUG  
        System .IO .StreamWriter _file = new System .IO .StreamWriter (@"D:\server.txt" , false );           // 测试用 
#endif  
        public InstallerDB ()  
        {  
            InitializeComponent ();  
        }  
   
        public override void Install (System .Collections .IDictionary stateSaver )  
        {  
            base .Install (stateSaver );  
   
            if (!this .CreateDataBase ())  
            {// 失败,反安装  
                this .Uninstall (stateSaver );  
                return ;  
            }  
        }  
   
        private bool CreateDataBase ()  
        {  
            try 
            {  
                 string server = this .Context .Parameters ["  server  " ];  
                string uid = this .Context .Parameters [" user " ];  
                string pwd = this .Context .Parameters [" pwd " ];  
                string path = this .Context .Parameters [" targetdir " ];  
                string strSql = " server= " + server + " ;uid= " + uid + " ; pwd= " + pwd + " ;database=master " ;  
   
                // 调用OSQL 执行脚本  
                System .Diagnostics .Process sqlProcess = new System .Diagnostics .Process ();  
                 sqlProcess .StartInfo .FileName = "sqlcmd.exe" ;  
                sqlProcess .StartInfo .Arguments = string .Format ("-U {0} -P {1} -S {2} -i \"{3}Mydb2005.sql\"" ,  
                    this .Context .Parameters ["user" ],  
                    this .Context .Parameters ["pwd" ],  
                    this .Context .Parameters ["server" ],  
                    this .Context .Parameters ["targetdir" ]);  
   
   
                sqlProcess .StartInfo .WindowStyle = System .Diagnostics .ProcessWindowStyle .Hidden ;  
                sqlProcess .Start ();  
                sqlProcess .WaitForExit ();  
                sqlProcess .Close (); 
  
#if DEBUG  
                _file .WriteLine (this .Context .Parameters ["server" ]);  
                _file .WriteLine (this .Context .Parameters ["user" ]);  
                _file .WriteLine (this .Context .Parameters [" pwd " ]);  
                _file .WriteLine (this .Context .Parameters [" targetdir " ]);  
                _file .WriteLine (sqlProcess .StartInfo .Arguments );  
                _file .Close (); 
#endif  
   
   
                return true ;  
            }  
            catch 
            {  
                return false ;  
            }  
   
        }  
public override void Uninstall (System .Collections .IDictionary savedState )  
        {  
            base .Uninstall (savedState );  
        }  
   
   
        private void DeleteFile (string paths )  
        {  
            try 
            {  
                System .IO .FileInfo delFile = new System .IO .FileInfo (paths );  
   
                if (delFile .Exists )  
                {  
                    delFile .Delete ();  
                }  
            }  
            catch { }  
        }  
   
    }  

namespace  InstallDB
{
    [RunInstaller (true )]
    public partial class InstallerDB : Installer
    {
#if DEBUG
        System .IO .StreamWriter _file = new System .IO .StreamWriter (@"D:\server.txt" , false );           // 测试用
#endif
        public InstallerDB ()
        {
            InitializeComponent ();
        }
 
        public override void Install (System .Collections .IDictionary stateSaver )
        {
            base .Install (stateSaver );
 
            if (!this .CreateDataBase ())
            {// 失败,反安装
                this .Uninstall (stateSaver );
                return ;
            }
        }
 
        private bool CreateDataBase ()
        {
            try
            {
                 string server = this .Context .Parameters ["  server  " ];
                string uid = this .Context .Parameters [" user " ];
                string pwd = this .Context .Parameters [" pwd " ];
                string path = this .Context .Parameters [" targetdir " ];
                string strSql = " server= " + server + " ;uid= " + uid + " ; pwd= " + pwd + " ;database=master " ;
 
                // 调用OSQL 执行脚本
                System .Diagnostics .Process sqlProcess = new System .Diagnostics .Process ();
                 sqlProcess .StartInfo .FileName = "sqlcmd.exe" ;
                sqlProcess .StartInfo .Arguments = string .Format ("-U {0} -P {1} -S {2} -i \"{3}Mydb2005.sql\"" ,
                    this .Context .Parameters ["user" ],
                    this .Context .Parameters ["pwd" ],
                    this .Context .Parameters ["server" ],
                    this .Context .Parameters ["targetdir" ]);
 
 
                sqlProcess .StartInfo .WindowStyle = System .Diagnostics .ProcessWindowStyle .Hidden ;
                sqlProcess .Start ();
                sqlProcess .WaitForExit ();
                sqlProcess .Close ();
 
#if DEBUG
                _file .WriteLine (this .Context .Parameters ["server" ]);
                _file .WriteLine (this .Context .Parameters ["user" ]);
                _file .WriteLine (this .Context .Parameters [" pwd " ]);
                _file .WriteLine (this .Context .Parameters [" targetdir " ]);
                _file .WriteLine (sqlProcess .StartInfo .Arguments );
                _file .Close ();
#endif
 
 
                return true ;
            }
            catch
            {
                return false ;
            }
 
        }
public override void Uninstall (System .Collections .IDictionary savedState )
        {
            base .Uninstall (savedState );
        }
 
 
        private void DeleteFile (string paths )
        {
            try
            {
                System .IO .FileInfo delFile = new System .IO .FileInfo (paths );
 
                if (delFile .Exists )
                {
                    delFile .Delete ();
                }
            }
            catch { }
        }
 
    }
}

 

不足之处,欢迎指正!

posted on 2010-01-06 10:27  努力实现目标  阅读(1268)  评论(0编辑  收藏  举报