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

 

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

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

Сеппа Д. Microsoft ADO.NET — М.: Русская Редакция, 2003. — 640 c.
ISBN 5-7502-0223-2
Скачать (прямая ссылка): mcrsftado2003.pdf
Предыдущая << 1 .. 45 46 47 48 49 50 < 51 > 52 53 54 55 56 57 .. 260 >> Следующая

Предыдущие фрагменты кода, такси-......а-апсн- объект циклично
просматривали результаты запроса до тех пор, пока метод Read не возвращал False. Если вставить данный пакетный запрос в эти фрагменты, код обработает только результаты первого запроса пакета.
Объект DataReader предоставляет метод NextResult. позволяющий перейти к результатам следующего запроса, который возвращает записи. Этот метод аналогичен методу Read в том, что возвращает логическое значение, указывающее, есть ли еще результаты. Тем не менее в отличие от метода Read, предварительно вызывать метод NextResult не требуется.
Если метод Read возвращает False, наличие дополнительных результатов, ожидающих выборки, можно проверить средствами метода NextResult. Если и он вернет False, наборов результатов больше нет. Следующий фрагмент кода выбирает результаты пакетного запроса при помощи метода NextResult.
Visual Basic MET
cn.0pen()
Dim strSQL As String
strSQL = "SELECT CustomerlD, CompanyName FROM Customers;" & "SELECT OrderlD, CustomerlD FROM Orders;" & _ "SELECT OrderlD, ProductID FROM [Order Details]"
Dim cmd As New 01eDbCommand(strSQL, cn)
Dim rdr As OleDoDataReader = cmd.ExecuteReader()
Do
IDo While rdr.ReadO
Console.WriteLine(rdr(0) & " - " 4 rdr(1))
Loop
Console.WriteLine{) Loop While rdr.fciextfiesultO
Visual C# NET
on.Open(};
string StrSQL = "SELECT CustomerlD, CompanyName FROH Customers;" + "SELECT OrderlD, CustomerlD FROM Orders; " a "SEDECT OrderlD, ProductID FROM [Order Details]";
CleDbCoroaeno cmd = new 01eDoCuimiiand(sT.rS0L. cn);
OleDbDataReader rdr = cmd.ExecuteReaderQ ;
do
90
Часть И Подключаемся: использование поставщика данных NET
(
while (rdr.ReadO)
Console.WriteLine<rdr[0] + " - " + rdr[1]); Console.WriteLineQ; } while (rdr.«extneeultO);
Выполнение пакетов командных запросов
Пытаясь с помощью ADO и SQL Server получить набор результатов, генерируемых хранимой процедурой, разработчики часто сталкиваются с одной проблемой. Если вы при помощи OLD DB-поставщика SQL Server вызвали хранимую процедуру SQL Server, которая перед запросом, возвращающим записи, выполняет командный запрос, ваш объект Recordset помечается как закрытый и он не содержит результаты запроса, возвращающего записи.
Эта модель поведения обусловлена архитектурой. Закрытый объект Recordset соответствует командному запросу. Если тот и.-*-, он соответствует информационному сообщению row(s) ;Hk-crec!--. возвращаемому таким запросом. Для перехода к результатам следующего запроса следует вызвать метод Nsxi-tecords-s'i Кроме того, можно добавить в хранимую процедуру оператор SET NOCOUNT ON, подавляющий указанные сообщения; благодаря этому ADO сразу же переходит к результатам первого запроса, возвращающего записи.
Подобная модель поведения не является отличительной чертой только хранимых процедур. Похожая ситуация возникает и при выполнении пакетных запросов. Рассмотрим пакетный запрос, использующий ADO 2ли «классический» Visual Basic:
«Классический» Visual Basic
Dim сл As ADODB.Connection, rs As ADODB.Recordset
Dim strConn As String, strSQL As String Dim IntRecordsAffected As Integer
strConn = "Provlder=SQLOLEDB; Data Source=(local)\NetSDK;" & _ "Initial Catalog=Northwind;Trusted_Connection=Yes;" Set cn = New ADODB.Connection
en.Open strConn
strSQL = "INSERT INTO Customers .v.;" & _
"SELECT CustomerlD, CompanyName FROM Customers WHERE ...;"&_
"UPDATE Customers SET CompanyName = ... WHERE .. .;" & _ "SELECT CustomerlD, CompanyName FROM Customers WHERE . .."
Set rs = cn.Exsc-jts?strSQL, intRecordsAffected, adCmdText) Do Until rs Is Nothing
Dabug.Print "rs.State " & rs.State & vbTab &
"intRecordsAffected = " & intRecordsAffected
Set rs = rs.NextRecordset(intRecordsAffected)
Loop
ГЛАВА 4 Выполнение запросов к базе данных 91
Первоначально • '.'закрыт, и переменная inlRecuukLAjfecu содержит значение 1. Такие результаты соответствуют запросу INSERT, который не возвращает записей и изменяет одну запись БД. После того как мы вызовем метод NextRecordset, объект Recordset становится открытым и содержит результаты первого запроса SELECT. Поскольку запрос SELECT не изменяет каких-либо записей БД, переменная intRecordsAffected вернет -1. При повторном вызове нстол Next-Recordset вернет закрытый объект Recordset а значение переменной intRecordsAffected соответствует числу записей, затронутых запросом UPDATE. При следующем вызове метод NextRecordset возвращает результаты второго запроса SELECT и дает переменной intRecordsAffected значение -1. При последнем вызове NextRecordset возвращает объект Recordset, установленный в Nothing, сообщая, что наборов результатов, ожидающих обработки, больше нет.
ADO.NET обрабатывает этот же пакетный запрос иначе. Команда разработчиков ADO.NET посчитал;!, что данная ситуация — одна из главных причин прострации разработчиков при использовании ADO. Они упростили процесс работы с пакетными запросами так, что теперь объект DataReader автоматически перемещает вас к результатам первого запроса, возвращающего записи. Полагаю, большинство разработчиков обрадуются такому изменению модели поведения. К сожалению, при этом пришлось поступиться частью функциональности.
Предыдущая << 1 .. 45 46 47 48 49 50 < 51 > 52 53 54 55 56 57 .. 260 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100