使用SMO遍历局域网内指定服务器的数据库列表。
每次可以遍历自己电脑上的数据库,但是不能连接网内的其他服务器。本机和其他电脑都使用的是sa和windows混合验证string a;
a = this.ComboBoxSQLServers.SelectedItem.ToString();
if (a == "SPC100702\\SQLEXPRESS")//本机
{
srv.Connect(a, this.textBox_UserName.Text , this.textBox_UserPassWord.Text );
}
else//其他
{
srv.Connect(a, this.textBox_UserName.Text, this.textBox_UserPassWord.Text );
}
foreach (SQLDMO.Database db in srv.Databases)
this.ComboBoxDBs.Items.Add(db.Name.ToString());每次连本机外的其他电脑,在else后都出错。哪为高手帮帮忙本人新手,也不知道有没有分给大家
每次可以遍历自己电脑上的数据库,但是不能连接网内的其他服务器。本机和其他电脑都使用的是sa和windows混合验证string a;
a = this.ComboBoxSQLServers.SelectedItem.ToString();
if (a == "SPC100702\\SQLEXPRESS")//本机
{
srv.Connect(a, this.textBox_UserName.Text , this.textBox_UserPassWord.Text );
}
else//其他
{
srv.Connect(a, this.textBox_UserName.Text, this.textBox_UserPassWord.Text );
}
foreach (SQLDMO.Database db in srv.Databases)
this.ComboBoxDBs.Items.Add(db.Name.ToString());每次连本机外的其他电脑,在else后都出错。哪为高手帮帮忙本人新手,也不知道有没有分给大家
解决方案 »
- .net把Doc转成PDF的代码
- 如何选择月? DateTimePicker
- 问一个没有技术含量的问题
- 在我删除数据的时候总提示错误列名....无效如何解决
- 如何将“25 10 2005"这样的字符串转换为TDateTime类型
- 急!!!怎摸样获得TREEVIEW的第一个节点?
- 求DataGridView使用方法,winform中
- 升级升级升级,我快烦死了,同一件事情做那么多遍,好累~~~~(散分)
- 万恶的课程设计。。呜呜。。求大神改一下学生信息管理系统
- 怎样在datagrid的每一行前面加一个小图表呀?
- C#怎么定时用多线程执行多个任务?
- 求sharpmap如何渲染MS SQL Server等格式的GIS数据?
sqlserver2005 express
无法连接可能与防火墙有关,而获取列表却不是每次都能成功的。因为Smo的EnumAvailableSqlServers依赖于超时的Udp广播。
我使用smo开发过数据库管理软件。不过用Vb做的,登录界面可以选择是Windows 身份验证还是Sql Server 身份验证。
给你贴一段VB代码参考:'获取服务器列表
Public Function GetServerName() As ArrayList
'Dim ObjServer As Server
Dim objServers As DataTable
Dim strServer As String
Dim arrTmp As New ArrayList
objServers = SmoApplication.EnumAvailableSqlServers()
For Each objRow As DataRow In objServers.Rows
strServer = CStr(objRow("Server"))
If Not TypeOf objRow("Instance") Is DBNull AndAlso CStr(objRow("Instance")).Length > 0 Then
strServer += "\" & CStr(objRow("Instance"))
End If
arrTmp.Add(strServer)
'Debug.WriteLine("SQL Server: " & strServer)
Next
Return arrTmp
End Function
'连接数据库服务器,这是使用windows集成身份验证的。
Public Overloads Function ConnectServer(ByVal strServer As String) As Boolean
'Connect to a remote instance of SQL Server.
Dim s As String
'The strServer string variable contains the name of a remote instance of SQL Server. Dim Conn As New ServerConnection()
Conn.ServerInstance = strServer
Dim srv As New Server(Conn)
Try
'这一句记得当时是为了检测错误而加的(上面的重载方法里是同样的意思),通过访问srv的一个属性获知连接成功与否,失败的话再此过程就引发了错误,会被Catch到。当时纯是权宜之计。这是我两年前做的了,凭印象写此说明。 s = srv.NetName
Catch ex As ConnectionFailureException
MsgBox("无法连接到服务器" & strServer & ",请检查用户权限及连接是否可用。", MsgBoxStyle.Exclamation)
Return False
End Try
'The actual connection is made when a property is retrieved.
'Console.WriteLine(srv.Information.Version)
'The connection is automatically disconnected when the Server variable goes out of scope.
MyServer = srv
Return True
End Function
'连接数据库服务器,这是使用Sql Server 身份验证的。
Public Overloads Function ConnectServer(ByVal strServer As String, ByVal LogName As String, ByVal Password As String) As Boolean
Dim s As String
Dim Conn As New ServerConnection()
Conn.ServerInstance = strServer
Conn.LoginSecure = False
Conn.Login = LogName
Conn.Password = Password
Dim srv As New Server(Conn)
Try
s = srv.NetName
Catch ex As ConnectionFailureException
MsgBox("无法连接到服务器" & strServer & ",请检查用户权限及连接是否可用。", MsgBoxStyle.Exclamation)
Return False
End Try MyServer = Srv
Return True
End Function
自己转成C#吧。
不过你要注意如果不是默认实例名的话有可能还要输入实例名的(ServerName\InstanceName)。
当时做项目开始我也用Dmo,后来看了有关资料后发现Dmo落伍了又改用Smo开发了。建议你也用Smo较好。
可以获取到实例名的,就是不能再获取数据库列表了
srv.Connect(a, this.textBox_UserName.Text, this.textBox_UserPassWord.Text);
foreach (SQLDMO.Database db in srv.Databases)
this.ComboBoxDBs.Items.Add(db.Name.ToString());
第一行运行过去之后没有任何反应,到第二行的时候,srv.Databases就没有任何信息了
不过你使用的是Smo,因为我的那个项目只是开始的时候用的Dmo,后来改为用Smo做了,而且时隔两年。记不太清Dmo的事了。不过建议你也改为用Smo.
这里我要说的是你描述的“srv.Databases就没有任何信息了”,也许跟我上面注释的捕获错误的方法原因相同吧?也许srv根本就没有成功连接呢?