| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Общие вопросы по .NET и C# > Валидирунг SQL-строк |
| Автор: Pankon 11.10.2006, 11:43 |
| Можно ли узнать, что систаксис SQL-строки "правильный"? |
| Автор: sergejzr 11.10.2006, 12:07 |
| При компиляции - нет. Ведь строка может создаваться динамически в процессе выполнения программы. Единственный сбособ - распечатывать ошибку БД при выполнении запроса. ПС: По-русски это называется "валидация" |
| Автор: Pankon 11.10.2006, 12:22 |
| вот такую строку и надо проверить а это-то и хотелось избежать Неужели нет способа... ПС. Писать синтаксический анализатор SQL-строки - не предлогать... |
| Автор: ivashkanet 11.10.2006, 12:27 |
| Pankon, так у VS вроде есть SQL анализатор Вернее не анализатор, а SQL-builder вот в нем и проверь свою строку |
| Автор: Pankon 11.10.2006, 12:39 | ||
это как раз тот случай, когда надо... Динамически сгенерированные строки передаются на несколько серверов, где и происходит коннект с базой данных, и если строки пошли "неправильные", то получать 10 сообшений (с каждого сервера) об неправильном SQL не хотелось бы... |
| Автор: ivashkanet 11.10.2006, 12:43 | ||
Ну так заведи тестовую таблицу и к ней обращайся ловя (или нет) по пути эксепшены. Или ты дебажить проект будешь на реальных серверах? |
| Автор: Pankon 11.10.2006, 12:55 |
| или тестовую базу данных... Приложение уже работает, только время от времени дает сбои(сообшения об ошибке на каждом сервере), по причине неверного ввода пользователями динамических частей SQL-строки |
| Автор: sergejzr 11.10.2006, 12:56 | ||
Это в 99,99% приложений так. Программно надо проверять отдельные части, чтобы не послать строку туда, где необходимо целое число, экранировать кавычки, итд. В отлаженных запросах ошибки могут быть только логические но не синтактические! |
| Автор: ivashkanet 11.10.2006, 13:01 | ||
Есть много вариантов: 1) Тестовая таблица в реальной БД на реальном сервере 2) Тестовая таблица в тестовой БД на реальном сервере 3) Тестовая таблица в реальной БД на тестовом сервере 4) Тестовая таблица в тестовой БД на тестовом сервере Какой выбираешь? Пользователи сами вводят SQL-строки
Внеси в прогу вывод отладочной информации, просмотри исходные данные на которых валиться запрос, найди ошибку, оттестируй новый запрос на тестовой базе, таблице, сервере (нужное подчеркнуть) Добавлено @ 13:07 Третий не катит |
| Автор: Дрон 11.10.2006, 13:10 | ||||||
Во-во. Сам удивляюсь Pankon, ты уж поаккуратней с "динамическими частями SQL-строки". А то мало ли у тебя там запросы вроде:
Если так, то тут никакая проверка синтаксиса уже не поможет, ведь если я введу в качестве логина вот такое:
то синтаксис останется верным, а результат... |
| Автор: Pankon 11.10.2006, 13:19 |
| в запросе несколько таблиц... (можно сказать - почти вся база) некоторых можно так назвать все запросы, которые вводят пользователи из группы "так называемые Администраторы" предусмотреть невозможно, а им по определению(читай - техническое задание) должна быть доступна часть строки для динамического ввода... Большой процент ошибок, что вводят пользователи, такого характера - "AND T1.F1=10 AND T2.F2=20 AND T3.F1=<30" Добавлено @ 13:21 техническое задание не изменить... |
| Автор: ivashkanet 11.10.2006, 13:25 | ||
Ааа, да, тута я тормазнул
Так предложи сделать "query builder", типа несколько выпадающих списков, как в Экселе, например, Первый список: "поле", второй: ">,<,<=,>=", третий: "значение". P.S. Так проблемма в этом: "=<"? Взашей таких "админов" надо |
| Автор: Pankon 11.10.2006, 13:32 |
| эта идея у меня давно витает... но не для этого проекта... это "так называемые Администраторы" не компьютерных систем Добавлено @ 13:33 точнее сказать "несколько десятков" |
| Автор: Дрон 11.10.2006, 14:20 |
| Задача: - проверить синтаксис SQL запроса, не выполняя его Решение: - нужно попытаться создать хранимую процедуру, содержащую предполагаемый запрос: при создании хранимой процедуры сервер проверит валидность её содержимого Вот ЗЫ: Кстати, а почему тема не в разделе про базы данных? |
| Автор: ivashkanet 11.10.2006, 14:28 | ||
А не накладно это будет? Ведь такие процедуры будут создаваться часто |
| Автор: Дрон 11.10.2006, 14:30 |
| ivashkanet, дык-ть как я понял проверка синтаксиса нужна не перед выполнением: непосредственно перед выполнением она вообще бессмысленна, т.к. все ошибки будут выявлены сразу. Проверка нужна один раз -- в момент ввода запроса пользователем, чтобы сразу же сказать, что он туда какую-то ерунду ввёл. |
| Автор: Pankon 11.10.2006, 14:30 |
| Программирование-то под дот.нет...., где во FrameWork столько (без)дельных классов... Namespace System.Data например.... а как? (имеется ввиду средствами дот.нет) Добавлено @ 14:31 ага |
| Автор: Дрон 11.10.2006, 14:43 | ||||
Но ведь вопрос про базы данных, а не про .net в частности. А какая у тебя БД? И что значит средствами .NET? Работа с базой всегда идёт через SQL Для MSSQL Server я бы сделал так:
|
| Автор: sergejzr 11.10.2006, 14:52 | ||
Ну и для мускула
|
| Автор: Дрон 11.10.2006, 14:57 |
| sergejzr, да, у них ещё проще -- только там будет не SqlConnection/SqlCommand, а свои классы с префиксом MySql Для Oracle, кстати, тоже есть нечто подобное, только там чуть посложнее будет: просишь сервер посчитать план выполнения, и проверяешь посчитался ли он. |