SQL Server Express 自动安装实现

为了偷点“懒”,避免每次给用户安装系统时都要交给用户怎么样安装SQL Server,减少各种“麻烦”,终于狠心研究并整理了一下SQL Server自动安装的过程。本次使用的是SQL Server 2005Express,可从MSND中进行下载。

 

SQL Server 2005提供了很强大的功能,强大到至今都没有用到过。用的最多也是最基本的就是数据的存取,查询等。所以在给用户安装一个小型桌面程序时,也必要给客户安装一个文件大小23GSQL Server吗,至少我认为这是一个很傻的选择,而且在这之前我一直这么很傻的干着。

转入正体,下面就说说SQL Server Express

 

Microsoft SQL Server 2005 Express Edition 是一种免费、易用的轻量版 SQL Server 2005,具有快速且易于掌握的特点,可用于快速开发和部署动态数据驱动的应用程序。  ----MSDN

 

前提是功能,因为我只用到了数据库的基本功能,数据存取、更新,包括存储过程,事务等,Express版本已经完全满足,并且使用和开发也其他版本没有任务区别,更重要的是“免费”,哈哈哈~~

 

OKSQL Server2005 Express也分为32位和64位版本,考虑到客户机的不现系统,建议统一下载64位的版,因为可以同时在32的系统中进行安装,而32的位版本就不能在64位的系统中安装,这我可是试过的。下载地址:

http://www.microsoft.com/downloads/details.aspx?familyid=31711D5D-725C-4AFA-9D65-E4465CDFF1E7&displaylang=zh-cn

 

还有一个需要注意的问题就是安装SQL Server 2005Express版本之前,系统需要安装.net Framework2.0,对于VistaWin7的系统来说就不必了,可直接安装;2003系统和XP可能需要单独安装。因我的程序使用的都是.net进行开发的,所以必须首先进行.Net framework的安装,在这就没有考虑怎么自动安装。

自动安装思路:

使用命令行解压SQLExpr安装包(我把下载后的安装文件重命为SQLexpr),解压命令为 SQLexpr.exe /x <dir> /q

下图是解压后的目录结构:

 

创建自动安装脚本。其实就是一个批处理命令,并保存为一个.bat文件。

启动运行.bat文件。

附件需要安装的数据库,完成安装。

 

   下面是实现代码:

解压数据库安装文件。启动一个进程Process,AppPath是当前程序的路径。

 

ExpandedBlockStart.gif 代码
void  UnzipSQLExpress()
{
    
try
    {
        
// ZipPath: 解压的目录
           if  (System.IO.Directory.Exists(ZipPath))
              System.IO.Directory.Delete(ZipPath);
    }
    
catch  { }
    
finally
    {
         System.IO.Directory.CreateDirectory(ZipPath);
    }
      ShowMsg(
" 开始解压... " );
      Process sqlProcess 
=   new  Process();
      sqlProcess.StartInfo.FileName 
=  AppPath  +   " sqlexpr.exe " ;
      sqlProcess.StartInfo.Arguments 
=  String.Format( "  /x:\ " { 0 }\ "  /q " , ZipPath);
      sqlProcess.StartInfo.WindowStyle 
=  ProcessWindowStyle.Normal;
      sqlProcess.Start();
      sqlProcess.WaitForExit();

      ShowMsg(
" 解压完成... " );
}

 

 

2 解压完成之后,就是如何创建安装命令了。其实完整的安装命令在解压完成后的目 录中已经有了完成说明,详细请参考目录中的"template.ini"文件。

 

ExpandedBlockStart.gif 代码
 1         void  CreateSetupScript()
 2          {
 3              StringBuilder sqlScript  =   new  StringBuilder();
 4              sqlScript.AppendLine( " CLS    " );
 5              sqlScript.AppendLine( " @ECHO OFF    " );
 6              sqlScript.AppendLine( " ECHO.    " );
 7              sqlScript.AppendLine( " ECHO ----------------------------------------------------------------    " );
 8              sqlScript.AppendLine( " ECHO    To start the installation SQL SERVER 2005  " );
 9              sqlScript.AppendLine( " ECHO    Please wait...  " );
10              sqlScript.AppendLine( " ECHO ----------------------------------------------------------------    " );
11              sqlScript.AppendLine( " Start /wait setup.exe /qb INSTANCENAME=[实例名称] ADDLOCAL=All SECURITYMODE=SQL SAPWD=123456  SQLAUTOSTART=1 DISABLENETWORKPROTOCOLS=2   " );
12              sqlScript.AppendLine( " ECHO ----------------------------------------------------------------    " );
13              sqlScript.AppendLine( " ECHO   Installation is complete...    " );
14              sqlScript.AppendLine( " ECHO ----------------------------------------------------------------    " );
15 
16               using  (System.IO.StreamWriter file  =   new  System.IO.StreamWriter(ZipPath  +   " setup.bat " false , Encoding.ASCII))
17              {
18                  file.Write(sqlScript.ToString());
19              }
20          }

 

 

这个方法就是创建了一个.bat批处理文件,到时我们执行这个批处理文件就可以了。其中最重要的就就是下面这行命令:

Start /wait setup.exe /qb INSTANCENAME=[实例名称] ADDLOCAL=All SECURITYMODE=SQL SAPWD=123456  SQLAUTOSTART=1 DISABLENETWORKPROTOCOLS=2

  

  参数说明:

 /qb 是 quiet mode,显示基本的图形界面,但是不用用户驱动,如果不想看到图形界面,可以用 /qn 参数。

  INSTANCENAME 是实例名

  ADDLOCAL 是安装所有的组件,可以指定安装哪些组件,请参考 template.ini 文件中详细说明

  SECURITYMODE 服务器身份认证方式,分为windows身份验证模式,sql serverwindows身份认证模式,此处指定为sql,则为第二种认证方式

  SAPWD sa用户密码

  SQLAUTOSTART 指定,安装完成后,sql server服务默认是自动开启的 

  DISABLENETWORKPROTOCOLS 指定网络协议参数,我这地方需要启动tcp/ip协议,所以设置为2,详细请参照 template.ini 中。

 

运行命令:

   ShowMsg("开始安装数据库 ...");

   Process sqlProcess = new Process(); 

   sqlProcess.StartInfo.WorkingDirectory = ZipPath;

   sqlProcess.StartInfo.FileName = ZipPath + "steup.bat";

   sqlProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;

   sqlProcess.Start();

   sqlProcess.WaitForExit();

   ShowMsg("数据库安装完成...");

      

/完成之后,节省用户磁盘空间,删除解压的安装文件

Directory.Delete(ZipPath);

4 创建数据库附加脚本,并使用sqlcmd命令附加数据库.

下面的方法使用到了 xp_instance_regread 存储过程,用于查询连接的数据库实例的安装目录。因为在实际测试中发现附加数据库文件只能在..\MSQL\Data\目录下进行,其他目录会提示权限不足,另外以于Express数据库的备份文件也只能备份到..\MSQL\Backup\目录下,原因相同。所以,你的程序可能需要记录下这个目录,以便对数据库进行数据库备份或恢复操作是用到。

 

数据库使用了sp_attach_db 存储过程进行附加操作,并把 sp_attach_db的SQL脚本保存到了一个dbsql2005.sql临时文件中。

最后使用到 SqlCmd 命令执行sp_attach_db,参数如下:

String.Format("  -S {0} -i \"{1}\"", System.Net.Dns.GetHostName() + @"\[实例名]", paths);  

sqlcmd.exe -s DELL-user1\SQLExpress -i c:\db2005.sql


 

ExpandedBlockStart.gif 代码
        void  CreateDataBase()
        {
            
/*
             * 创建数据库
             * 1.连接数据库(以Windows验证)
             * 2.获取数据库安装目录(..\MSQL\Data\)
             * 3.创建安装脚本,并通过SqlCmd命令执行脚本。
             
*/
            String SmoRootPath 
=  String.Empty;

            
using  (SqlConnection conn  =   new  SqlConnection(connString))
            {
                conn.Open();
                SqlCommand cmd 
=   new  SqlCommand(
                   
@"  exec master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE', N'SOFTWARE\Microsoft\MSSQLServer\Setup', N'SQLPath', @SmoRoot OUTPUT "
                    , conn);
                cmd.CommandType 
=  CommandType.Text;
                SqlParameter rootPath 
=   new  SqlParameter( " SmoRoot " , SqlDbType.VarChar,  512 );
                rootPath.Direction 
=  ParameterDirection.Output;
                cmd.Parameters.Add(rootPath);
                cmd.ExecuteNonQuery();
                SmoRootPath 
=  cmd.Parameters[ 0 ].Value.ToString();
                conn.Close();
            }


            
if  ( ! string .IsNullOrEmpty(SmoRootPath))
            {
                
// 记录位置 HealthOneInBody SmoRootPath 

                ShowMsg(
" 开始创建数据库文件... " );
                SmoRootPath 
=  SmoRootPath  +   " \\Data\\ " ;
                String paths 
=  AppPath  +   " db2005tp.sql " ;

                CreateSql(paths, SmoRootPath);



                Process sqlProcess 
=   new  Process();
                sqlProcess.StartInfo.FileName 
=   " sqlcmd.exe " ;
                sqlProcess.StartInfo.Arguments 
=  String.Format( "   -S {0} -i \ " { 1 }\ "" , System.Net.Dns.GetHostName()  +   @" \[实例名] " , paths);
                sqlProcess.StartInfo.WindowStyle 
=  ProcessWindowStyle.Hidden;
                sqlProcess.Start();
                sqlProcess.WaitForExit();
// '等待执行
                ShowMsg( " 数据库文件创建完成... " );
                
try
                {
                    File.Delete(paths);
                }
                
catch  { }
            }

        }

        
///   <summary>  
        
///    数据库名:Dataname 文件名:Dataname.mdf Dataname.ldf         ///  
        
///   </summary>
        
///   <param name="paths"> sql脚本文件路径 </param>
        
///   <param name="dataPath"> 数据库文件路径 </param>
         private   void  CreateSql(String paths, String dataPath)
        {
            StringBuilder s 
=   new  StringBuilder();
            s.AppendLine(String.Format(
" exec sp_attach_db @dbname=N'Dataname', @filename1=N'{0}Dataname.MDF',@filename2=N'{0}Dataname.LDF' " , dataPath));

            
using  (System.IO.StreamWriter configFile  =   new  System.IO.StreamWriter(paths))
            {
                configFile.Write(s.ToString());
            }

        }

 

转载于:https://www.cnblogs.com/wservices/archive/2010/12/03/sqlserverexpress.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值