【问题标题】:How to select a connection string dynamically from the config file from a session variable?如何从会话变量的配置文件中动态选择连接字符串?
【发布时间】:2023-04-07 07:30:01
【问题描述】:

我试图创建的是一个单一的登录屏幕,它根据每个用户拥有的特定代码将用户连接到不同的数据库。

我在我的配置文件中创建了一些与用户代码相对应的键,如下所示

<appSettings>
<add key="ch001" value="h001"/>
<add key="ch002" value="h002"/>
</appSettings>

然后我创建了如下连接字符串

<connectionStrings>
<add name="Dbconn_h001" connectionString="XXX" providerName="XXX"/>
<add name="Dbconn_h002" connectionString="XXX" providerName="XXX"/>
</connectionStrings>

然后我创建了一个类来获取连接字符串对应的键值如下

Imports System.Web.Compilation

导入 System.CodeDom 导入 System.ComponentModel

公共类 ConnStringExpressionBuilder 继承 ExpressionBuilder

Public Shared Function GetEvalData(ByVal expression As String, ByVal target As Type, ByVal entry As String) As Object

    Return System.Configuration.ConfigurationManager.ConnectionStrings("Dbconn_" & System.Configuration.ConfigurationManager.AppSettings(HttpContext.Current.Session("code").ToString))
End Function
Public Overrides Function GetCodeExpression(ByVal entry As BoundPropertyEntry, ByVal parsedData As Object, ByVal context As ExpressionBuilderContext) As CodeExpression
    Dim type1 As Type = entry.DeclaringType
    Dim descriptor1 As PropertyDescriptor = TypeDescriptor.GetProperties(type1)(entry.PropertyInfo.Name)
    Dim expressionArray1(2) As CodeExpression
    expressionArray1(0) = New CodePrimitiveExpression(entry.Expression.Trim())
    expressionArray1(1) = New CodeTypeOfExpression(type1)
    expressionArray1(2) = New CodePrimitiveExpression(entry.Name)
    Return New CodeCastExpression(descriptor1.PropertyType, New CodeMethodInvokeExpression(New CodeTypeReferenceExpression(MyBase.GetType()), "GetEvalData", expressionArray1))
End Function

结束类

问题是

System.Configuration.ConfigurationManager.AppSettings(HttpContext.Current.Session("code").ToString)

返回一个空引用

【问题讨论】:

标签: asp.net connection-string


【解决方案1】:
using(SqlConnection conn = new SqlConnection()) 
{
 var connString=ConfigurationManager.AppSetting["keyname"];
 conn.ConnectionString = connString;
// using the code here...
}

并在配置文件中保存为 &lt;add key="ch001" value="YourConnectionString" /&gt;

【讨论】:

  • keyname 将来自您的会话
  • 如果 SqlDataSource 控件嵌入在 EditTemplate 中,那么后面的代码将无法访问它。
【解决方案2】:

经过长时间的努力,我发现我创建了这个表达式构建器类

Public Class ConnStringExpressionBuilder
Inherits ExpressionBuilder

Public Shared Function GetEvalData(ByVal expression As String, ByVal target As Type, ByVal entry As String) As Object

    Return System.Configuration.ConfigurationManager.ConnectionStrings(System.Configuration.ConfigurationManager.AppSettings(HttpContext.Current.Session("code").ToString())).ToString()

End Function
Public Overrides Function GetCodeExpression(ByVal entry As BoundPropertyEntry, ByVal parsedData As Object, ByVal context As ExpressionBuilderContext) As CodeExpression
    Dim type1 As Type = entry.DeclaringType
    Dim descriptor1 As PropertyDescriptor = TypeDescriptor.GetProperties(type1)(entry.PropertyInfo.Name)
    Dim expressionArray1(2) As CodeExpression
    expressionArray1(0) = New CodePrimitiveExpression(entry.Expression.Trim())
    expressionArray1(1) = New CodeTypeOfExpression(type1)
    expressionArray1(2) = New CodePrimitiveExpression(entry.Name)
    Return New CodeCastExpression(descriptor1.PropertyType, New CodeMethodInvokeExpression(New CodeTypeReferenceExpression(MyBase.GetType()), "GetEvalData", expressionArray1))
End Function

结束类

然后在我的标记中我这样称呼这个类

<asp:SqlDataSource ID="Ds" runat="server" ProviderName="Mysql.Data.MysqlClient"
    ConnectionString="<%$ ConnStringExpression:Dbconn %>" SelectCommand="XXX"></asp:SqlDataSource>

然后从后面的代码

Using conn = getConnect(System.Configuration.ConfigurationManager.AppSettings(Session("code").ToString()))
        conn.Open()

        Try
           //logic
        Catch ex As Exception

        End Try
        conn.Close()
    End Using

【讨论】:

    猜你喜欢
    • 2010-12-08
    • 2011-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-25
    • 1970-01-01
    相关资源
    最近更新 更多