Мне нужна помощь с моим приложением C#.
В настоящее время он работает нормально, но одно из новых требований заказчика - реализовать базовую базу данных (MS SQL или Oracle) с использованием любой пользовательской схемы, выбираемой перед запуском программы.
Внутри моего приложения около 150 объектов DataCommand.
Поэтому мне нужно перехватить каждое выражение SQL внутри моего приложения до его выполнения и изменить местоположение целевого объекта (ов). Например, чтобы изменить:
SELECT APPLICATION_NAME FROM **MY_SCHEMA**.APPLICATIONS
к
SELECT APPLICATION_NAME FROM **NEW_SCHEMA**.APPLICATIONS
Насколько я понимаю, решение этой проблемы - это внедрить какой-то код в каждый IDbCommand
внутри моего приложения, но не могу представить себе точку старта.
Любые предложения, пожалуйста.
Это одна часть решения. Но как я могу произвести замену внутри ВСЕХ объектов DataCommand, не трогая всех?
Сегодняшний обходной путь:
Новый владелец схемы читается из файла конфигурации:
System.Configuration.AppSettingsReader configurationAppSettings = new System.Configuration.AppSettingsReader();
String strSchemaOwner = ((string)(configurationAppSettings.GetValue("DatabaseOwner", typeof(string))));
Каждая форма имеет список команд базы данных (аналог элементов управления формой), который заполняется объектами команд.
В событии FormLoad
я передаю этот массив методу, который заменяет текст каждой команды:
foreach(IDbCommand pCommand in arrCollection)
{
pCommand.CommandText = pCommand.CommandText.Replace("MY_SCHEMA", strSchemaOwner);
}
Вы можете включить его в app.config либо как всю строку подключения, либо как схему как приложение.