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

 

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

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

Сеппа Д. Microsoft ADO.NET — М.: Русская Редакция, 2003. — 640 c.
ISBN 5-7502-0223-2
Скачать (прямая ссылка): mcrsftado2003.pdf
Предыдущая << 1 .. 125 126 127 128 129 130 < 131 > 132 133 134 135 136 137 .. 260 >> Следующая

Для тестирования параметризованных запросов я выполнил простой запрос к таблице Customers и поместил его результаты в объект DataTable. Затем я стал просматривать эти результаты и единожды для каждого клиента выполнял параметризованный запрос к таблице Orders. Далее я просматривал совмещенные
результаты запросов к таблице Orders и единожды для каждого запроса выполнял параметризованный запрос к таблице Order Details. При этом мне пришлось выполнять отдельные запросы для каждого клиента и каждого заказа. Структура параметризованных запросов проста, однако их многократное выполнение для каждого клиента и заказа оказалось неэффективным, и производительность
Это не удар по параметризованным запросам. Просто они — не самое лучшее
решение для выборки данных из больших иерархий с фильтрацией, похожих на
те, которые я использовал в своем примере,
Даже если вы работать с доступными только для чтения данными
из нескольких таблиц, разделите соединяющие запросы на отдельные которые будут возвращать данные из отдельных таблиц.
Примечание Я также запускал две дополнительные процедуры, одна из которых применяла вложенные запросы Щ, а другая объединяла отдельные запросы в пакет. Производительность ii.iw.Ki иных запросов Щ оказалась сравнима с производительностью процедуры, использовавшей отдельные запросы. Объединив отдельные запросы пакет, я смог повысить производительность примерно на 8%.
Вопрос. Я выбираю данные из хранимых процедур, но, к сожалению, не могу использовать в них соединяющие запросы. Есть ли простой способ ..р^здс-лнп,-результаты на отдельные объекты
ГЛАВА 7 Работа с реляционными данными 287
Ответ. Осуществляющего это метода в модели ADO.NET нет — по крайней мере, пока. Однако можно написать код, разделяющий результаты посредством объекта DataReader и метода Find набора Rows объекта DataTable (подробнее об этом методе — в следующей главе).
Следующий фрагмент кода выполняет соединяющий запрос к таблицам Customers и Order Dc!;;:!*. Затем он просматривает возвращаемые в объект DalaRz&'iev
данные и добавляет новые записи в отдельные объекты DataTable Customers и
Orders.
Visual Basic NET
ds.Tables*"Customers").BeginLoadData() ds.Tables("Orders").BeginLoadData*) Dim strConn, strSOL As String
StrConn = "Provider=SQLOLEDB; Data Source=(local)\NetSDK;" & _ "Initial Catalog=Northwind;Trusted_Cormection=Yes;" Dim cn As New OleDbConnection(strConn) cn.Open*)
strSQL = "SELECT C.CustomerlD, C.CompanyNaine, C.ContactName, " i _ "C.Phone, O.OrderlD, O.EmployeelD, O.OrderDate " &_
"FROM Customers C, Orders 0 " & _
"WHERE C.CustomerlD = O.CustomerlD AND C.Country = 'Canada1" Dim cmd As New 01eDbCommand(strSQL, cn) Dim rdr As OleDbDataReader = cmd.ExecuteReader Dim objNewCustomer, objNewOrder As Object)) Do While rdr. Read
If ds.Tables("Custorners").Rows.Find(rdr.GetString(0)) Is Nothing Then objNewCustouer = New Object*) {nJr.GetStrlng(O).
rdr.GetString(l), rdr.GetString(2), rdr.GetString(3)} ds.Tables*"Customers").LoadDataRow*objNewCustoraer, True) End If
objNewOrder = New Object{) {rdr. Getlnt32(4),
rdr.GetString(O),
rdr.GetInt32(5),
rdr.GetDateTime*6)) ds.Tables*"Orders").LoadDataRow*objNewOrder, True)
Loop
irdr. Close*) cn.Close*)
ds.Tables*"Customers").EndLoadData*) ds.Tables*"Orders").EndLoadData*)
Visual C# .NET
ds.Tables["Customs rs"].BeginLoadData*); ds.Tables!"Orders"].BeginLoadData*);
string strConn, strSQL;
StrConn = "Provider=SQLOLEDB;Data Saurce=*local)\\Net$DK; " + "Initial Catalog=Northwind;Trusted_Connection=Yes;";
288 Частым Автономная работа с данными: объект DataSet модели ADO.NET
OleDbConnection сп
new 01eDbConnection(strConn};
cn.Open();
strSQL = "SELECT C.CustomerlD, C.CompanyName, C. Con tact Name, " + "C.Phone, O.OrderlD, 0.EmployeelD, O.OrderDate " + "FROM Customers C, Orders 0 +
"WHERE C.CustomerlD = O.CustomerlD AND C.Country = -Canada'"; OlBDbCommand cmd = new OLeDbCommand(strSOL, en); OleDbDataReader rdr = cmd. ExecuteReader(); objectf] objNewCustomer, obj NewOrde r; while (rdr.ReadO) (
if (ds.Tables["Customers"].Rows,Find{rdr,GetString{0)) == null)
<
objNewCustomer = newobject[] Udr.GetString(O),
ds,Tables["Customers"].LoadDataRow(objNewCustomer, true);
}
objNewOrder = new object[] {rdr.GetInt32(4),
ds.Tables["Orders"].LoadDataRow(ob]NewOrder, true);
[I
rdr.CloseO; cn,Close();
ds.Tables["Customs re"].EndLoadDataf); ds.Tablest "Orders"']. EndLoadData();
rdr.GetString{1), ¦rdr.GetString(2), rdr.GetString<3)>;
rdr.GetString(O),
rdr.GetInt32{5),
rdr.GetDateTime(6)};
ГЛАВА
8
Сортировка, поиск, фильтрация
главе 5 рассказывалось, как с помощью объекта DataAdapter выбрать результаты запроса в объект DataSet, В главе б, посвященной объекту DataSet и его вложенным объектам, вы научились просматривать результаты таких запросов, перемещаясь по объектам DataRow объекта DataTable.
Но как найти тесную запись в объекте DataTable по значению или группе значений? Как применить фильтр, чтобы отображались только записи, удовлетворяющие заданному критерию? Как управлять порядком сортировки записей, к которым вы собираетесь обращаться или выводить пользователю?
Предыдущая << 1 .. 125 126 127 128 129 130 < 131 > 132 133 134 135 136 137 .. 260 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100