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