问题描述
|
我在
Order.aspx.vb
中创建了一个包含项的ArrayList。我将它们传递给我的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
做呢?
非常感谢所有帮助!
解决方法
而不是传递单个Order项,而是传递一个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()
,将项目数组转换为xml字符串,然后可以使用openxml在存储过程中进行批量插入。 http://msdn.microsoft.com/zh-cn/library/ms191268.aspx还引用了sql server 2005的旧帖子http://weblogs.asp.net/jgalloway/archive/2007/02/16/passing-列出到sql-server-2005-with-xml-parameters.aspx
,**编辑以提供更多信息**
您可以改编代码中现有的“针对每个”逻辑,以构建产品的数组列表或List <>-此数组/列表应为Order对象的属性。目前,通过您的BAL将Order对象传递给DAL。
然后遍历DAL代码(InsertOrder)中Order对象中的产品,或者
将每一行分别插入到
环
或动态为订单构建一个插入语句
。
您应该将其包装在一个事务中,以确保在没有插入一行的情况下竞争地回滚该订单。
对于大量产品的订单,我会寻求@Aravind的回答。
,我将使用SqlClient.SqlBulkCopy。这实际上是批量插入的.Net版本,要使用它,您需要将要插入的对象放入DataTable中,或创建一个类来读取实现IDDataReader的数据。如果您插入1,000行,那么您应该会看到性能显着提高并且代码更加整洁。
http://msdn.microsoft.com/zh-CN/library/system.data.sqlclient.sqlbulkcopy.aspx
,请通过以下链接
如何在SQL Server中插入C#日期时间var
,我建议您使用逗号分隔的值。不要在DAL层中发送数组列表,相反,函数应从表示层返回格式化的逗号分隔值,然后将此值发送给DAL,最后在存储过程中分隔这些值。
另类
您可以使用XML格式化值并将其发送到存储过程。
为了执行此操作,您的参数应为varchar类型。