【问题标题】:how can i dynamically change the connection string如何动态更改连接字符串
【发布时间】:2011-04-02 01:09:36
【问题描述】:

我正在使用 vb.net 和 SQL server 2005

我有一个项目,其中包含从数据库对象生成的数据库类。那就是我将一个数据集添加到项目中并将一个数据库对象拖放到它上面。问题是我必须提供一个存储在代码中的连接字符串。这在开发应用程序时是可以的。但是运行时我想使用另一个连接字符串,既出于安全原因,又因为应用程序的每个用户都将对应一个数据库用户(SQL)并且应该有一个相应的连接字符串。有没有一种简单的方法可以做到这一点,而不必恢复到普通的所有数据集并自己做所有事情?

【问题讨论】:

    标签: .net vb.net sql-server-2005 connection-string database-connection


    【解决方案1】:

    将您的连接字符串存储在 app.settings 中

    http://msdn.microsoft.com/en-us/library/a65txexh(VS.80).aspx

    您可以向应用程序调用 app.settings 添加一个文件。在这里,您可以存储连接字符串(它们可以被加密)。要访问它们,您只需调用以下命令

    Dim con As String = ConfigurationManager.ConnectionStrings("myDb").ConnectionString

    如果您必须使用不同的用户名和密码显式登录,只需在应用程序登录时获取用户名和密码。并以编程方式构建字符串。

    这方面的一个例子可能是

      <connectionStrings>
        <add name="myDb" connectionString="MYSERVER;Initial Catalog=MYDB;Persist Security  
    Info=True;User ID={username};Password={pwd}"/>
      </connectionStrings>
    
    Dim con As String = ConfigurationManager.ConnectionStrings("myDb").ConnectionString
    con = con.Replace("{username}",txtUserName.Text)
    con = con.Replace("{pwd}",txtPassword.Text)
    
    'now you can do something with con like hook it up to a dataset
    

    【讨论】:

      【解决方案2】:

      您可以尝试在代码中构建自己的连接字符串。

       Dim sqlConn As SqlClient.SqlConnection = New SqlClient.SqlConnection("server=" & my.Settings.Server & ";uid=" & txtUsername.Text & ";pwd=" & txtPassword.Text & ";database=" &  txtDatabaseName.Text & ";Connect Timeout=150;MultipleActiveResultSets=True")
      

      因此,例如,如果您有一个返回值的函数,并且您需要使用连接字符串中的当前值运行它,您可以执行类似于以下函数的操作。 (代码毫无意义,但更多的是向您展示我在说什么)

      Private Function GetFirstName(ByVal p_CustomerID As String) As String
        Dim cmd As New SqlClient.SqlCommand
        Dim sqlConn As SqlClient.SqlConnection = New SqlClient.SqlConnection("server=" & my.Settings.Server & ";uid=" & txtUsername.Text & ";pwd=" & txtPassword.Text & ";database=" &  txtDatabaseName.Text & ";Connect Timeout=150;MultipleActiveResultSets=True")
        Dim sReturnResult As String = String.Empty
      
        With cmd
          .Connection = sqlConn
          .CommandText = "SELECT [FIRST_NAME] " _
                & " FROM CUSTOMER " _
                & "  WHERE ID = @ID"
          .Parameters.Add("@ID", SqlDbType.VarChar, 30)
          .Parameters("@ID").Value = p_CustomerID
        End With
      
        Dim SQLAdapter As New SqlClient.SqlDataAdapter(cmd)
        Dim ds As New DataSet
      
        Try
          SQLAdapter.Fill(ds, "CUSTOMER")
      
          If ds.Tables(0).Rows.Count > 0 Then
              sReturnResult = ds.Tables("CUSTOMER").Rows(0).Item("FIRST_NAME").ToString()
          End If
        Catch ex As Exception
          MsgBox("GetFirstName: " & ex.Message)
        Finally
          ds.Dispose()
          sqlConn.Dispose()
          cmd.Dispose()
          SQLAdapter.Dispose()
        End Try
      
        Return sReturnResult
      
      
      End Function
      

      如果你有一个强类型的数据集,你想改变表适配器,你也可以用类似的方式来做

      Dim sqlConn As SqlClient.SqlConnection = New SqlClient.SqlConnection("server=" & my.Settings.Server & ";uid=" & txtUsername.Text & ";pwd=" & txtPassword.Text & ";database=" &  txtDatabaseName.Text & ";Connect Timeout=150;MultipleActiveResultSets=True")
      
      CUSTOMERTableAdapter.Connection = sqlConn
      

      最后一点是,我个人从未选中该框以将连接字符串存储在 DataSet 中。我发现如果我错误地这样做了,解决这个问题的最简单方法是创建另一个项目创建一个相同的数据集而不选择保存连接字符串信息,然后我将复制并粘贴 3 或 4 个文件到现有项目的顶部数据集(先备份),然后重新打开项目进行清理和重建。

      【讨论】:

        猜你喜欢
        • 2021-12-18
        • 2018-09-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-17
        相关资源
        最近更新 更多