Основы ADO .NET
Отступление о запросах
- Запросы, которые не возвращают записей (action query или КОМАНДНЫЕ ЗАПРОСЫ). Различаются:
- запросы обновления или Data Manupulation Language queries. Предназначаются для изменения содержимого базы данных
UPDATE Customers Set CompanyName = 'NewHappyName' WHERE CustomerID = '007' INSERT INTO Customers (CustomerID, CompanyName) VALUES ('007', 'NewHappyCustomer') DELETE FROM Customers WHERE CustomerID = '007'
-
запросы изменения или Data Definition Language queries. Предназначены для изменения структуры базы данных
CREATE TABLE myTable ( Field1 int NOT NULL Field2 varchar() )
- запросы обновления или Data Manupulation Language queries. Предназначаются для изменения содержимого базы данных
- Запросы, возвращающие значения из базы данных. Ниже представлены три примера запросов.
Возвращает значения полей для всех записей, представленных в таблице Customers.
SELECT CustomerID, CompanyName, ContactName, Phone FROM Customers
Возвращает значения полей для записей, представленных в таблице Customers, у которых значение поля Phone равно строке ' 333–2233 '.
SELECT CustomerID, CompanyName, ContactName FROM Customers WHERE Phone = '222–3322'
Параметризованный запрос. Множество возвращаемых значений зависит от значения параметра, стандартно обозначаемого маркером ' ?' и замещаемого непосредственно при выполнении запроса:
SELECT CompanyName, ContactName, Phone FROM Customers WHERE CustomerID = ?
Command
Команда – объект, представляющий один из двух классов: либо класс OleDbCommand, либо класс SqlCommand. Основное назначение объекта "Команда" – выполнение различных действий над Базой Данных (ИСТОЧНИКЕ ДАННЫХ) при использовании ОТКРЫТОГО СОЕДИНЕНИЯ. Сами же действия обычно кодируются оператором SQL или хранимой процедурой. Закодированная информация фиксируется с использованием объектов – представителей класса Parameter, специально разработанных для "записи" кодируемой в команде информации.
То есть после установления соединения с БД для изменения состояния этой базы может быть создан, соответствующим образом настроен и применен объект – представитель класса Command.
Объект "Команда" – стартовый стол для запуска непосредственно из приложения команд управления БД, которыми и осуществляется непосредственное управление БД. Команда в приложении обеспечивает взаимодействие приложения с базой данных, позволяя при этом:
- сохранять параметры команд, которые используются для управления БД;
- выполнять специфические команды БД INSERT, UPDATE, DELETE, которые не возвращают значений;
- выполнять команды, возвращающие единственное значение;
- выполнять команды специального языка определения баз данных DataBase Definition Language (DDL), например CREATE TABLE ;
- работать с объектом DataAdapter, возвращающим объект DataSet ;
- работать с объектом DataReader ;
- для класса SqlCommand – работать с потоком XML;
- создавать результирующие наборы, построенные на основе нескольких таблиц или в результате исполнения нескольких операторов.
Объект Command обеспечивает управление источником данных, которое заключается:
- в выполнении DML (Data Manipulation Language) запросов – запросов, не возвращающих данные ( INSERT, UPDATE, DELETE );
- в выполнении DDL (Data Definition Language) запросов – запросов, которые изменяют структуру Базы Данных ( CREATE );
- в выполнении запросов, возвращающих данные через объект DataReader (SELECT).
Объект представлен двумя классами – SqlCommand и OleDb Command. Позволяет исполнять команды на БД и при этом использует установленное соединение. Исполняемые команды могут быть представлены:
- хранимыми процедурами;
- командами SQL;
- операторами, возвращающими целые таблицы.
Объект – представитель класса Command поддерживает два варианта (варианты методов определяются базовым классом) методов:
- ExecuteNonQuery – обеспечивает выполнение команд, не возвращающих данные, например INSERT, UPDATE, DELETE ;
- ExecuteScalar – исполняет запросы к БД, возвращающие единственное значение;
- ExecuteReader – возвращает результирующий набор через объект DataReader.
Доступ к данным в ADO .NET с помощью Data Provider 'а осуществляется следующим образом:
- Объект – представитель класса Connection устанавливает соединение между БД и приложением.
- Это соединение становится доступным объектам Command и DataAdapter.
- При этом объект Command позволяет исполнять команды непосредственно над БД.
- Если исполняемая команда возвращает несколько значений, Command открывает доступ к ним через объект DataReader.
- Результаты выполнения команды обрабатываются либо напрямую, с использованием кода приложения, либо через объект DataSet, который заполняется при помощи объекта DataAdapter.
- Для обновления БД применяют также объекты Command и DataAdapter.
Итак, в любом случае, независимо от выбранного поставщика данных, при работе с данными в ADO .NET используем:
- Connection Object – для установки соединения с базой данных;
- Dataset Object – для представления данных на стороне приложения;
- Command Object – для изменения состояния базы.
Способы создания объекта Command:
- с использованием конструкторов и с последующей настройкой объекта (указание строки запроса и объекта Connection );
- вызов метода CreateCommand объекта Connection.
private void readButton_Click(object sender, System.EventArgs e) { int i = 0; this.timer.Stop(); rd.rolls.Clear(); nPoints = 0; string strSQL = "SELECT nRolls,Victim,X,Y,oldX,OldY,Alpha,Red,Green,Blue From RollsTable"; oleDbConnection.Open(); OleDbCommand cmd = new OleDbCommand(strSQL,oleDbConnection); OleDbDataReader rdr = cmd.ExecuteReader(); while (rdr.Read()) { rd.AddRow( int.Parse((rdr["nRolls"]).ToString()), int.Parse((rdr["Victim"]).ToString()), float.Parse((rdr["X"]).ToString()), float.Parse((rdr["Y"]).ToString()), float.Parse((rdr["oldX"]).ToString()), float.Parse((rdr["oldY"]).ToString()), int.Parse((rdr["Alpha"]).ToString()), int.Parse((rdr["Red"]).ToString()), int.Parse((rdr["Green"]).ToString()), int.Parse((rdr["Blue"]).ToString()) ); i++; } rdr.Close(); oleDbConnection.Close(); rpDataGrid.DataSource = rd.rolls; nPoints = i; this.timer.Start(); }Листинг 18.10.