» Главная
eXcode.ru » Статьи » .NET
» Новости
» Опросы
» Файлы
» Журнал



Пользователей: 0
Гостей: 9





Добавление строк




В дочернюю таблицу строки можно добавлять, только если они соответствуют допустимым (уже существующим) строкам родительской таблицы. Строки, не соответствующие допустимым строкам родительской таблицы, добавлять нельзя.

Новую строку нужно вставить сначала в родительскую таблицу; только после этого в дочернюю таблицу можно добавлять соответствующие строки. По той же причине в процессе синхронизации изменений с базой данных метод Update объекта DataAdapter, соответствующего родительской таблице, следует вызывать первым.

Автоматическое формирование команды Insert

Проблема с автоматически генерируемыми командами вставки в том, что объекту DataSet не возвращается первичный ключ Id для столбца Identity. Для решения этой проблемы мы используем хранимую процедуру, которая возвращает первичный ключ для родительской строки. Тогда появляется возможность применять автоматически формируемые команды вставки для дочерних строк. В следующем примере мы создаем два объекта DataAdapter, заполняющие две таблицы в одном объекте DataSet. Мы задаем отношение между этими двумя таблицами и вставляем в них новые строки. Метод Update объекта DataAdapter, соответствующего родительской таблице (в нашем случае — Order), вызывается первым. Затем вызывается метод Update объекта DataAdapter, соответствующего дочерней таблице (в нашем случае — OrderDetails).

Dim sqlConn As SQLConnection
Dim sqlDAOrder As SqlDataAdapter
Dim sqlDADetail As SqlDataAdapter
Dim hierDS As DataSet
Dim sqlCmdBldrDetail As SqlCommandBuilder
Dim orderRow As DataRow
Dim detailRow As DataRow
Try
' Создать новый объект SQLConnection
sqlConn = New SqlConnection(Common.getConnectionString)
' Создать новый объект SQLDataAdapter для таблицы Order
sqlDAOrder = New SqlDataAdapter()
' Создать новый объект SqlDataAdapter для таблицы OrderDetails
sqlDADetail = New SqlDataAdapter()
' Создать новый DataSet
hierDS = New DataSet()
' Создать новый объект SQLCommandBuilder для автоматической генерации
' выражений Update
sqlCmdBldrDetail = New SqlCommandBuilder(sqlDADetail)
With sqlDAOrder
' Добавить объект SelectCommand
.SelectCommand = New SqlCommand()
' Указать команду Select
With .SelectCommand
.CommandType = CommandType.Text
.CommandText = "Exec GetOrderHeader @OrderId=-1"
.Connection = sqlConn
End With
' Добавить объект InsertCommand
.InsertCommand = New SqlCommand()
' Указать команду Insert
With .InsertCommand
.CommandType = CommandType.StoredProcedure
.CommandText = "InsertOrderHeader"
.Connection = sqlConn
' Определить параметры параметризованного запроса Insert
.Parameters.Add _
(New SqlParameter("@CustomerId", SqlDbType.Int))
' Задать свойство Direction
.Parameters("@CustomerId").Direction = ParameterDirection.Input
' Задать свойство SourceColumn
.Parameters("@CustomerId").SourceColumn = "CustomerId"
.Parameters.Add _
(New SqlParameter("@OrderDate", SqlDbType.DateTime))
' Задать свойство Direction
.Parameters("@OrderDate").Direction = ParameterDirection.Input
' Задать свойство SourceColumn
.Parameters("@OrderDate").SourceColumn = "OrderDate"
<>…

.Parameters.Add _
(New SqlParameter("@OrderId", SqlDbType.Int))
' Задать свойство Direction
.Parameters("@OrderId").Direction = ParameterDirection.Output
' Задать свойство SourceColumn
.Parameters("@OrderId").SourceColumn = "OrderId"
End With
' Заполнить таблицу Orders данными
.Fill(hierDS, "Orders")
End With
With sqlDADetail
' Добавить объект SelectCommand
.SelectCommand = New SqlCommand()
' Указать команду Select
With .SelectCommand
.CommandType = CommandType.Text
.CommandText = "Exec GetOrderDetails @OrderId=-1"
.Connection = sqlConn
End With
' Заполнить таблицу Details данными
.Fill(hierDS, "Details")
End With
' Установить связь между таблицами
hierDS.Relations.Add("Order_Detail", _
hierDS.Tables("Orders").Columns("OrderId"), _
hierDS.Tables("Details").Columns("OrderId"))
' Создать новую строку для таблицы Orders
orderRow = hierDS.Tables("Orders").NewRow()
' Указать значения каждого столбца в таблице Orders
orderRow.Item("CustomerId") = 1
orderRow.Item("OrderStatus") = 400
orderRow.Item("OrderDate") = Now()

' Добавить строку к DataSet
hierDS.Tables("Orders").Rows.Add(orderRow)
' Синхронизировать изменения с источником данных
sqlDAOrder.Update(hierDS, "Orders")
' Создать новую строку для таблицы Details
detailRow = hierDS.Tables("Details").NewRow()
detailRow.Item("OrderId") = orderRow.Item("OrderId")
detailRow.Item("ItemId") = 13

' Добавить строку к DataSet
hierDS.Tables("Details").Rows.Add(detailRow)
' Синхронизировать изменения с источником данных
sqlDADetail.Update(hierDS, "Details")
Catch e As Exception
' Обработать исключение
Finally
' Выполнить очистку
End Try

Обратите внимание: если новые строки, добавленные к дочерней таблице, соответствуют новой строке, добавленной к родительской таблице, то для сохранения целостности данных сначала обновляется родительская таблица. Дочерняя строка всегда должна ссылаться на допустимую строку в родительской таблице.

Использование свойства InsertCommand

В этом примере заголовок заказа и его позиции передаются хранимой процедуре в виде XML, что позволяет выполнить транзакцию за одно обращение к базе данных.

Чтобы указать собственное выражение INSERT, выполняемое при вызове метода Update применительно к DataAdapter, следует задать свойство InsertCommand. Значением этого свойства может быть параметризированный запрос или хранимая процедура. Параметры InsertCommand определяются так же, как и параметры объекта Command. Управляемый провайдер SQL поддерживает именованные параметры.

Для каждого параметра нужно установить свойство SourceColumn. Оно сообщает объекту DataAdapter, в каком столбце таблицы содержится значение параметра.


Dim sqlConn As SqlConnection
Dim sqlDAOrder As SqlDataAdapter
Dim sqlDADetail As SqlDataAdapter
Dim hierDS As DataSet
Try
' Создать новое соединение
sqlConn = New SqlConnection(Common.getConnectionString)
' Создать новый объект SqlDataAdapter для таблицы Order
sqlDAOrder = New SqlDataAdapter()
' Создать новый объект SqlDataAdapter для таблицы OrderDetails
sqlDADetail = New SqlDataAdapter()
' Создать новый DataSet
hierDS = New DataSet()
With sqlDAOrder
' Добавить объект SelectCommand
.SelectCommand = New SqlCommand()
' Указать команду Select
With .SelectCommand
.CommandType = CommandType.Text
.CommandText = "Exec GetOrderHeader @OrderId=-1"
.Connection = sqlConn
End With
' Добавить объект InsertCommand
.InsertCommand = New SqlCommand()
' Указать команду Insert
With .InsertCommand
.CommandType = CommandType.StoredProcedure
.CommandText = "InsertOrder"
.Connection = sqlConn
' Задать параметры параметризованного выражения Insert
.Parameters.Add _
(New SqlParameter("@Order", SqlDbType.NVarChar, 4000))
' Установить свойство Direction
.Parameters("@Order").Direction = ParameterDirection.Input
.Parameters.Add _
(New SqlParameter("@OrderId", SqlDbType.Int))
' Установить свойство Direction
.Parameters("@OrderId").Direction = ParameterDirection.Output
' Установить свойство SourceColumn
.Parameters("@OrderId").SourceColumn = "OrderId"
End With
' Заполнить DataSet возвращенными данными
.Fill(hierDS, "Orders")
End With
With sqlDADetail
' Добавить объект SelectCommand
.SelectCommand = New SqlCommand()
' Указать команду Select для объекта sqlDADetail
With .SelectCommand
.CommandType = CommandType.Text
.CommandText = "Exec GetOrderDetails @OrderId=-1"
.Connection = sqlConn
End With
' Заполнить DataSet возвращенными данными
.Fill(hierDS, "Details")
End With
' Установить между двумя таблицами отношение через внешний ключ
hierDS.Relations.Add("Order_Detail", _
hierDS.Tables("Orders").Columns("OrderId"), _
hierDS.Tables("Details").Columns("OrderId"))
' Создать новую строку в таблице Orders
orderRow = hierDS.Tables("Orders").NewRow()
' Задать значение каждого столбца в таблице Orders
orderRow.Item("OrderId") = -1
orderRow.Item("CustomerId") = 1
orderRow.Item("OrderStatus") = 400

' Добавить строку к DataSet
hierDataSet.Tables("Orders").Rows.Add(orderRow)
' Создать новую строку в таблице Details
detailRow = hierDataSet.Tables("Details").NewRow()
detailRow.Item("OrderId") = orderRow.Item("OrderId")
detailRow.Item("ItemId") = 13

' Добавить строку к DataSet
hierDataSet.Tables("Details").Rows.Add(detailRow)
' Создать новую строку в таблице Details
detailRow = hierDataSet.Tables("Details").NewRow()
detailRow.Item("OrderId") = orderRow.Item("OrderId")
detailRow.Item("ItemId") = 12

' Добавить строку к DataSet
hierDataSet.Tables("Details").Rows.Add(detailRow)
sqlDAOrder.InsertCommand.Parameters("@Order").Value = _
hierDataSet.GetXml()
' Синхронизировать изменения с источником данных
sqlDAOrder.Update(hierDataSet, "Orders")
Catch E As Exception
' Обработать исключения
Finally
' Выполнить очистку
End Try

Источник: www.cyberguru.ru

К началу статьи





Добавил: Дата публикации: 2007-10-27 13:54:42
Рейтинг статьи:3.00 [Голосов 5]Кол-во просмотров: 6717

Комментарии читателей

Всего комментариев: 29

2016-02-03 05:24:14
SamuelEl
Наш вебресурс - это немалый каталог самых свежих онлайн игр для мальчиков, которые придутся по нраву геймерам всех возрастов. <a href=http://meboy.ru/tanki/>игры танки онлайн</a>. Для комфорта пользователей игры разделены на тематические категории, потому любой геймер найдет себе игру по вкусу, будь то подросток или взрослый игрок. На нашем сайте не требуется регистрация или какие-то дополнительные действия, все максимально просто и удобно – выбираете игру и сразу сможете играть.

Одни из очень популярных жанров игр, которые любят мальчики - это стрелялки и гонки. Кроме классических игр разнообразных категорий, на нашем сайте можно найти игры, которые создаются по мотивам любимых сказок или комиксов. <a href=http://meboy.ru/chelovek_pauk_na_spetszadanii.html>игры человек паук бесплатно</a>. В этих играх, кроме геймплея, вы сможете окунуться в мир любимых героев, вместе с ними вы сможете преодолеть трудности и убивать злодеев.

В мире наших онлайн игр вы имеете возможность делать что угодно: стрелять из различных типов оружия, сражаться с различными инопланетными армадами, одолевать полчища зомби, гонять на крутых тачках, играть в баскетбол и еще массу интересного. <a href=http://meboy.ru/draki/>игры драки</a>. Быстрей выбирай необходимую игру и ощути себя в другом мире – захватывающем и удивительном, сказочном и захватывающем! Мы ожидаем вас на нашем ресурсе онлайн игр для мальчиков!

2013-08-16 17:44:35
playcledill
Сделано уже возможность вид сайт о бизнес: переход


-----
http://1-trk.ru/ - http://1-trk.ru/. http://1-trk.ru/ - грузы

2013-08-16 17:18:08
spinyinorry
Хорошо вон предложения читать сайт и о досуг... буду


-----
http://biz-gid.ru/ - http://biz-gid.ru/. http://biz-gid.ru/my/control - добавить компанию

2013-08-16 15:41:06
Bopyintenty
Мы не возможность вид сайт о отдыхе- до связи


----
http://kip.ua/ - http://kip.ua/. http://kip.ua/russian/tm - товарный знаки

2013-08-16 14:35:39
Stetboriturce
Хорошо не позаимствувать смотреть портал о переферии... переход


-----
http://contact.com.ua/ - http://contact.com.ua/. http://contact.com.ua/php.htm - курсы веб программирования

2013-08-16 12:42:40
ClusCavaTeess
Хорошо вон откладывать вид портал о вечеринке... переход


----
http://obzorkreditov.ru/ - http://obzorkreditov.ru/. http://obzorkreditov.ru/ - экспресс-кредиты за 30 минут

2013-08-16 10:27:37
Weemgorkcoeno
Сделано рода предложения поглядеть сайт о отдыхе: единое


-----
http://avtofopekc.ru/ - http://avtofopekc.ru/. http://avtofopekc.ru/ - форекс советники отзывы

2013-08-15 22:01:23
impairePiet
Сделано рода откладывать смотреть новость о вечеринке,


-----
http://ru-minecrafts.ru/ - http://ru-minecrafts.ru/. http://ru-minecrafts.ru/tekstury/ - текстуры на майнкрафт

2013-08-13 15:21:16
rapebrurvib
Хорошо вон обзавелся вид блог о вечеринке... здес


----
http://super-day.ru/ - http://super-day.ru/. http://super-day.ru/konkursy-i-igry-dlya-shkolnikov/ - Конкурсы для школьников

2013-08-13 10:42:39
Raretrittaply
Мы любые предложения посмотреть сайт про бизнес... тут


----
http://evro-garant.ru/ - http://evro-garant.ru/. http://evro-garant.ru/ - натяжные потолки медвежьегорск
Ваше имя: *
Текст записи: *
Имя:

Пароль:



Регистрация

Каким языком программирования вы чаще пользуйтесь?
C++
27% (108)
Delphi
47% (190)
PHP
8% (34)
Basic
3% (13)
Assembler
3% (11)
ASP
1% (6)
Perl
3% (11)
JAVA
3% (14)
Другой
4% (17)

Проголосовало: 404
Открылся благотворительный фонд сбора средств на новый Boening 747 для глобальной реконструкции здания Microsoft.
Рейтинг: 0/10 (0)
Посмотреть все анекдоты