【问题标题】:VB .NET - App.config - Connection StringsVB .NET - App.config - 连接字符串
【发布时间】:2023-04-04 00:10:02
【问题描述】:

在 VB .NET 2019 中,我有一些代码可以连接到 Oracle 数据库:

Private Const connectionString = "Provider=OraOLEDB.Oracle.1;Persist Security Info=False;Data Source=someSource;User ID=someUser;Password=somePassword"

Public Function Connect() As Object
    Connect = CreateObject("ADODB.Connection")
    Connect.ConnectionString = connectionString 
    Connect.CursorLocation = 3
    Connect.Open
    ...
End Function

此代码运行良好。现在我正在尝试将 connectionString 定义移动到 app.config 文件中。

app.config:

<connectionStrings>
    <add name="TestConnection" connectionString="Provider=OraOLEDB.Oracle.1;Persist Security Info=False;Data Source=someSource;User ID=someUser;Password=somePassword" />
</connectionStrings>

在我的代码中,我只是改变了这个:

Connect.ConnectionString = connectionString 

作者:

Connect.ConnectionString = ConfigurationManager.ConnectionStrings("TestConnection").ConnectionString

当我运行代码时,我收到以下错误: System.NullReferenceException:“对象引用未设置为对象的实例。” System.Configuration.ConnectionStringSettingsCollection.this[string].get 返回 Nothing。

我不知道我做错了什么

【问题讨论】:

  • 如果是 VB.NET 那么为什么会有CreateObject 行呢?如果它正在访问 Oracle,那么为什么要使用 ADODB 呢?这是从 Excel VBA 或类似文件中复制的内容吗?
  • 代码是从 vbscript 迁移而来的
  • 好的,那你能用VB.NET重写吗?还要检查您的输出文件夹(exe 所在的位置)是否包含 app.config 文件并且它具有正确的 connectionStrings 节点
  • 是的,我可以重写,但这并不能解决我当前无法从配置文件中检索连接字符串的问题。输出是一个 dll 文件 (Connections.dll),我在输出目录中有一个 Connections.dll.config 文件。对吗?
  • 您的项目类型是什么?您是否拥有与主应用程序分开的类库中的数据访问权限?配置文件需要在主可执行项目中,而不是类库中。

标签: vb.net app-config adodb


【解决方案1】:

我不确定你做错了什么,但我刚刚测试了你描述的场景,它对我来说效果很好。在这种情况下,您应该始终创建一个测试项目来隔离您遇到问题的特定功能,以便对其进行专门测试。这是我所做的:

  1. 创建一个新的 WinForms 项目。
  2. 创建一个新的类库项目。
  3. 在两个项目中引用 System.Configuration.dll。
  4. 在 WinForms 项目中引用类库项目。
  5. 在 WinForms 项目中的 App.config 文件中添加适当的连接字符串。
  6. 在类库项目中添加一个读取该连接字符串的类。
  7. 在 WinForms 项目中创建库类的实例并获取它读取的连接字符串。

这是我的 App.config 文件:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <connectionStrings>
      <add name="TestConnection" connectionString="Data Source=(local);Initial Catalog=MyDatabase;Integrated Security=True"/>
    </connectionStrings>
    <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8"/>
    </startup>
</configuration>

这是我的图书馆类:

Imports System.Configuration

Public Class Class1

    Public Property ConnectionString As String

    Public Sub New()
        ConnectionString = ConfigurationManager.ConnectionStrings("TestConnection").ConnectionString
    End Sub

End Class

这是我的表单类:

Imports System.Configuration
Imports ClassLibrary1

Public Class Form1

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim testConnectionString = ConfigurationManager.ConnectionStrings("TestConnection").ConnectionString

        Debug.WriteLine(testConnectionString)
    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        Dim obj As New Class1

        Debug.WriteLine(obj.ConnectionString)
    End Sub
End Class

当我运行该 WinForms 项目并单击 Buttons 时,我看到输出窗口中都显示了正确的连接字符串。如果你能做同样的事情并获得相同的结果,那么你就知道应该做什么,确实有效。然后,您需要查找此测试场景与您现有项目之间的差异。

【讨论】:

  • 感谢您的回复。是的,它确实以这种方式工作,但我的问题是这个。如何在没有这一步的情况下使其工作:在 WinForms 项目中的 App.config 文件中添加适当的连接字符串。也许我没有以正确的方式实现我想要实现的目标,但我的计划是从类库中创建一个 DLL 文件,以便不同的脚本(来自不同的项目)可以使用这个 DLL 进行连接。通过这样做,我想实现两件事:避免冗余代码,尤其是对用户隐藏连接字符串
  • @Mu21,这是不可能的。我一定误解了你试图做的事情,因为我认为你试图做正确的事情。当 DLL 使用该默认机制从配置文件中读取数据时,它会从引用它的应用程序的配置文件中读取数据。这就是它的工作原理。出于这个原因,有各种各样的第三方库需要您将信息添加到应用程序的配置文件中。 DLL 项目仅将连接字符串之类的内容输出到配置文件,以便您可以将它们复制到应用程序配置文件中。
  • @Mu21,“我的计划是从类库中创建一个 DLL 文件”。 DLL 文件是类库。类库项目在构建时会生成一个类库,就像 Windows 窗体应用程序项目在构建时会输出一个 WinForms 应用程序一样。
  • @Mu21, “不同的脚本(来自不同的项目)可以使用这个DLL来建立连接”。没有脚本。 VB.NET 不是脚本语言。您可以在所需的任何其他库或应用程序项目中引用您的 DLL。库所需的任何配置数据都必须添加到每个应用程序的配置文件中。这就是它的工作方式,因为它应该是这样工作的。当使用您的库和不同机器上的应用程序的任何人都需要编辑连接字符串以使其工作时,隐藏连接字符串怎么可能是一个好主意?
  • 非常感谢您的解释。 1) 除非用户名/密码更改,否则不需要编辑连接字符串;2) 我正在阅读有关加密配置文件的可能性,这就是我尝试这样做的原因。
猜你喜欢
  • 2010-12-22
  • 2013-02-01
  • 2023-04-04
  • 2022-02-19
  • 1970-01-01
  • 2013-03-04
  • 2018-01-06
  • 2016-02-10
  • 1970-01-01
相关资源
最近更新 更多