![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| Pankon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 739 Регистрация: 2.6.2005 Репутация: 3 Всего: 5 |
Можно ли узнать, что систаксис SQL-строки "правильный"?
|
|||
|
||||
| sergejzr |
|
|||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: нет Всего: 360 |
При компиляции - нет. Ведь строка может создаваться динамически в процессе выполнения программы.
Единственный сбособ - распечатывать ошибку БД при выполнении запроса. ПС: По-русски это называется "валидация" |
|||
|
||||
| Pankon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 739 Регистрация: 2.6.2005 Репутация: 3 Всего: 5 |
||||
|
||||
| ivashkanet |
|
|||
![]() Кодю потиху ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3684 Регистрация: 23.2.2006 Где: Гомель, Беларусь Репутация: 47 Всего: 149 |
Pankon, так у VS вроде есть SQL анализатор
Вернее не анализатор, а SQL-builder вот в нем и проверь свою строку |
|||
|
||||
| sergejzr |
|
|||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: нет Всего: 360 |
Зачем его писать, когда БД это делает. Полюбому точно отвалидировать запрос может только сама БД. Их миллион разных и программно этого сделать невозможно (да и не надо в большинстве случаев.) В мускуле например можно приписывать вначале запроса "EXPLAIN" тогда запрос выполняться не будет, но сообщение об ошибке(если таковая имеется) выдаст. Но это всё уже при выполнении программы. Вообще, если запрос один раз хорошо отлажен, проверять его каждый раз не имеет смысла. |
|||
|
||||
| Pankon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 739 Регистрация: 2.6.2005 Репутация: 3 Всего: 5 |
это как раз тот случай, когда надо... Динамически сгенерированные строки передаются на несколько серверов, где и происходит коннект с базой данных, и если строки пошли "неправильные", то получать 10 сообшений (с каждого сервера) об неправильном SQL не хотелось бы... |
|||
|
||||
| ivashkanet |
|
|||
![]() Кодю потиху ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3684 Регистрация: 23.2.2006 Где: Гомель, Беларусь Репутация: 47 Всего: 149 |
Ну так заведи тестовую таблицу и к ней обращайся ловя (или нет) по пути эксепшены. Или ты дебажить проект будешь на реальных серверах? |
|||
|
||||
| Pankon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 739 Регистрация: 2.6.2005 Репутация: 3 Всего: 5 |
или тестовую базу данных...
Приложение уже работает, только время от времени дает сбои(сообшения об ошибке на каждом сервере), по причине неверного ввода пользователями динамических частей SQL-строки |
|||
|
||||
| sergejzr |
|
|||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: нет Всего: 360 |
Это в 99,99% приложений так. Программно надо проверять отдельные части, чтобы не послать строку туда, где необходимо целое число, экранировать кавычки, итд. В отлаженных запросах ошибки могут быть только логические но не синтактические! |
|||
|
||||
| ivashkanet |
|
|||
![]() Кодю потиху ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3684 Регистрация: 23.2.2006 Где: Гомель, Беларусь Репутация: 47 Всего: 149 |
Есть много вариантов: 1) Тестовая таблица в реальной БД на реальном сервере 2) Тестовая таблица в тестовой БД на реальном сервере 3) Тестовая таблица в реальной БД на тестовом сервере 4) Тестовая таблица в тестовой БД на тестовом сервере Какой выбираешь? Пользователи сами вводят SQL-строки Внеси в прогу вывод отладочной информации, просмотри исходные данные на которых валиться запрос, найди ошибку, оттестируй новый запрос на тестовой базе, таблице, сервере (нужное подчеркнуть) Добавлено @ 13:07 Третий не катит |
|||
|
||||
| Дрон |
|
||||||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 24 Всего: 93 |
Во-во. Сам удивляюсь Pankon, ты уж поаккуратней с "динамическими частями SQL-строки". А то мало ли у тебя там запросы вроде:
Если так, то тут никакая проверка синтаксиса уже не поможет, ведь если я введу в качестве логина вот такое:
то синтаксис останется верным, а результат... Это сообщение отредактировал(а) Дрон - 11.10.2006, 13:11 -------------------- Да. Именно так. |
||||||
|
|||||||
| Pankon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 739 Регистрация: 2.6.2005 Репутация: 3 Всего: 5 |
в запросе несколько таблиц... (можно сказать - почти вся база)
некоторых можно так назвать все запросы, которые вводят пользователи из группы "так называемые Администраторы" предусмотреть невозможно, а им по определению(читай - техническое задание) должна быть доступна часть строки для динамического ввода... Большой процент ошибок, что вводят пользователи, такого характера - "AND T1.F1=10 AND T2.F2=20 AND T3.F1=<30" Добавлено @ 13:21 техническое задание не изменить... Это сообщение отредактировал(а) Pankon - 11.10.2006, 13:22 |
|||
|
||||
| ivashkanet |
|
|||
![]() Кодю потиху ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3684 Регистрация: 23.2.2006 Где: Гомель, Беларусь Репутация: 47 Всего: 149 |
Ааа, да, тута я тормазнул
Так предложи сделать "query builder", типа несколько выпадающих списков, как в Экселе, например, Первый список: "поле", второй: ">,<,<=,>=", третий: "значение". P.S. Так проблемма в этом: "=<"? Взашей таких "админов" надо |
|||
|
||||
| Pankon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 739 Регистрация: 2.6.2005 Репутация: 3 Всего: 5 |
эта идея у меня давно витает... но не для этого проекта...
это "так называемые Администраторы" не компьютерных систем Добавлено @ 13:33 точнее сказать "несколько десятков" |
|||
|
||||
| Дрон |
|
|||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 24 Всего: 93 |
Задача:
- проверить синтаксис SQL запроса, не выполняя его Решение: - нужно попытаться создать хранимую процедуру, содержащую предполагаемый запрос: при создании хранимой процедуры сервер проверит валидность её содержимого Вот ЗЫ: Кстати, а почему тема не в разделе про базы данных? Это сообщение отредактировал(а) Дрон - 11.10.2006, 14:21 -------------------- Да. Именно так. |
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |