- •Глава 12. Обработка ошибок с помощью исключений
- •Глава 13. Перегрузка операторов и нестандартные преобразования
- •Глава 14. Делегаты и обработчики событий
- •Глава 15. Программирование многопоточности
- •Получение метаданных с помощью отражения
- •Глава 17. Взаимодействие с неуправляемым кодом
- •Глава 18. Работа со сборками
- •Чтение полей разных типов
- •Выполнение sql-команд
- •Настройки
- •Страницы
- •Примеры
- •Клиентские приложения
- •Влияние Microsoft
- •Влияние vb.Net
- •Разработка gui
- •Разработка веб-приложений
- •Влияние платформы на самосознание программистов
- •Тигры рвутся вперёд
- •Благодарности
- •Введение
- •Предыстория
- •Использование кода
- •Устанавливаем любимое соединение
- •Обзор команд
- •Не забывайте закрыть, когда вы закончили!
- •Когда хорошие соединения становятся плохими
- •Свободные концы
- •Введение
- •Использование кода
- •Пример вывода
- •Интересующие моменты
- •Не много теории...
- •Прозрачность (Transparency)
- •Пользовательские редакторы стадии проектирования
- •Расширение функциональности контрола Shape
- •Пример - Демо Приложение
- •Возможные улучшения
- •Заключение
Обзор команд
Команды SQL, вероятно, наиболее сложная часть использования базы данных SQL, но среда .NET предоставляет обертки, которые чудесно все делают, избавляя от большей части работы.
SqlCommand
Есть идеи, для чего используется SqlCommand? Если вы предположили, что он используется для команд SQL, то вы совершенно правы. SqlCommand требует как минимум двух вещей для функционирования. Строка команды и соединение. Для начала рассмотрим требование соединения. Существует два пути указания соединения, оба проиллюстрированы ниже:
SqlCommand myCommand = new SqlCommand("Command String", myConnection);
// - или -
myCommand.Connection = myConnection;
Строка команды также может быть указана двумя способами через свойство SqlCommand.CommandText. Теперь давайте посмотрим на наш первый SqlCommand. Чтобы оставить пример простым, это будет простая команда INSERT.
SqlCommand myCommand= new SqlCommand("INSERT INTO table (Column1, Column2) " +
"Values ('string', 1)", myConnection);
// - или -
myCommand.CommandText = "INSERT INTO table (Column1, Column2) " +
"Values ('string', 1)";
Теперь рассмотрим значения. table - это просто таблица в базе данных. Column1 и Column2 - всего лишь названия колонок. В секции значений я показал, как добавлять типы string и int. Значение строки помещается в одинарные кавычки, а целое, как вы видите, передается как есть. Последний шаг - исполнение команды с помощью:
myCommand.ExecuteNonQuery()
SqlDataReader
Вставка данных - это хорошо, но получение их назад так же важно. Вот теперь на сцену выходит SqlDataReader. "Считыватель данных" - это не все, что вам понадобится; кроме него нужен еще и SqlCommand. Следующий код демонстрирует, как настроить и выполнить простой reader:
try
{
SqlDataReader myReader = null;
SqlCommand myCommand = new SqlCommand("select * from table",
myConnection);
myReader = myCommand.ExecuteReader();
while(myReader.Read())
{
Console.WriteLine(myReader["Column1"].ToString());
Console.WriteLine(myReader["Column2"].ToString());
}
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
Как вы видите, SqlDataReader не получает доступ к базе данных, он просто сохраняет данные и предоставляет простой интерфейс использования данных. SqlCommand довольно прост, table - это таблица, из которой вы читаете данные. Column1 и Column2 - колонки в этой таблице. Так как существует большая вероятность того, что вы будете читать более одной строки, требуется цикл while для получения всех записей. И, как всегда, вы хотите использовать try и catch, чтобы не прерывалось выполнение.
SqlParameter
Существует маленькая проблема при использовании SqlCommand продемонстрированным мной способом - он оставляет большую дыру в безопасности. Например, путем использования ранее продемонстрированного подхода, ваша строка команды получается примерно такой, если вы получаете данные от пользователя:
SqlCommand myCommand = new SqlCommand(
"SELECT * FROM table WHERE Column = " + input.Text, myConnection);
Все красиво и прекрасно, если пользователь вводит данные в корректном виде, однако, что случится, если пользователь введет value1, DROP table? В лучшем случае сгенерируется исключение (я не ставлю цель проверить, что делает этот пример,- он просто демонстрирует подход), в худшем - вы можете поцеловать вашу таблицу на прощание. Вы можете обработать весь ввод пользователя и вырезать все, что вызывает проблемы, или использовать SqlParameter. Класс SqlParameter довольно большой, я только покажу вам основы использования параметров. По существу, вам нужны три вещи, чтобы создать параметр. Это имя, тип данных и их размер. (обратите внимание, что некоторые типы данных, нужные вам, не требуют указания размера, как Text).
SqlParameter myParam = new SqlParameter("@Param1", SqlDbType.VarChar, 11);
myParam.Value = "Garden Hose";
SqlParameter myParam2 = new SqlParameter("@Param2", SqlDbType.Int, 4);
myParam2.Value = 42;
SqlParameter myParam3 = new SqlParameter("@Param3", SqlDbType.Text);
myParam.Value = "Обратите внимание, что я не
указал размер. " +
"Если я сделаю это, текст будет обрезан.";
Существует соглашение по именованию (оно может быть обязательным, я не уверен), называть параметры начиная с символа @. Далее, как вы будете использовать параметр? Это будет довольно просто, как показывает следующий код.
SqlCommand myCommand = new SqlCommand(
"SELECT * FROM table WHERE Column = @Param2", myConnection);
myCommand.Parameters.Add(myParam2);
Это остановит мошенников от попыток внедриться в вашу строку команды. Это не все, для чего нужны параметры, если вы хотите узнать больше - хорошее место начать отсюда[^].
