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

 

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

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

Сеппа Д. Microsoft ADO.NET — М.: Русская Редакция, 2003. — 640 c.
ISBN 5-7502-0223-2
Скачать (прямая ссылка): mcrsftado2003.pdf
Предыдущая << 1 .. 60 61 62 63 64 65 < 66 > 67 68 69 70 71 72 .. 260 >> Следующая

126
Visual Basic .MET
Dim st i Conn, sirSQ!. As String
strConn = "Provider=SQLOLEDB;Data Source=(local)\NetSDK; " &
"Initial Catalog=Northwind;Trusted_Connectlon=Yes;' Dim en As New OleDbConnection(strConn) cn.0pen()
strSQL = "SELECT CuatoanerlD, CorcpanyNams FROM Customers &
"WHERE CustomerlD LIKE ?" Dim cmd As New 01eDbCommand(strSQL cn) omd.Parameters.Add("^CustomerlD", "AK") Dim id г As OleDbDataReader = cud.ExecuteReader Do While rdr.Read
Console.WriteLine(rdr<0))
Loop
rdr. Close() on.CloseO
Visual C# .NET
string strConn, strSQL;
strConn = "Provider=SQLOLEDB; Data Souroe=(local)\\NetSDK;" +
"Initial Catalog=Northwind;Trusted_Conneotion=Yes;"; DleDbConnection cn = new 31*0fcCom«ctlor>(stгСорп}; cn,0pen();
StrSQL = "SELECT CustomerlD FROM Customers WHERE CustomerlD LIKE OleDbCommand cmd = new 01eDbCommand(strSQL, on); cmd.Parameters.AddC"©CustomerlD", "AS"); OleDbDataReader rdr = cittf. ExecuteReader<); while (rdr.ReadO)
Console. WriteLine(rdr[0]); "
rdr.Close(); cn.CloseO;
Этот запрос вернет нужные записи, но не раеечптыи-.ште, что свойствам !)ЬТ\;к: Oli'Dblypi или Size объекта будут заданы ожидаемые вами зпа к-
ния. OleDbParameter определяет подходящие значения этих свойств, когда вы выполняете запрос, и задает их лишь внутренне. Воспользовавшись утилитой SQL Profiler в SQL Server 2000, вы увидите, что объект Command выполнил такой запрос:
exec sp_executesql
N'SELECT CustomerlD FROM Customers WHERE CustomerlD LIKE ЭРГ, М'вР1 nvarchar(2)\ N'AST
Объект OleDbParameter предположил, что параметр окажется строкой переменного размера в кодировке Unicode с длиной, равной 2 символам. Я успешно выполнял параметризованные запросы к БД SQL Server, Oracle и Access с использованием строковых и числовых параметров (например, с типом данных агп\->1 у). никаких проблем при этом не возникало.
Меня сильно впечатлило, что эта возможность работает насколько хорошо. Тем не менее мой опыт работы в службе технической поддержки по-прежнему за-
126
Часть II Подключаемся: использование поставщика данных МЕТ
тгачлче' меня чувствовать себя неуютно, когда приходится иметь дело с подобными функциями. Не могу сказать, что я не уверен в корректности их работы, но мне все же хочется, чтобы программисты явно задавали свойства, определяющие тип данных и размер.
Вопрос. Почему нельзя вызвать хранимую процедуру и успешно получить значение возвращаемого параметра? С параметрами вывода проблем нет, а вот возвращаемые параметры вызывают затруднение,
Ответ. Во-первых, если вы создали объект DakiRcadtii с помощью объекта Com-прежде чем просмотреть значение возвращаемого параметра, убедитесь, что вы закрыли DataReader (подробнее о закрытии этого объекта — в первом вопросе данного раздела).
Однажды мой коллега рассказал, что пытался получить значение возвращаемого параметра своей хранимой процедуры. Он знал, что сначала необходимо закрыть объект DataReader, но проблема была не в этом. Хранимая процедура выглядела примерно так:
CREATE PROCEDURE iSetReturnParametor (jSCuscomeMD ncnar(5)) AS SELECT OrderlD, CustomerlO, EmployeelD, OrderDate FROM Orders WHERE CustomerlO = SCustomerlD RETURN @@R0WC0UNT
А код на Visual Basic .NET — так:
Dun cfiid As New OleDbCoiiimandf "GetHeturnPaгameter", on)
and. CommandType = GonwiandType. StorsdProcedura
cmd.Parameters,ftddC'^CustomerlD", OleDbType.WChar. 5}
cmd. Paraneters("$CustomerID"). Value = "AI ПО"
cmd. Parameters.Add('>RetVal", OleDbType.Integer)
cind. Parameters("§HeiVal"). Direction = ParaweterDirection. ReturnValue
Для краткости скажу, что он расположил параметры в неверном порядке. Такую простую ошибку может допустить каждый. То, что он назначил свойству значение затруднило выявление и именно
по этой причине я не слишком люблю свойство CommandType моделей ADO.NET и ADO. Команда разработчиков ADO.NET старалась сделать как лучше, реализовав данную возможность, но, полагаю, программисты получат гораздо больше, научившись создавать реальные запросы.
Корректное значение свойства в данном случае таково:
{? = CALL GetReturnParameter(?)>
Синтаксис аналогичен вызову функции на Visual Basic или С*. Вам нужен параметр, в котором хранилось бы значение, возвращенное хранимой процедурой.
Вот полный код для вызова хранимой процедуры: Visual Basic .NET
Dim strConn, strSOLAs String
strConn = "Provider=SQLOLEDB;Data Source=(local)\NetSDK;" &
"Initial Catalog=Northwind;Trusted_Connection=Yes;"
ГЛАВА 4 Выполнение запросов к базе данных
127
Dim As New OJeDtiCoiinection-strCcnri)
cn.0pen()
strSQL = = CALL GetReturnParameter(?)r
Dim cmd As New 01eDbCofnmand< strSQL, cn)
cmd. Parameters.Add("@RetVal", OleDbType. Integer)
cmd . ParametersC'tiRetV'a]."). Direction = PararceterD.irer.tion.fleturnVelue cmd. Parameters. AddOCustomerlD", OleDbType.WChar, 5) cmd. Parameters("§CustomerlD',>. Value = "ALFKI" Dim rdr As OleDbDataReader = omd.ExecuteHeader Do While rdr, Read
Console.WriteLine("OrderID = " & rdr(O).ToStrlng)
Loop
rdr.CioseO
Console.WriteLire<cind.Paraiseters<0). Value.ToString & orders")
Предыдущая << 1 .. 60 61 62 63 64 65 < 66 > 67 68 69 70 71 72 .. 260 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100