Как ссылаться на другую схему без жесткого ее кодирования - PullRequest
2 голосов
/ 21 апреля 2011

У нас есть несколько сред (разработка, тестирование, производство и т. Д.). Используя Oracle 10g. Все значения считываются из web.config. Мы используем ASP.NET 2.0 (c #)

Мы используем более одной схемы базы данных, одну для нашего приложения и одну для стороннего приложения. Для справки я назову их MYAPP и THEIRAPP соответственно.

В коде c # есть операторы SQL, которые ссылаются на THEIRAPP по имени. Например: строка sql = @ "select * from THEIRAPP.address, где zip = {0}";

Это бы хорошо работало, если бы во всех средах было одно и то же соглашение об именах, однако в тестовой среде администратор базы данных использовал другое имя (например, THEIRAPP2), поэтому вызов THEIRAPP.address не работает, потому что он не ' не существует в этой среде.

Как я могу изменить эти запросы в коде C # с наименьшим количеством изменений. Я знаю, что вызовы SQL должны быть в хранимых процедурах, но я не написал код и не имею возможности вносить подобные изменения (по крайней мере, в настоящее время).

Любая помощь или предложения будут оценены. Заранее благодарим за помощь.

Ответы [ 3 ]

4 голосов
/ 21 апреля 2011

Самый простой и наиболее распространенный ответ - убедиться, что имена схем всегда совпадают в разных средах.

Если это невозможно, есть ли конфликты между именами таблиц? То есть есть таблица My_App.Address и таблица Their_App.Address? Если нет конфликтов, вы можете просто создать синонимы, которые указывают на различные таблицы и исключить имена схем

CREATE SYNONYM address FOR my_app.address
CREATE SYNONYM person FOR their_app.person

Если есть конфликты, вы все равно можете использовать синонимы, вам просто нужно переименовать объекты, т.е.

CREATE SYNONYM my_address FOR my_app.address
CREATE SYNONYM their_address FOR my_app.address

За исключением этого, вы можете избежать изменения текущей схемы перед выполнением каждого запроса. Если вы делаете

ALTER SESSION SET current_schema = MY_APP
SELECT * FROM address

вы автоматически выберете из таблицы my_app.address. Если вы делаете

ALTER SESSION SET current_schema = THEIR_APP
SELECT * FROM address

вы автоматически выберете из таблицы their_app.address 1019 *

1 голос
/ 21 апреля 2011

Не могли бы вы использовать файл конфигурации для хранения имен схем? Это кажется самым простым решением.

0 голосов
/ 21 апреля 2011

Хорошо, кое-что из этого зависит от среды (то есть насколько хорошо разделены ваши тестовые и производственные среды?), Но при условии, что вам абсолютно необходимо сделать это с помощью кода: используйте свои файлы конфигурации.

Добавитьраздел конфигурации для ваших операторов Sql (мы назовем его «SqlStatements»), а затем для каждого из ваших (в настоящее время) жестко закодированных операторов есть записи.

Теперь в вашем коде вместо: SqlCommand cmd = new SqlCommand("yourTextHere") вывызовите правильный оператор sql из файла конфигурации и затем запустите свой sql.

Затем вы настраиваете различные файлы конфигурации для вашей тестовой среды и вашей рабочей среды.Это также позволяет вам в будущем изменять свои операторы sql без фактического изменения кода.

Но, как вы сказали, лучший ответ (если вы можете заставить своих боссов согласиться) состоит в том, чтобы переместить код в Stored.Процедуры и просто вызовите их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...