Проверка запроса с использованием c # - PullRequest
16 голосов
/ 09 июня 2011

Я ищу валидатор запроса в c #, который позволяет мне анализировать текст SQL из текстового поля и проверять, правильно ли он перед отправкой на выполнение.(Запросы MS SQL или DB2).

Ответы [ 4 ]

27 голосов
/ 09 июня 2011

Если вы хотите проверить синтаксис SQL без использования базы данных, класс TSql100Parser подойдет для этой ситуации.

Отказ от ответственности, код заимствован из этого поста здесь Код для проверки SQL-сценариев

Довольно простой в использовании, хотя. Если он возвращает ноль, то при его анализе ошибок не было.

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;
        }
}
7 голосов
/ 09 июня 2011

Установите ваш запрос в sql с помощью этой подсказки:

set PARSEONLY  on

Он просто проверяет ваш запрос и возвращает, как это:

set PARSEONLY  on
select * from tablea

Возвращает без исключения.

В то время как

set PARSEONLY  on
select * f rom tablea

возвращает

Msg 102, Level 15, State 1, Line 2
Incorrect syntax near 'f'.
1 голос
/ 10 марта 2014

Если вы хотите проверить / проанализировать только оператор SELECT, независимо от того, насколько «тяжелым» является этот оператор выбора, я обнаружил, что лучший и самый быстрый способ проверки оператора выбора заключается в следующем: - в вашем коде создайте 2 оператора выбора (строки), такие как:

1) Ваш правильный оператор выбора: SELECT * FROM HUGE_TABLE JOIN MULTIPLE_TABLES WHERE <<Condition>> 2) Создайте аналогичный оператор выбора, например SELECT TOP 1 * FROM HUGE_TABLE JOIN MULTIPLE_TABLES WHERE <<Condition>> - Анализировать / проверять только второй, независимо от того, сколько у вас там соединений, он будет анализироваться в миллисекундах, например:

SqlCommand sqlParse = new SqlCommand(ParseSelectStatement, sqlConn); 

try 
{
sqlConn.Open();
sqlParse.ExecuteNonQuery()
}

Надеюсь, это поможет! Ура!

0 голосов
/ 09 июня 2011

Я думаю, это то, что вы ищете.http://www.codeproject.com/KB/database/sqlvalidator.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...