VB .NET — App.config — строки подключения

#vb.net #app-config #adodb

#vb.net #app-config #adodb

Вопрос:

В 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: «Ссылка на объект не установлена для экземпляра объекта».
Система.Конфигурация.ConnectionStringSettingsCollection.this[string].get ничего не вернуло.

Я не могу понять, что я делаю не так

Комментарии:

1. если это VB.NET тогда почему здесь есть CreateObject линия? И если он обращается к Oracle, то почему ADODB? Это что-то скопированное из Excel VBA или аналогичное?

2. Код был перенесен из vbscript

3. хорошо, тогда вы можете переписать с помощью VB.NET ? Также проверьте, содержит ли ваша папка вывода (где находится exe-файл) файл app.config и имеет ли он правильный connectionStrings узел

4. Да, я могу переписать, но это не решит мою текущую проблему невозможности получить строку подключения из файла конфигурации. Вывод представляет собой DLL-файл (Connections.dll ) и у меня есть файл Connections.dll.config в выходном каталоге. Это правильно?

5. Каков тип вашего проекта? Есть ли у вас доступ к данным в библиотеке классов отдельно от основного приложения? Файл конфигурации должен находиться в основном исполняемом проекте, а не в библиотеке классов.

Ответ №1:

Я не уверен, что вы сделали неправильно, но я только что протестировал сценарий, который вы описали, и он отлично сработал для меня. В подобных ситуациях вы всегда должны создавать тестовый проект, который изолирует конкретную функциональность, с которой у вас возникли проблемы, чтобы протестировать ее конкретно. Вот что я сделал:

  1. Создайте новый проект WinForms.
  2. Создайте новый проект библиотеки классов.
  3. Справочная система.Конфигурация.dll в обоих проектах.
  4. Обратитесь к проекту библиотеки классов в проекте WinForms.
  5. Добавьте соответствующую строку подключения в файл App.config в проекте WinForms.
  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 , я вижу правильную строку подключения, отображаемую в окне вывода оба раза. Если вы можете сделать то же самое и получить те же результаты, то вы знаете, что то, что должно работать, работает. Затем вам нужно искать различия между этим тестовым сценарием и вашим существующим проектом.

Комментарии:

1. Спасибо за ваш ответ. Да, это работает таким образом, но моя проблема заключается в следующем. Как заставить его работать без этого шага: добавьте соответствующую строку подключения в файл App.config в проекте WinForms. Возможно, я не иду правильным путем с тем, чего я хочу достичь, но мой план состоял в том, чтобы создать DLL-файл из библиотеки классов, чтобы разные скрипты (из разных проектов) могли использовать эту DLL для установления соединений. Делая это, я хотел добиться 2 вещей: избежать избыточного кода и особенно скрыть строки подключения от пользователей

2. @Mu21, это невозможно. Должно быть, я неправильно понял, что вы пытались сделать, потому что я предположил, что вы пытаетесь поступить правильно. Когда DLL считывает данные из файла конфигурации, используя этот механизм по умолчанию, он считывает их из файла конфигурации приложения, которое ссылается на него. Вот как это работает. По этой причине существуют всевозможные сторонние библиотеки, которые требуют, чтобы вы добавляли информацию в конфигурационный файл вашего приложения. Проекты DLL выводят только такие вещи, как строки подключения, в файлы конфигурации, чтобы вы могли скопировать их в файл конфигурации приложения.

3. @Mu21, «мой план состоял в том, чтобы создать DLL-файл из библиотеки классов» . Файл DLL ЯВЛЯЕТСЯ библиотекой классов. Проект библиотеки классов генерирует библиотеку классов при сборке, точно так же, как проект приложения Windows Forms выводит приложение WinForms при сборке.

4. @Mu21, «разные скрипты (из разных проектов) могут использовать эту DLL для установления соединений» . Скриптов нет. VB.NET это не язык сценариев. Вы можете ссылаться на свою DLL в любой другой библиотеке или проекте приложения, который вы хотите. Любые данные конфигурации, требуемые библиотекой, должны быть добавлены в файл конфигурации каждого приложения. Вот как это работает, потому что так и должно работать. Как скрыть строки подключения может быть хорошей идеей, когда любому, кто использует вашу библиотеку с приложением на другом компьютере, потребуется отредактировать строку подключения, чтобы она работала?

5. Большое спасибо за пояснения. 1) Строки подключения не нужно редактировать, если не изменить имя пользователя / пароль и 2) Я читал о возможности шифрования файла конфигурации, и именно по этой причине я пытался сделать это таким образом.