Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Вебмастеру -> Сеппа Д. -> "Microsoft ADO.NET" -> 164

Microsoft ADO.NET - Сеппа Д.

Сеппа Д. Microsoft ADO.NET — М.: Русская Редакция, 2003. — 640 c.
ISBN 5-7502-0223-2
Скачать (прямая ссылка): mcrsftado2003.pdf
Предыдущая << 1 .. 158 159 160 161 162 163 < 164 > 165 166 167 168 169 170 .. 260 >> Следующая

"ORDER BY ProductID"; OleDbDataAdapter da = new 01eDbDataAdapter(strSQL, strConn); OlfiDbCmmnandBui'lder cb = new QleDbCoitirriandBuilder(da); Console. WriteLine(cb. Getlnse rtCommand(). ComraandText);
Как видно, текст запроса довольно сильно походит на запросы, создававшиеся нами в предыдущих разделах главы для передачи новых записей:
INSERT INTO Order Details( OrderlD , ProductID , Quantity , UnitPrice ) VA1UES (?,?,?,?)
Как объект генерирует логику обновления
Логика, на основе которой CommandBuilder генерирует запросы UPDATE, INSERT и DELETE, не представляет собой ничего сложного. Как и ядро курсоров ADO. CommandBuilder обращается к БД за именами базовой таблицы и столбцов, а также за сведениями о ключевых столбцах набора результатов запроса. Объект CommandBuilder сгенерирует логику I'HMitiiciciimi. если выполняются все следующие условия:
• запрос.:оъ?.'Глуя-~ данные только из одной таблицы;
• на таблице определен первичный ключ;
• первичный ключ есть в результатах вашего запроса.
уже говорилось, первичный ключ i ар;.....труст. что CommandBuilder
вит не более одной записи. Почему объект CommandBuilder налагает ограничение на число таблиц, упомянутых в результатах запроса? Подробнее об этом — в следующих разделах главы.
выбирает метаданные, необходимые для генерации логики обновления, с использованием свойства SelectCommand объекта DataAdapter, На самом деле об этом уже говорилось вкратце в главе Метод iixeaiieReadei объекта Command позволяет получить эти метаданные вместе с результатами запроса, как показано ниже:
Visual Basic .NET
Din strConn, strSQL As String
StrConn = "Provider=SQLOLEDB;Data Source=(local)\NetSDK; " & "Initial Catalog=Northwind;Trusted_Connection=Yes;"
strSQL = "SELECT OrderlD, ProductID, Quantity, DnitPrice " & _
"FROM [Order Details] WHERE OrderlD = 10503 "" & _
"ORDER BY ProductID" Dim cn As New OleDbConnection(strConn) Din cmd As New 01eDbCorainand(strSQL, cn) on.0pen()
Dim As OleDbDataReader
rdr = cmd.ExecuteReader(CommandBehavlor.ScnemaOnly Or _
CommandBehavior.Keylnfo) Dim tbl As DataTanie = rdr.GetScbemaTable rdr. CloseO
376
Часть III Автономная работа с данными: объект DataSet модели ado.net
cn.Close{)
Dim row As Dataplex Dim col As DataColumn For Each row In tbl.Rows
For Each col In tbl.Columns
Console.WriteLine(col.ColumnName & "i " & row(col).ToString)
Next col
Console.WriteLine<) Kext row
Visual C# .NET string strConn, strSOL;
strConr = "Pi-oviclsr=SOLOLF.DB; Data Souree-(local)\\NetSDK; " + "Initial Catalog=Northwind;Trusted_Connection=Yes;
strSQL = "SELECT OrderlD, ProductID, Quantity, UnitPrice " +
"FROM [Order Details] WHERE OrderlD = 10503 +
"ORDER BY ProductID"; OleDbConnection cn = new OleDbConnection(strConn); GleDbCommarid c»d = new 01eDbCommand<strSOL, cn); cn. Open();
OleDbDataReader rdr;
rdr = crnd. i:xecuteReader(CommandBehavioi . УпЬйтаОШу |
CommandBehavior,Keylnfo); DataTable tbl = rdr.OetSchemaTableO; rdr.Close();
cn.CloseO;
foreacl (DataRow in tbl.Rows)
{
foreach (DataColumn col in tbl.Columns)
Console.WriteLine(col.ColumnName + ": " + row[col].ToString());
Console. WrltelineQ;
3itnyci!in этот код, вы увидите все данные, которыми объект C-ov"m»:mSii%i-Ш-должен обладать о каждом столбце, чтобы сгенерировать логику обновления. Имя столбца? Имена базовой таблицы и базового столбца для данного столбца? Является ли столбец частью первичного ключа базовой таблицы? Содержит ли столбец большой объем текстовых или двоичных данных? И т.д., и т.п.
Преимущества и недостатки использования объекта CommandBuilder
Сравнив фрагмент кода, сгенерированный объектом CommandBuilder, и код, на основе которого мы создавали собственную логику обновления, вы выявите два основных преимущества использования объекта CommandBuilder. Во-первых, требуется меньше кода. Во-вторых, с помощью CommandBuilder удается создавать
ГЛАВА 10 Передача обновлений в базу данных 377
логику обновления, имея даже поверхностное представление о SQL-синтаксисе запросов UPDATE, DELETE и INSERT.
Кроме того, объект CommandBuilder попежн, если у вас возникли проблемы с генерацией собственной логики обновления. Если CommandBuilder успешно сгенерирует необходимую логику, просмотрите значение свойства Command l\rxt созданных им объектов Command или значения свойств созданных им объектов Parameter.
Объект CommandBuilder также весьма полезен в приложениях, которым требуется поддержка обновления данных и в которых вы не хотите просматривать структуру период разработки.
Как и ядро курсоров ADO, объект CommandBuilder автоматически генерирует для вас логику обновления в период выполнения. Таким образом, он подвержен тем же проблемам и ограничениям, что и ядро курсоров ADO.
Объект CommandBuilder не предоставляет максимальной производительности периода выполнения. Вы можете написать и добавить в код собственную логику обновления за время, меньшее, чем объекту CommandBuilder потребуется, чтобы выбрать и обработать необходимые для создания аналогичного кода метаданные. Кроме того, CommandBuilder не позволяет управлять генерацией логики. Нельзя указать нужный способ оптимистического управления параллелизмом. Нельзя передавать обновления средствами хранимых процедур.
Предыдущая << 1 .. 158 159 160 161 162 163 < 164 > 165 166 167 168 169 170 .. 260 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100