Проверка запроса с использованием С#
Я ищу валидатор запросов в С#, который позволяет мне анализировать текст SQL из текстового поля и проверять его правильность или нет, прежде чем отправлять его на исполнение. (Запросы MS SQL или DB2).
Ответы
Ответ 1
Если вы хотите проверить синтаксис SQL без использования базы данных, класс TSql100Parser
будет полезен для этой ситуации.
Отказ от ответственности, код, заимствованный из этого сообщения здесь Код для проверки SQL-скриптов
Довольно просто использовать. Если он возвращает значение null, то при его синтаксическом анализе ошибок не было.
using Microsoft.Data.Schema.ScriptDom;
using Microsoft.Data.Schema.ScriptDom.Sql;
public class SqlParser
{
public List<string> Parse(string sql)
{
TSql100Parser parser = new TSql100Parser(false);
IScriptFragment fragment;
IList<ParseError> errors;
fragment = parser.Parse(new StringReader(sql), out errors);
if (errors != null && errors.Count > 0)
{
List<string> errorList = new List<string>();
foreach (var error in errors)
{
errorList.Add(error.Message);
}
return errorList;
}
return null;
}
}
Ответ 2
задайте свой запрос в sql с помощью этого подсказки
установить PARSEONLY on
он просто проверяет ваш запрос и возвращает
как это
установить PARSEONLY on
выберите * from tablea
не возвращает исключение
и
установить PARSEONLY on
выберите * f rom tablea
возвращает
Msg 102, уровень 15, состояние 1, строка 2
Неверный синтаксис рядом с 'f'.
Ответ 3
Если вы хотите проверить или проанализировать только инструкцию SELECT, независимо от того, насколько "сверхпрочный" этот оператор select, я обнаружил, что лучший и быстрый способ проверки утверждения select заключается в следующем:
- в вашем коде создайте 2 оператора выбора (строки), такие как:
1) Ваш действительный оператор выбора: SELECT * FROM HUGE_TABLE JOIN MULTIPLE_TABLES WHERE <<Condition>>
2) Создайте аналогичный оператор select, например SELECT TOP 1 * FROM HUGE_TABLE JOIN MULTIPLE_TABLES WHERE <<Condition>>
- Parse/Validate только второй, независимо от того, сколько соединений у вас там, он будет анализировать его в миллисекундах, например:
SqlCommand sqlParse = new SqlCommand(ParseSelectStatement, sqlConn);
try
{
sqlConn.Open();
sqlParse.ExecuteNonQuery()
}
Надеюсь, это поможет! Ура!
Ответ 4
Я думаю, что это то, что вы ищете. http://www.codeproject.com/KB/database/sqlvalidator.aspx