1、检测注册表
只安装了sqlserver2000的时候,好办, HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\CurrentVersion,这是key,用代码取到Value,搞定,具体代码可以google,下面贴的我也没试过,
RegistryKey regkey = Registry.LocalMachine.OpenSubKey("SOFTWARE", true).OpenSubKey
(@"Microsoft\MSSQLServer\MSSQLServer\CurrentVersion", true);
if (regkey == null)
{
strValue = "注册表的信息不包括SQL内容,请确认是否安装SQL";
}
else
{
strValue = regkey.GetValue("CurrentVersion").ToString();
}
2、2000和2005并存的时候,我也没找到方法,待试验过之后再来补充!但这两个不是在同一个文件夹里
3、部署数据库
(1)允许用户输入数据库的名称 在安装程序的用户界面的启动中,添加对话框(文本框(A)),上移到安装文件夹上面,属性里面都很清楚,EditProperty属性是个键,你定义好了,通过这个键取到用户输入的值,也就是数据库的Name,进而我们可以通过ADO.net执行SQL语句来完成创建数据库的。但是,如果有大量的数据表以及存储过程需要建立,通过这个方式非常麻烦。
(2) 可不可以通过直接在SQL Server中创建相应的数据库生成脚本文件来直接完成呢?
我们有3个解决方案:
(1) 通过调用osql来执行数据库脚本文件
(2) 通过把相应的脚本文件作为资源文件嵌入到项目中,然后通过ADO.net来执行
(3) 通过调用SQL Server的sp_attach_db的存储过程来直接附加数据库。
(以下为原装摘抄)
·3.1 通过调用osql来执行数据库脚本文件
从上面的例子我们已经知道了如何传递值,那么我们只要在项目文件中程序段中执行osql即可。
这里有一个问题就是从什么地方找到数据库的脚本文件。我们可以把脚本文件放到文件系统中,直接安装到用户机器上
,并可以通过如下方法获得到该文件的位置。
Assembly asm=Assembly.GetExecutingAssembly();
String setuppath=asm.Location;
这样我们就可以知道脚本文件的位置了,下面的文件就是如何启动osql程序了。我们可以通过如下的代码段来完成:
Process sqlprocess=new Process(); sqlprocess.StartInfo.FileName="osql.exe";
sqlprocess.StartInfo.Arguments=String.Format("-U {0} -P {1} -S {2} -i
{3}",this.uid,this.pwd,this.serverip,this.spath); //uid 为用户名,pwd为密码,serverip为目标服务器的
ip,spath为数据库脚本所在的路径
sqlprocess.StartInfo.WindowStyle=ProcessWindowStyle.Hidden;
sqlprocess.Start();
sqlprocess.WaitForExit(); //等待程序执行
sqlprocess.Close();
从上面可以知道,该方法必须要求安装程序的客户机以及安装好了SQL Server才能使用(osql为安装了SQL Server后提
供的命令行下的程序).同时在实际的测试过程中,我们发现如果对于用户在安装程序是选择带有空格的路径,
如;C:\program files\yourappliaction\时,安装失败。这个是一个比较严重的问题。
·3.2 通过把脚本文件作为资源文件载入
从前面的讨论中我们可以看到,直接使用ADO.net执行时比较麻烦,需要一句句执行,如果使用脚本,数据库中生
成的脚本中有"GO"命令,在ADO.net中执行时会出问题。因此,根据对数据库安装脚本的分析,我们可以采用如下替代
方案。
在数据库的安装过程中,无外乎如下几个部分:
(1) 创建数据库
(2) 创建表
(3) 创建试图或者存储过程
并且这三个部分是有先后顺序的,顺序不能颠倒,但是每个过程中没有顺序关系。在测试过程中我们发现可以在一条语
句中创建多个表或者多个存储过程。也就是说,我们可以把执行过程按照上面的顺序执行就行了。并且我们把数据库脚
本作为资源文件嵌入,只要调入执行就可以了,这样就达到了简化创建一条条命令的过程。
获得资源文件代码如下:
Assembly Asm=Assembly.GetExecutingAssembly();
StreamReader str;
str=new StreamReader(Asm.GetManifestResourceStream(Asm.GetName().Name+"."+filename))// filename为你需要
摘入的资源文件。作为资源文件时,只要把文件导入到您的项目中,并且把生成操作改为嵌入的资源即可。
这里我们是直接获得了该文件的文件流,因此直接把该流中的内容读入即可。
我们可以通过如下操作完成:
(1) 建立一个数据库的链接,创建数据库. 比如: connectionstring="server=127.0.0.1,uid=sa,pwd=pwd";
(2) 重新创建一个数据库链接,该链接指向创建的数据库。
connectionstring="server=127.0.0.1,uid=sa,pwd=pwd,database=yourdatabase";
(3) 在新的链接中执行创建数据表和数据存储过程的代码即可。
需要注意的是:不要在你的脚本中有GO命名,其他命令都可以直接执行。
该方法的好处在于: 可以不要求安装的目标机上有SQL Server,也不存在因为文件路径中有空格的问题而倒是安装程序
失败。当然,如果您的数据库为Oracle或者DB2等,您也可以采用类似的方法来实现。
·3.3 通过sp_attach_db来创建数据库
通过上面的讨论我们已经很清楚如何安装数据库了。在安装数据库的过程中,我们除了可以通过数据库脚本来创建数据库之外,我们也可以通过SQL Server的系统存储过程sp_attach_db来附加数据库。
这里我们解决两个问题即可:
(1) 确定数据库文件(.mdf和.ldf)的位置。
(2) 执行存储过程。
对于问题1我们可以借鉴安装数据的第一种方法,即把.mdf和.ldf通过文件系统安装到目标机上,然后通过
Assembly asm=Assembly.GetExecutingAssembly();
String setuppath=asm.Location;
获得文件的路径。
最后通过调用sp_attach_db 加上相应的参数即可完成。
需要注意的是: 该方法也只能针对数据库安装在本机的情况下进行安装。
总结
本文通过介绍了三种不同的方法来在安装程序是如何安装数据库,同时也分析了不同的方法的优劣之处,用户可
以根据自己的实际需要来选择安装方法。同时,通过该方法的提出,用户也可以完成在安装程序是对数据库的配置工作