Использование arraylist для вставки элементов в БД - PullRequest
0 голосов
/ 23 мая 2011

Я создал ArrayList с элементами в моем Order.aspx.vb. Я передаю их моему bllOrder, который передает его моему dalOrder.

Order.aspx.vb

Dim item As RepeaterItem
For Each item In rptProductList.Items
   objOrder.OrderCustID = Session("CustID")
   objOrder.OrderProdID = DirectCast(item.FindControl("ddlProducts"), DropDownList).SelectedValue
   bllOrder.InsertOrder(objOrder)
Next item

dalOrder

Function InsertOrder(ByVal objOrder As Order) As Boolean
    Dim Result as New Boolean

    myconn.open()

    Dim SQL As String = "INSERT INTO order(OrderCustID, OrderProdID) VALUES (?,?)"
    Dim cmd As New OdbcCommand(SQL, myconn)

    cmd.Parameters.AddWithValue("OrderCustID", objOrder.OrderCustID)
    cmd.Parameters.AddWithValue("OrderProdID", objorder.OrderProdID)

    result = cmd.ExecuteNonQuery()

    myconn.close()

    Return Result
End Function

Это хорошо для одного предмета, но как мне сделать это для моего ArrayList?

Вся помощь очень ценится!

Ответы [ 6 ]

2 голосов
/ 23 мая 2011

вместо передачи отдельного элемента Order, передайте List of Orders, и они зацикливаются внутри вашего метода. сделайте так: Public Function InsertOrder(objOrder As List(Of Order)) As Boolean, а затем используйте objOrder в качестве списка ордеров, чтобы просмотреть его.

поместите следующий код в цикл foreach, следующий за кодом, и передайте значения текущего элемента;

cmd.Parameters.AddWithValue("OrderCustID", objOrder.OrderCustID)
    cmd.Parameters.AddWithValue("OrderProdID", objorder.OrderProdID)

    result = cmd.ExecuteNonQuery()
1 голос
/ 23 мая 2011

Я бы использовал SqlClient.SqlBulkCopy. Это, по сути, версия .Net Bulk Insert, для ее использования вам нужно либо иметь свои объекты, которые вы хотите вставить в DataTable, либо создать класс для чтения ваших данных, который реализует IDDataReader. Если вы вставляете 1000 строк, вы должны увидеть резкое увеличение производительности и намного более аккуратный код.

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy.aspx

1 голос
/ 23 мая 2011

** отредактировано для учета дополнительной информации **

Вы можете адаптировать существующую логику "для каждого" в вашем коде для создания массива или списка <> продуктов - этот массив / список должен бытьсобственность вашего объекта заказа.Передайте объект Order в DAL через BAL, как в настоящее время.

Затем выполните итерации по продуктам в объекте Order в коде DAL (InsertOrder) и либо

  • вставьте каждую строку отдельно.в цикле
  • или динамически создавать оператор вставки для ордера.

Вы должны заключить его в транзакцию, чтобы обеспечить бесперебойный откат ордера, если не удалось вставить одну строку.

Для заказов с большим количеством продуктов я бы пошел на @ Аравинд ответ.

1 голос
/ 23 мая 2011

Преобразуйте массив элементов в строку xml, и вы можете выполнить массовую вставку в хранимую процедуру, используя openxml.http://msdn.microsoft.com/en-us/library/ms191268.aspx также см. Более старый пост для сервера sql 2005 http://weblogs.asp.net/jgalloway/archive/2007/02/16/passing-lists-to-sql-server-2005-with-xml-parameters.aspx

0 голосов
/ 23 мая 2011

Я предлагаю вам использовать значения, разделенные запятыми. Не отправляйте список массивов на вашем DAL-уровне, вместо этого функция должна возвращать отформатированное запятую с разделенным слоем Presentation Layer, отправлять это значение в DAL и, наконец, отделять значения в вашей хранимой процедуре.

Альтернативный Вы можете отформатировать свои значения в XML и отправить их в хранимую процедуру.

Для этого ваш параметр должен иметь тип varchar.

0 голосов
/ 23 мая 2011

Пожалуйста, перейдите по следующей ссылке

Как вставить переменную datetime c # в SQL Server

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...