Страница: 1 |
|
Вопрос: Прямой запрос в БД посредством ADO .NET
|
Добавлено: 25.06.10 13:44
|
|
Автор вопроса: Алексей
|
Добрый день.
Недавно "пересел" с VB6 на VB .NET 2008. Вроде разобрался, но в одном возникла проблема: как задать прямой запрос в БД?
БД - Access. В VB6 было все просто^
dim conn as new adodb.connection
conn.open "Строка соединения с базой"
conn.Execute("SQL запрос")
В итоге данной операцией возможно прямое создание таблиц в БД (и много чего ещё)
Как такую же констукцию организовать в VB 2008? Перерыл массу литературы но ответа так и не нашел. Может кто сталкивался? или подобное невозможно?
Ответить
|
Номер ответа: 5 Автор ответа: Artyom
Разработчик
Вопросов: 130 Ответов: 6602
|
Профиль | | #5
|
Добавлено: 27.06.10 09:23
|
Обработка ошибок не обязательно должна быть. А если должна, то не обязательно именно в этом месте.
Если исключение ожидаемо и вероятно, и известно как на него реагировать, то обработка ошибок делается.
Так же если работает критический участок кода, то обработка ошибок тоже как правило делается для того чтоб даже неожидаемые, непредусмотреные исключения не повредили работу критического участка кода.
Если же исключение не ожидается, или если неизвестно как реагировать на исключения, то в специальном обработчике нет необходимости. Максимум что можно сделать - запротоколировать исключение и сообщить пользователю о том что произошла ошибка (а это как правило делается где-нибудь в начале стека).
- catch (Exception e) { MessageBox.Show("Ошибка выполнения запроса. \n" + e.Message.ToString(), "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Information); }
Это не обрабокта ошибок, а заглушка. В VB6 вместо этого было
Перешли на VB .NET, а продолжаем писать в стиле VB6.
Не понятно какое исключение ты ожидаешь получить и не понятно как тебе нужно на него реагировать. Поэтому просто показываем MsgBox тому кто может вообще ничего в нем не понимать и даем работать вызывающему коду как ни в чем не бывало (при том что это может привести к разсогласованию данных, нарушению целостности БД, переводу приложения в сбойное состояние.
Например, если есть код, который выполняет синхронизацию данных с несколькими удленными серверами, то ситуация когда синхронизация с каким-то сервером будет неудачной очень вероятна. Может упасть удаленный сервер, может упасть сеть, администраторы могут изменить настрйоки безопаности и удаленный сервер перестанет принимать подключения, программисты могут изменить формат данных.
Ситуация ожидаемая и есть варианты как на нее реагирвоать - можно просто проигноорировать проблемный сервер, повторить попытку, сделать повторную попытку спустя время.
Есть код, который сохраняет в БД новый заказ и отправляет оповещение менеджеру по E-mail. При отправке сообщения что-то может пойти не так (SMTP сервер упал, поменяли настрйоки доступа к SMTP серверу). Хотя это и маловероятно, так как SMTP сервер обычно контролируется владельцем сайта, эта операция не является важной. Даже если отправка не удалась, заказ все равно сохранен в БД, и менеджер его увидит когда зайдет на сайт в раздел заказов. Для отправки E-mail можно поставить простую заглушку, которая сохраняет исключение в журнал и продолжает работу кода - никакого разсогласования не будет.
Если же при вставке новой записи в базу данных приложения произошла ошибка, то это во-первых, неожидаемо. Потому что наиболее вероятные причины - упал сервер СУБД, упала сеть до сервера СУБД, поврежден диск на котором находится БД, изменилась схема данных, вставляется запись с дублирующимся ключем, INSERT запрос с обишкой.
Во-вторых, непонятно что делать. Потому что какая бы причина не была, продолжать работу скорее всего нет смысла.
Если СУБД лежит, то приложение работать не может пока ее не поднимут.
Если поврежден диск, приложение не будет работать пока не заменят диск и не восстановят базу из резервной копии
Если изменилась схема данных, то нужно модифицировать код приложения чтоб он мог работать с новой схемой.
Если вставляется запись с дублирующимся ключем, нужно искать ошибку в коде. Возможно по ошибке одна и та же запись вставляется 2 раза, или один и тот же ключ берется для двух записей (вполне возможно в многопоточных приложениях с ошибками синхронизации потоков).
Если запрос с ошибкой, то нужно исправлять запрос.
В любом случае единственное что можно сделать - дать исключению выйти по стеку, чтоб оно было запротоколировано в журнал, а пользователю выдалось сообщение о том что произошла ошибка, или детали ошибки (если это уместно - в публичных сайтах детали выдавать не нужно).
Еще один пример - работа с транзакциями. При этом возможны ошибки. При завершении транзакции возникла несогалсованность данных, или дедлок, такие ситуации в принципе ожидаемы, и даже если корректно на них отреагирвоать нельзя, пользователю можно описать суть проблемы и дать возможность повторно выполнить операцию. Здесь впрочем ловится не Exception, а уже более конкретное исключение.
Или если хранимая процедура может вернуть определенный код ошибки - то же самое.
Вобщем обеспечить правильную обработку исключений на самом деле намного сложнее чем правильное и своевременное освобождение 3-х критических объектов.
Ответить
|
Страница: 1 |
Поиск по форуму