.net 如何像Visual Studio中使用的那样重新创建数据库连接向导?

.net 如何像Visual Studio中使用的那样重新创建数据库连接向导?,.net,vb.net,.net,Vb.net,我基本上想在我的应用程序中实现这一点,这样我们的技术人员就可以更轻松地安装我们的软件。到目前为止,我制作了一个包含4个文本框的表单:服务器名、用户名、密码和一个选择数据库的组合框。在数据库选择代码出现之前,一切都很简单。Microsoft的向导非常高效,在填充数据库组合框时没有等待时间。以下是我能想到的最好的: Private Sub cmbDatabase_DropDown(ByVal sender As Object, ByVal e As System.EventArgs) Handl

我基本上想在我的应用程序中实现这一点,这样我们的技术人员就可以更轻松地安装我们的软件。到目前为止,我制作了一个包含4个文本框的表单:服务器名、用户名、密码和一个选择数据库的组合框。在数据库选择代码出现之前,一切都很简单。Microsoft的向导非常高效,在填充数据库组合框时没有等待时间。以下是我能想到的最好的:

  Private Sub cmbDatabase_DropDown(ByVal sender As Object, ByVal e As System.EventArgs) Handles cmbDatabase.DropDown
    Dim databaselist As New DataSet
    Dim connection As SqlClient.SqlConnection
    If txtServer.Text <> "" And txtLogin.Text <> "" And txtPassword.Text <> "" Then

        Try
        connection = New SqlClient.SqlConnection("Data Source=" + txtServer.Text + ";Initial Catalog=master;User ID=" + txtLogin.Text + ";Password=" + txtPassword.Text + ";Connect Timeout=5")
            connection.Open()
        Catch ex As Exception
        End Try


        If Not connection.State = ConnectionState.Closed Then
            Dim command As New SqlClient.SqlDataAdapter("EXEC sp_databases", connection)
            command.Fill(databaselist)
            cmbDatabase.DataSource = databaselist.Tables(0)
            cmbDatabase.DisplayMember = "DATABASE_NAME"
        End If
    End If
Private Sub cmbDatabase_下拉列表(ByVal sender作为对象,ByVal e作为System.EventArgs)处理cmbDatabase.DropDown
Dim databaselist作为新数据集
将连接设置为SqlClient.SqlConnection
如果txtServer.Text“”和txtLogin.Text“”以及txtspassword.Text“”,则
尝试
connection=New SqlClient.SqlConnection(“数据源=“+txtServer.Text+”;初始目录=master;用户ID=“+txtLogin.Text+”;密码=“+txtPassword.Text+”;连接超时=5”)
connection.Open()
特例
结束尝试
如果不是connection.State=ConnectionState.Closed,则
Dim命令作为新的SqlClient.SqlDataAdapter(“EXEC sp_数据库”,连接)
command.Fill(数据库列表)
cmbDatabase.DataSource=databaselist.Tables(0)
cmbDatabase.DisplayMember=“数据库名称”
如果结束
如果结束

这段代码可以很好地获取数据库,但很明显,如果发生异常,整个屏幕都会锁定,并且可能需要一段时间才能恢复,具体取决于数据库错误是什么。我的问题是,我能让我的产品和微软的一样酷/高效吗

当然可以。微软只是花了更多的时间。他们使用的所有工具也可供您使用。以下是一些线索:

  • 在非UI线程上处理尽可能多的数据库查询。例如,当使用
    SqlDataSourceEnumerator
    查找网络上的所有SQL实例时,将其放在线程中,或者更好地使用TPL并使其成为可取消的任务。在非UI线程上做尽可能多的工作,这样它就不会阻塞。如果这可能是一个需要一段时间才能返回的操作,则显示一个类似“搜索”的对话框,其中带有一个取消按钮,用于取消线程/任务
  • 更好的错误处理。处理异常并决定它们是否对用户有用
  • 至于获取数据库,我会远离SqlDataAdapter,只使用阅读器。对于如此少的信息,数据适配器非常重要

  • 我不知道SqlDataSourceEnumerator,我会调查的。此外,我使用的是.NET 3.5,因此我没有TPL:(