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

 

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

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

Сеппа Д. Microsoft ADO.NET — М.: Русская Редакция, 2003. — 640 c.
ISBN 5-7502-0223-2
Скачать (прямая ссылка): mcrsftado2003.pdf
Предыдущая << 1 .. 233 234 235 236 237 238 < 239 > 240 241 242 243 244 245 .. 260 >> Следующая

При создании системы приема заказов через Интернет я бы стал хранить содержимое корзин в БД, но мне подумалось, что полезно показать здесь и решение на основе объекта ViewState.
Вопросы, которые стоит задавать почаще
Вопрос. Как, прежде чем я свяжу объект Baiaficadev с элементом уираилсиия. вернул ли запрос данные?
Ответ. Это — один из распространенных вопросов Web-разработчиков, не имеющий, к простого решения. Если с помощью метода DataReader определить, вернул ли запрос записи, и затем связать с объектом DataReader элементы первая запись набора результатов запроса в них не отображается. Если вы просто связываете объект DataReader с элементом управления DataGrid,
с помощью свойства Count набора Items DataGrid удастся определить, сколько
записей вернул запрос. Тем не менее иногда нужно узнать число возвращенных
записей до того, как связать элементы управления с объектом DataReader.
Предположим, вы средствами следующего запроса выбираете заказы конкретного клиента:
SELECT OrderTD, CustcinerlD, Orderuate FROM Orders WHERE CustomerlD = ?
При работе с БД, поддерживающей пакетные запросы, можно па-
кетный запрос, который сначала вернет число записей, удовлетворяющий критерию П'Ч!Л'.1 а затем вернет сами эти записи, например:
556
Часть IV Создание эффективных приложений с использованием ADO.NET
SELECT cOUNT(OrderlD) FROM Orders WHERE CustomerlD = ?; SELECT OrderlD, CustomerlD, OrderDate FROM Orders WHERE CustomerlD = ?
Visual Basic .NET
Dim strConn, strSQL As String
strConn = "Provider=SQLOLEDB;Data Source=(Local)\NetSDK;" & _ "Initial Catalog=Northwind;Trusted_Connection=Yes;" Dim As New OieDuConnection(strConn)
strSQL = "SELECT COUNT(OrderlD) FROM Orders WHERE CustomerlD = ?;'
"SELECT OrderlD, CustomerlD, OrderDate FROM Orders " & _
"WHERE CustomerlD = ?" Dim cmd As New 01eDbCommand(strSQL, cn) cmd.Parameters.Add("$CustomerID", OleDbType.WChar, 5) Cffld.Parameters.Add("giCustomerID2", OleDbType.WChar, 5) 0iiid.Paraineters("^Cu3to:nerI0") Value = "Ai tzi" cmd.Parameters(,,iCustomerID2,,).Value = "ALFKI" cn.Open()
Dim rdr As OleDbDataReader = cwd.ExeouteReederO
rdr.ReadO
If rdr(O) > 0 then
Запрос верну/1 записи
rdr.NextResultO
gridOrders DataSocrce = rdr
gridQrders.DataBind()
Else
'Запрос не вернул записей End If rdr. Close() cn.Close()
Visual C# NET
strinj strConn, strSQL;
strConn = "Provider=SQL0LED8;Data Source=(local)\\NetSDK;" +
"Initial Catalog=Northwind;Trusted_Connection=Yes;": OleDbConnection on = new OleQhConnection(strCcnn); StrSQL = "SELECT COUHT{OrderlD) FROM Orders WHERE CustomerlD = ?;" +
"SELECT OrderlD, CustomerlD, OrderDate FROM Orders " +
"WHERE CustomerlD « ?"; OleDbCommand cmd = new DleDbCommand(strSQL, cn); cmd.Parameters.Add("@CustomerID", OleDbType.WChar, 5); cmd. Parameters, AddC"§CustomerlD2", OleDbType.WChar, 5); cmd. Parametersr«>Cust?»erID"j. Value - "ALFKI"; cmd. Parameters["®CustomerID2,,;i. Value = "ALFKI"; cn.OpenO;
OleDbDataReader rdr = cmd.ExecuteReaderO; rdr. Read(};
if (Convert.Tolnt_32(rar[0]) > 0) {
ГЛАВА Создание эффективных Web-приложений
557
//Запрос вернул записи
;rdr.NextResult<);
gridC-rders. DataSouгее = roV,
gridOrders.DataBindO;
}
else
<
//Запрос не вернул записей
}
irdr.CloseC); en.CloseQ;
При работе с не поддерживающей пакетные запросы, следует воспользоваться таким же способом, но выполнять не пакет, а отдельные запросы,
Вопрос. Как использовать в Web-приложении оптимистическое управление кировками при передаче изменений в БД?
Ответ. На самом деле ответ зависит от требований вашего приложения. В приложении ShoppingCart при передаче обновлений в БД используются только поля первичного ключа. Эта логика работает, потому что приложение поддерживает отдельную корзину для каждого сеанса. Таким образом, возможность редактирования содержимого одной корзины несколькими пользователями исключена,
Для более жесткого контроля параллелизма можно непосредственно перед тем, как пользователь начнет решкшрошпь .. ее содержимое. Тогда
у вас будут оригинальные значения полей записи, которыми можно воспользоваться в разделе WHERE запроса UPDATE и исключить возможность обновления записи, если ее уже успел изменить другой пользователь.
Более изящное решение — добавить в БД поле с типом данных iimestam'- и использовать в разделе WHERE значения первичного ключа и этого поля. При этом уменьшается объем данных, >эашр\гекнх в объекте \ 'ieu Sti tie Session или в скрытых полях,
Вопрос. У меня есть объект Dntus.-L включающий два объекта Dc-лоГаЬЬ?, между которыми определено отношение на основе объекта Как вывести в
связанном элементе управления DataGrid только дочерние записи конкретной
родительской записи?
Ответ. У объекта каш!-;,.,.; имеется метод GetCUldRoa's.. возвращающий массив объектов который содержит только дочерние записи. Тем не менее свя-
зать элементы управления типа DataGrid с массивом объектов нельзя.
Можно создать объект DataView, инициализировать его, заполнив содержимым дочернего объекта DataTable, и затем задать свойству RowFM№объекта DataView такое значение, при котором через DataView окажутся доступными только дочерние
Предыдущая << 1 .. 233 234 235 236 237 238 < 239 > 240 241 242 243 244 245 .. 260 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100