Выполнение операторов SQL
Метод ExecuteReader класса SqlCommand возвращает экземпляр класса DataReader. Данные возвращаются, если в качестве команды задан запрос на выборку. Этот же метод можно использовать для обновления, вставки или удаления данных. Метод SQLCommand::ExecuteReader использует хранимую процедуру sp_executesql. Некоторые команды, использующие операторы SET (оператор Установить), могут работать неправильно. Другие драйверы могут иметь иные ограничения на использование метода ExecuteReader.
Обычно для команд, при выполнении которых данные не возвращаются, используется метод SqlCommand::ExecuteNonQuery. Пример NonQuery демонстрирует работу этого метода. Кроме того, соединение с SQL Server осуществляется в нем с помощью источника данных OleDb (OLE для баз данных).
String *cmd = "update Customers set ContactName = // Строка *cmd = "обновить Клиентов, установить ContactName = Too' where ContactName = 'Maria Anders'"; // Too', где ContactName = 'Мария Андерс"; try { conn = new OleDbConnection(ConnString); conn › 0pen(); // Открыть command = new OleDbCommand(cmd, conn); int NumberRows = command › ExecuteNonQuery(); // команда Console::WriteLine( "Number Rows: {0}", NumberRows.ToString()); }
Количество измененных строк, которое должно быть равным 1, показано в окне, предназначенном для консольного вывода. Если запустить программу еще раз, она не сможет найти необходимую ей запись, так как та была изменена при первом запуске программы (нет больше в базе данных Марии Андерс (Maria Anders)!), и выведет значение 0. Для приведения базы данных в исходное состояние необходимо запустить макрос SQL, как это описано в файле readme.txt для этой главы. На рис. 9.4 показан результат изменения первой строки. Значение поля ContactName изменено с Maria Anders на Foo.
При выполнении вставки, обновления и удаления данных возвращается количество строк, которых коснулись изменения. Для всех остальных операторов SQL Server возвращает значение -1 (при использовании родного источника данных или OLEDB (OLE для баз данных)). Другие драйверы доступа могут возвращать 0 или -1.
Для получения одного значения (например, результата вычислений) используйте метод ExecuteScalar. При работе с источниками данных, способными генерировать данные XML, более эффективным будет использовать метод SqlCommand::ExecuteXmlReader, a не получать данные в объект DataSet (Набор данных), а затем преобразовывать их в ХМL.
Рис. 9.4. Таблица Customers (Клиенты) после внесения в нее изменений Сравните первую строку таблицы с ее первоначальным видом на рис. 9.3.