Разбор операторов T-SQL - PullRequest
       28

Разбор операторов T-SQL

1 голос
/ 12 ноября 2010

Я делаю компонент редактора / исполнителя сценариев SQL для своего приложения, очень похожий по своей природе на SQL Server Management Studio или старый Query Analyzer. Я использую C #, .NET Framework 3.5 SP1. Моя проблема в том, что я хотел бы, чтобы компонент анализировал SQL, чтобы определить, должен ли он использовать SqlCommand.ExecuteNonQuery (), SqlCommand.ExecuteScalar () или SqlDataAdapter.Fill (dataTable) для запуска сценария. Цель состоит в том, чтобы позволить пользователю выполнять не-запросы, но также возвращать наборы результатов для просмотра, как это делает SSMS / Query Analyzer, но также скрывать от них подробности реализации ADO.NET.

Обычно я по умолчанию использую SqlDataAdapter.Fill (dataTable) и всегда возвращаю DataTable для просмотра пользователем. Это все равно будет запускать не-запросы, как это делает ExecuteNonQuery, но у него есть накладные расходы на использование более медленного класса SqlDataAdapter для запуска вещей. Это не оптимально во многих ситуациях, не связанных с запросом.

Подход, который я выбрал, состоит в том, чтобы позволить пользователю выбрать тип результата, либо «Таблица» (который будет запускать SqlDataAdapter.Fill (...), «Значение» (который будет запускать ExecuteScalar), либо «Нет» '(который запустит ExecuteNonQuery). Но я не хочу, чтобы они были раскрыты в деталях реализации ADO.NET. Я хочу, чтобы они просто набирали SQL-скрипт в текстовом поле, нажимали кнопку "Выполнить", и программа запускалась сценария и вернуть набор результатов в сетку данных, если она есть.

Итак ... мне нужно, чтобы компонент мог анализировать SQL перед его выполнением, чтобы определить, будет ли набор результатов при запуске сценария или нет.

Ответы [ 2 ]

6 голосов
/ 12 ноября 2010

Вы не анализируете текст, поскольку у вас нет информации, необходимой клиенту, чтобы определить, будут ли запросы возвращать результат.Примите запросы типа execute usp_anonymousProcedure 1,2;, вы можете сказать, возвращает ли он результат или нет?Очевидно нет.Таким образом, вы отправляете запрос на сервер и просите его просто вернуть метаданные о результате :

SET FMTONLY ON;

Возвращает клиенту только метаданные.Может использоваться для проверки формата ответа без фактического выполнения запроса.

Вы включаете это, запускаете запрос на сервере, и тогда вы узнаете форму результата, возвращаемогозапрос.

1 голос
/ 29 января 2011

Почему бы просто не выполнить SQL с помощью ExecuteReader?

IDataReader будет содержать ноль или более наборов результатов.

Вы можете перебирать наборы результатов и загружать каждый из них в DataTable, используяDataTable.Load (IDataReader) - или просто используйте члены IDataReader / IDataRecord для получения имен столбцов и данных.

Я не вижу, какое преимущество вы получаете, зная форму набора (ов) результатов взаранее, и я почти уверен, что существующие исполнители сценариев, такие как Query Analyzer, этого не делают.

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