我在Order.aspx.vb
创建了一个包含项目的ArrayList。我将这些传递给我的bllOrder
,然后将其传递给我的dalOrder
。
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
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
?
非常感谢所有帮助!
答案 0 :(得分:2)
而不是传递单个Order项,传递一个Order of Orders,然后在你的方法中循环它。使它像Public Function InsertOrder(objOrder As List(Of Order)) As Boolean
那样,然后使用objOrder作为Orders列表来循环它。
将以下代码放在代码后的foreach循环中并传递当前项值;
cmd.Parameters.AddWithValue("OrderCustID", objOrder.OrderCustID)
cmd.Parameters.AddWithValue("OrderProdID", objorder.OrderProdID)
result = cmd.ExecuteNonQuery()
答案 1 :(得分:1)
将项目数组转换为xml字符串,您可以使用openxml在存储过程中执行批量插入。 http://msdn.microsoft.com/en-us/library/ms191268.aspx还引用sql server 2005 http://weblogs.asp.net/jgalloway/archive/2007/02/16/passing-lists-to-sql-server-2005-with-xml-parameters.aspx
的旧帖子答案 2 :(得分:1)
**编辑以说明额外信息**
您可以调整代码隐藏中现有的“for each”逻辑,以构建一个arraylist或List<>产品 - 此数组/列表应该是Order对象的属性。通过BAL将Order对象传递给DAL。
然后遍历DAL代码(InsertOrder)中的Order对象中的产品
您应该将其包装在一个事务中,以确保如果一行无法插入,则可以完全回滚订单。
对于大量产品的订单,我会选择@ Aravind的答案。
答案 3 :(得分:1)
我使用SqlClient.SqlBulkCopy。这实际上是批量插入的.Net版本,要使用它,您需要将要插入的对象插入DataTable或创建一个类来读取实现IDDataReader的数据。如果您插入1,000行,那么您应该看到显着的性能增加和更整洁的代码。
http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy.aspx
答案 4 :(得分:0)
答案 5 :(得分:0)
我建议你使用逗号分隔值。不要在DAL层中发送数组列表,而是函数应该从表示层返回格式化的逗号分隔值,并将此值发送到DAL,最后分离存储过程中的值。
替代 您可以在XML中格式化值并将其发送到存储过程。
为了执行它,您的参数应该是varchar类型。