0

编写一个 VB .NET windows 应用程序。

我们有一个由 3 个 SQL 服务器组成的 LAN 网络,每个服务器上都有相同的数据库表。唯一的区别是适用于 3 个不同用户位置的数据。

尝试使用我相当新的 LINQ to SQL,因此这个问题。

我创建了一个 .dbml 文件并连接到其中一台服务器。然后我将几张桌子拖到那里。连接字符串存储在项目设置中。然后,我为其他服务器创建了另外两个连接字符串。

我的问题是,我能否以某种方式覆盖代码中的数据上下文连接以根据可变条件连接到其他 2 台服务器?

这是我到目前为止的代码,但我的“覆盖”似乎不起作用。当我调试数据上下文变量时,它显示了设计时的原始连接?

'' 根据位置创建与 SQL 服务器的 LINQ 数据上下文连接 Public dbContext As New DataBaseDataContext()

Select Case My.Settings.Location
            Case "Bowling Green"
                dbContext.Connection.ConnectionString = My.Settings.bg_prodConnectionString

                Dim query = From emp In dbContext.employees _
                          Select emp

                For Each emp In query

                    MsgBox(emp.name.ToString())

                Next

            Case "Delphos"
                Dim DelphosContext As New DataBaseDataContext(My.Settings.delphos_prodConnectionString)
                'DelphosContext.Connection.ConnectionString = My.Settings.delphos_prodConnectionString

                Dim query = From emp In DelphosContext.employees _
                            Select emp _
                            Where emp.employee_id = "0028"
                            Order By emp.name

                For Each emp In query

                    MsgBox(emp.name.ToString())

                Next

            Case "Tiffin"

                dbContext.Connection.ConnectionString = My.Settings.tiffin_prodConnectionString

        End Select
4

1 回答 1

0

我找到了一个很好的解决方案,它涉及几个设置步骤,但没有什么困难。请记住,服务器和数据库需要在架构上相同,但我有一个工作轮见步骤 5。

1) 创建您的 DBML 文件并将一些表拖到其中。我的被​​称为“数据库”。您现在必须对 DBML 的数据上下文属性做一些事情,另外: A) 展开连接属性并清除您在那里看到的任何连接字符串。B) 将应用程序设置设置为 false,因此项目不使用任何设置。C)从 DBML 中删除 DBML 自动创建的任何连接字符串(设置为无)(我这样做是为了确保设置文件连接没有覆盖我的运行时代码)

2) 像这样将静态 SQL 服务器连接添加到 app.config 文件。

<pre>
 <appSettings>
     <add key="BGConnectionString" value="bg_prodConnectionString"/>
     <add key="DelphosConnectionString" value="delphos_prodConnectionString"/>
     <add key="TiffinConnectionString" value="tiffin_prodConnectionString"/>
</appSettings>
<connectionStrings>
    <add name="bg_prodConnectionString" connectionString="Data Source=tmd-bg-sql;Initial Catalog=bg_prod;Persist Security Info=True;User ID=sa"
        providerName="System.Data.SqlClient" />
    <add name="delphos_prodConnectionString" connectionString="Data Source=tmd-d2-sql;Initial Catalog=delphos2_prod;Persist Security Info=True;User ID=sa"
        providerName="System.Data.SqlClient" />
    <add name="tiffin_prodConnectionString" connectionString="Data Source=tmd-tiffin-sql;Initial Catalog=tiffin_prod;Persist Security Info=True;User ID=sa"
        providerName="System.Data.SqlClient" />
</connectionStrings>
<code>

3)这里的想法是在应用程序的所有表单和类等中使用一个且只有一个数据上下文,因此设置一个公共变量。我们要做的是给它一个初始连接字符串,以后可以更改。

<pre>
Public dc As New DataBaseDataContext("Data Source=tmd-bg-sql;Initial Catalog=bg_prod;Persist   Security Info=True;User ID=sa")
<code>

4)使用某种变量来确定您的服务器/数据库“覆盖”如何工作。我在 MyProject (VB) 中使用了一个名为“location”设置的 My.settings 字符串变量。这以在启动时调用的另一种形式保存。

现在做一次“覆盖” (程序启动表单或模块)并允许它在全球任何地方使用。

<pre>
  ' save this first settings first before executing this code block
  Select Case My.Settings.Location
            Case "Bowling Green"
                ' Read the ConnectionStrings from the config file
                Dim ConnectionString = ConfigurationManager.ConnectionStrings(ConfigurationManager.AppSettings.Get("BGConnectionString")).ConnectionString
                dc.Connection.ConnectionString = ConnectionString

                Try

                    Dim query = From emp In dc.employees _
                       Select emp.name, emp.employee_id _
                       Order By name

                    For Each emp In query

                        MsgBox("BG")
                        Exit For
                        'MsgBox(emp.name)

                    Next

                Catch ex As Exception
                    MsgBox(ex.ToString)

                End Try

            Case "Delphos"
                ' Read the ConnectionStrings from the config file
                Dim ConnectionString = ConfigurationManager.ConnectionStrings(ConfigurationManager.AppSettings.Get("DelphosConnectionString")).ConnectionString
                dc.Connection.ConnectionString = ConnectionString

                Dim query = From emp In dc.employees _
                            Select emp.name, emp.employee_id _
                            Order By name

                For Each emp In query

                    MsgBox("Delphos")
                    Exit For

                Next

            Case "Tiffin"
                ' Read the ConnectionStrings from the config file
                Dim ConnectionString = ConfigurationManager.ConnectionStrings(ConfigurationManager.AppSettings.Get("TiffinConnectionString")).ConnectionString
                dc.Connection.ConnectionString = ConnectionString

                Dim query = From emp In dc.employees _
                           Select emp.name, emp.employee_id _
                           Order By name

                For Each emp In query

                    MsgBox("Tiffin")
                    Exit For

                Next

        End Select

' reference the dc context connection from another form or class
' instance the MDI form to get the public connection
        Dim MDI As New MDIParent

 Dim query = From emp In MDI.dc.employees _
                          Select emp.name, emp.employee_id _
                          Order By name

                For Each emp In query

                    MsgBox("Tiffin")
                    Exit For

                Next

<code>

5) 我现在可以使用最少的代码连接和访问 3 个不同的 SQL 服务器和 3 个不同的数据库。现在,我的数据库几乎是相同的,但如果不是,这里有一个技巧。我的员工表中碰巧有一个额外的字段列。我把那个拖到 DBML 中。只要您在 LINQ 查询中指定所需的列名,当查询“覆盖”到另一个数据库时,您就可以避免异常错误。

我不能为此承担所有功劳。我从这里找到了其他代码。 点击获取代码

和这里:

并点击这里

于 2013-10-21T14:12:36.950 回答