Ankush Soni Ответов: 1

Как проверить SQL-запрос перед его выполнением с помощью C#


Привет
У меня есть текстовое поле, в котором пользователь вводит свой SQL-запрос. Однако мне нужно сделать программу, которая проверяет запрос перед его выполнением в базе данных.
например:
Предположим, пользователь вводит, выбирает A1, A2,A3 из XYZ
Поэтому теперь, прежде чем выполнить запрос, мне нужно проверить,существуют ли A1, A2 и A3 в таблице XYZ или нет. Если нет, то пользователю должно быть показано сообщение об ошибке.

Я не могу придумать, как действовать дальше.
Итак, может ли кто-нибудь дать базовую идею с образцом фрагмента кода о том, как действовать дальше? Спасибо

Что я уже пробовал:

До сих пор я ничего не пробовал. Я не получаю никакой логики, чтобы продолжать дальше

Tomas Takac

Почему бы вам просто не выполнить запрос и не показать сообщение об ошибке, полученное с сервера базы данных? Почему вы должны проверять это сами?

0x01AA

Идея, может быть, не очень эффективная и нуждающаяся в проработке:
SELECT * FROM XYZ WHERE 1=0
Вышеизложенное вернет вам пустой результирующий набор, но я думаю, что будет способ определить, по крайней мере, имена полей таблицы с ним....(?)

Foothill

Я не проверял это, чтобы убедиться, что это работает, но вы могли бы дать ему один раз.
http://www.codeproject.com/Articles/410081/Parse-Transact-SQL-to-Check-Syntax

1 Ответов

Рейтинг:
0

OriginalGriff

В значительной степени вы не можете этого сделать - особенно когда речь идет об именах таблиц и столбцов без фактического выполнения запроса к SQL server. Это возможно, но было бы огромной инвестицией в усилия, чтобы попытаться проверить каждую деталь, прежде чем запускать запрос.
Лучшим способом, вероятно, было бы "тестировать" запрос на сервере в рамках транзакции и всегда откатывать транзакцию назад. Таким образом, если бы были какие-то проблемы (но часть из них имела эффект), это все равно не вызвало бы никаких изменений в БД.
Использовать try-catch-finally блокируйте и откатывайте транзакцию в finally и это должно дать вам указание" успех " / "неудача".
Класс SqlTransaction (System. Data.SqlClient)[^]


0x01AA

Не является Prepare (в try/catch) также достаточно, чтобы проверить SQL?

OriginalGriff

К сожалению, нет-SqlCommand.Prepare не создает исключения для "плохого имени таблицы" и так далее после VS2010.
https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.prepare(v=против 110). aspx
Что делает его практически бесполезным... :смеяться:
Если вы попробуете это сделать:
пробовать
{
using (SqlConnection con = new SqlConnection(strConnect))
{
против.Открыть();
DataTable dt = новый DataTable();
используя (команда sqlcommand cmd и = новая команда sqlcommand("выберите столбец из того, TableThatDoesntExist по названию АСК", кон))
{
УМК.Подготовить();
using (SqlDataAdapter da = new SqlDataAdapter (cmd))
{
да.Заполнить(ДТ);
}
}
}
}
поймать (исключение бывший)
{
Приставка.WriteLine(напр. сообщение);
}

Вы получите исключение в DataAdapter.Наполните, но не сразу.

0x01AA

Спасибо тебе за это, а-5.

OriginalGriff

Пожалуйста!