Разбор строки SQL в c # - PullRequest
       18

Разбор строки SQL в c #

4 голосов
/ 16 сентября 2011

Мне нужно разобрать Command.CommandText.

Я не хочу выполнять запрос. Я только хочу увидеть, будет ли запрос успешным, если команда была выполнена.

Скажи, что у меня есть; "SELECT * FROM SomeTable WHERE (1=1)"

Эта строка будет успешной.

но

"SELECT * FROM SomeTable WHERE (1=1"

не удастся.

Теперь мой вопрос. Как бы я Parse эту строку c#?

Ответы [ 5 ]

7 голосов
/ 16 сентября 2011

Если вы просто хотите проверить синтаксис.Для этого вы можете использовать Microsoft.Data.Schema.ScriptDom .

using Microsoft.Data.Schema.ScriptDom;
using Microsoft.Data.Schema.ScriptDom.Sql;

.....

        string sql = "SELECT * FROM SomeTable WHERE (1=1";
        var p = new TSql100Parser(true);
        IList<ParseError> errors;

        p.Parse(new StringReader(sql), out errors);


        if (errors.Count == 0)
            Console.Write("No Errors");
        else
            foreach (ParseError parseError in errors)
                Console.Write(parseError.Message);
2 голосов
/ 01 ноября 2011

Как вы сказали: «Я не хочу выполнять запрос».

Microsoft.Data.Schema.ScriptDom - хороший выбор, если вам нужно только проверить синтаксис SQL Microsoft SQL Server.В противном случае вы можете использовать другой анализатор SQL, такой как Общий анализатор SQL (поддержка Oracle, SQL Server, DB2, MySQL, Teradata, PostgreSQL), который поможет вам выполнять автономную проверку синтаксиса SQL в вашей программе.

2 голосов
/ 16 сентября 2011

Я пробовал несколько библиотек, которые предназначены для анализа / манипулирования / генерации SQL в коде. Самым последним был ActiveQueryBuilder , но я знаю, что их много.

С AQB - вы сможете «проверить» SQL, но проблема, с которой, я думаю, вы столкнетесь, состоит в том, что он не на 100%. Ни один из них, которые я использовал, не обеспечивает идентичные результаты с реальной базой данных. Вы найдете некоторую определенную строку SQL, которая кажется допустимой для вашего анализатора, но недействительной для базы данных или наоборот. Например, в AQB вы не можете иметь подзапрос, не предоставив ему псевдоним, или парсер выдаст исключение - но Oracle с радостью примет и выполнит тот же SQL.

В зависимости от базы данных вы должны попросить БАЗУ ДАННЫХ проверить SQL, не запуская его. Я полагаю, что в SQL Server вы можете использовать оператор Prepare , в Oracle я считаю, что он называется План объяснения .

.

Это единственный способ найти последовательные результаты. Конечно, если ваши запросы должны быть простыми или если вам не требуется 100% точность, это может быть больше работы.

2 голосов
/ 16 сентября 2011

Исходя из того, что вы используете SqlCommand, я предполагаю, что вы хотите проверить правильность утверждения в отношении Sql Server. Как отмечали люди, с оператором Prepare можно согласиться. На стороне c # вы можете только проверить правильность синтаксиса и ничего больше (это не значит, что запрос пройдет). Подготовительный оператор проверит разрешение имен, привязку и многое другое, но он будет состоять из обратной передачи на сервер. Более того, вы должны знать о его ограничениях (например, временных объектах). Подробнее об операторе TSQL Prepare см. здесь .

1 голос
/ 16 сентября 2011

Это можно сделать, проанализировав ваш запрос с помощью формальной грамматики, но это может быть перегрузкой для вас и полностью зависит от вашего сценария использования.

Для анализа любых формальных языков я советую использовать библиотеку Irony , которая очень популярна как в производственных, так и в индивидуальных проектах и ​​уже имеет встроенную грамматику SQL, так что это всего лишь вопрос этот инициализатор. Он даст вам информацию об ошибках и их типе, но для более простого использования предложите Ира.

...