2013-11-14 3 views
0

Я работаю над проектом, где мы должны запросить старую базу данных SQL Server 2000 (PeopleSoft, если вам нужно знать). Запрос возвращает набор результатов. Если бы мы были в более новой базе данных, я бы использовал хранимые процедуры и обработку ошибок (например, @ErrNo, @ErrMsg, Try/Catch), чтобы получить то, что я хочу.SQL Server ADO.Net извлекает информацию об ошибке из sql-скрипта

Однако мы находимся на SQL Server 2000, и нам НЕ разрешено использовать хранимые процедуры, поэтому нам остается использовать только динамические SQL-запросы и скрипты. В настоящее время мы используем ADO.Net (например, DbCommand и Execute methods) для получения нашего набора результатов.

Что я хотел бы сделать, это добавить больше ошибок/проверки правильности в наши SQL-скрипты и вернуть сообщения в наш .Net-код. (например, входное значение недействительно, строка не найдена и т. д.)

Кто-нибудь знает, как это сделать под этими ограничениями? Если нет простых способов сделать это, можете ли вы порекомендовать некоторые альтернативы? например

  1. попросить DBA создать специализированную таблицу сообщений/протоколирования для нас и в наших сценариях, писать в эту таблицу и в нашем коде, прочитать, что таблица

  2. перерыв наши кода/скрипты на несколько этапов и вызывать его из нашего кода .Net (тогда мы должны будем использовать транзакции?)

  3. и т. д.? На самом деле ударяю головой ...

Спасибо всем.

ответ

0

Сохраненные процедуры имеют мало общего с тем, что (я чувствую) вы пытаетесь достичь. Даже если у вас есть обработка ошибок в хранимой процедуре, вы все равно собираетесь отправлять недопустимые данные, чтобы получить обработанную ошибку. Похоже, вам нужно, чтобы «до того, как DB call» проверили.

Что вы можете сделать, чтобы улучшить свою ситуацию, так это использовать Ado.net в значительной степени. В частности - используйте DataTables. Вы можете загрузить схему, и она создаст ваш DataTable в форме вашей таблицы Sql. Проверьте свойства DataTableColumn объекта http://msdn.microsoft.com/en-us/library/system.data.datacolumn_properties%28v=vs.90%29.aspx

При попытке вставить недопустимые данные в эту таблицу первым, он выдаст ошибку, и вы будете иметь возможность создавать определенную обработку ошибок.

Кроме того, вы можете (и должны) заменить динамический sql параметризованным запросом. Это рекомендуется и улучшит производительность.

Вместо:

"select * from customer where id = " + custId.ToString() 

Вы должны сделать:

"select * from customer where id = @1" 

Затем, когда вы создаете объект команды, необходимо добавить параметр. Это хорошо для производительности сервера Sql.

Хотя для вас DataTable будет линией защиты от отправки ошибочного кода на сервер.

Другой способ - полностью написать собственную логику проверки данных на основе INFORMATION_SCHEMA.

Другим способом является достоверная проверка ввода данных.

Обычно системы имеют как подтверждение ввода, так и проверку уровня данных.

+0

Благодарим вас за отзыв, но моя ситуация не совсем такая. Например, у нас есть бизнес, когда пользователь вставляет новую строку данных, он должен быть активным/эффективным «на сегодняшний день, а не будущим. Это не применяется в пользовательском интерфейсе или БД. Таким образом, во время моей логики импорта/интеграции мне приходится обрабатывать три сценария: 1) получить ожидаемую запись, которая была только что вставлена, 2) не обнаружена запись (непредвиденная ситуация с ошибкой) или 3) строка существует, но недействительна и не должна возвращаться. Мне нужно провести различие между двумя последними сценариями. Это всего лишь один общий пример. – Raymond

+0

Нет проблем - вам нужно создать бизнес-уровень, где вы заблокируете свою запись в транзакции. Запросить запись: если вы не нашли записи «RecordNotFoundException». Осмотрите запись на наличие ошибок, и если проблема - бросить 'RecordInvalidException'. И чтобы убедиться, что это не выполняется одновременно, есть хитрость для этого. Вы создаете таблицу DB, называемую «CriticalSectionLock». Там вы можете добавить несколько строк, например 'CustomerRecLock'. Вы блокируете эту запись в транзакции и до тех пор, пока вы ее не отпустите, ни один другой код не получит доступ к логике проверки логики. В общем, что вы думаете, хранит Proc, вам нужен BLL –

Смежные вопросы