Я делаю компонент редактора / исполнителя сценариев 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 перед его выполнением, чтобы определить, будет ли набор результатов при запуске сценария или нет.