我有一个C#的程序需要连接Sql Server 2008 R2数据库,为了用户方便,我首先会获取域内所有Sql Server 2008 R2数据库实例,然后供用户选择合适的数据库实例。我获取数据库实例的代码如下:
/// <summary>
/// 获取网络内数据库实例
/// </summary>
/// <returns></returns>
public static string[] GetServerInstance()
{
try
{
SqlClientFactory sqlFInstance = SqlClientFactory.Instance;
DataTable dataSources = sqlFInstance.CreateDataSourceEnumerator().GetDataSources();
DataColumn column2 = dataSources.Columns["ServerName"];
DataColumn column = dataSources.Columns["InstanceName"];
//DataColumn column3 = dataSources.Columns["IsClustered"];
////是否集成验证,即Windows身份验证和SQL Server验证
//DataColumn column4 = dataSources.Columns["Version"];
DataRowCollection rows = dataSources.Rows;
string[] array = new string[rows.Count];
for (int i = 0; i < array.Length; i++)
{
string str2 = rows[i][column2] as string;
string str = rows[i][column] as string;
if ((str == null) || (str.Length == 0) || ("MSSQLSERVER" == str))
{
array[i] = str2;
}
else
{
array[i] = str2 + @"\" + str;
}
}
Array.Sort<string>(array);
return array;
}
catch (System.Exception ex)
{
MessageBox.Show("获取网络内数据库服务器和实例出错!" + ex.ToString(), "提示",
MessageBoxButtons.OK, MessageBoxIcon.Information);
return null;
}
}
这个代码在访问以前的数据库服务器是可以使用的。因为更换了新的电脑,电脑上有两个数据库:一是安装VS2010的时候默认安装了一个Sql Server Express;二是独立安装的企业版Sql server 2008 R2,实例名MSSQLSERVER(为了让C#程序能访问,配置参见http://www.cnblogs.com/geiliCode/archive/2011/09/24/2189766.html),我的数据就放在MSSQLSERVER实例上,希望通过 “sa” 用户访问数据。运行这段代码,我能找到的数据库实例如下:
(1)奇怪,我的电脑上明明装了企业版的Sql server 2008 R2,且实例名是MSSQLSERVER,可是怎么也找不到,只有一个LGB-PC\SQLEXPRESS。我认为是数据配置的问题,我反复设置用户名、密码和其它配置信息,然后重启相关服务,可是一点效果都没有。
(2)没办法,我在想为什么能访问SQLEXPRESS,而不能访问MSSQLSERVER?打开Sql server 配置管理器,显示如下:
难道是登录身份不一样?我又把MSSQLSERVER的登录身份改为和SQLEXPRESS一样,重启服务,还是不行!真是令人费解!
(3)无奈之下,偶然我选择LGB-PC\SQLEXPRESS,把SQLEXPRESS删掉,只留下LGB-PC,然后输入sa和密码,测试连接竟然成功!!显示如下:
怎么不需要实例名就能访问呢?不解之下,我登录到(local)数据库实例,其实也就是MSSQLSERVER,查看服务器属性,发现常规--》名称--》只有一个LGB-PC,而且下面提示说是:“服务器和实例的名称”,难道两个名称合二为一了?!
点击左侧的“查看链接属性”,发现服务器名称为“LGB-PC”,而实例名为 空 !!!
安装数据库的时候,我设置了名称是MSSQLSERVER,现在怎么为空呢?原因不详。如果为空,使用起来很不方便,需要设置一个名称才好,这个问题稍后再处理!
眼下,最为关紧的问题是我的C#程序代码访问不了我的数据库,因为是我找不到我的MSSQLSERVER实例,就是那个名称为空的数据库实例,通过注册表HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Microsoft SQL Server/InstalledInstance发现如下现象(参见 博客http://www.cnblogs.com/songsz1/archive/2012/12/26/2833862.html):
发现SQLEXPRESS在前,MSSQLSERVER在后,我忽然觉得是不是前者屏蔽了后者?我是菜鸟,具体原因我也不知道,我就是抱着试一试心态,修改为如下:
使用C#程序重新搜寻域内数据库,发现LGB-PC\SQLEXPRESS并没有被屏蔽,依然存在,但是多了一个LGB-PC,选择,输入 sa 和 密码,测试连接成功!!!!
什么原因呢?参见如下网页(http://bbs.csdn.net/topics/390028155),说法如下:“如果你没修改,那么默认实例就是mssql。在使用ssms的时候,连接默认实例可以使用“.”。另外,可以打开sqlserver配置管理器,然后看sql server服务那个选项。右边框第二个:sql server(xxx)那里的xxx就是你的默认实例,补充一下,如果你装的是sql server 2008 r2的话,会默认帮你撞上sql server 2008 express 。默认实例就是没有实例名。
可以直接使用服务器的计算机名、IP、或(local)。注意括号要有,而且是半角的。“ 原因竟然在这里呀!
关于把实例名为空改为看得见的名称,下次再说!!