【问题标题】:Using arraylist to insert items into DB使用 arraylist 将项目插入数据库
【发布时间】:2011-05-23 10:03:43
【问题描述】:

我创建了一个 ArrayList,其中包含我的 Order.aspx.vb 中的项目。我将这些传递给我的bllOrder,后者将其传递给我的dalOrder

订单.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 该怎么做呢?

非常感谢所有帮助!

【问题讨论】:

    标签: asp.net vb.net arraylist


    【解决方案1】:

    不是传递单个订单项,而是传递一个订单列表,然后它们在您的方法中循环它。让它像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()
    

    【讨论】:

    • 那么我要传递我的 ArrayList 吗?
    • 如果我只是将我的 INSERT 查询粘贴在 For Each 项目循环中怎么办?也有效不是吗?还是更密集?
    • 我不确定这里的性能,但在您完成插入之前保持连接打开。听起来更好。
    • 所以创建一个函数来打开和关闭连接?
    • 不,把你的 foreach 循环放在 myconn.open() 和 myconn.close() 之间
    【解决方案2】:

    将项目数组转换为 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

    【讨论】:

    • 最多可容纳 10 件商品,目前我无法将 SP 与我当前的提供商一起使用(f*** 提供商)...
    • 那么我猜批量插入不是你的选择,你可能需要循环尽可能多的项目来存储它们。
    • 确实,你知道tugberk想怎么做吗?
    • 他说了同样的话。只需为数组列表中的项目数创建一个循环并将插入代码放入循环中。
    • 所以item 是我的数组列表吗?以及如何将其传递给我的dalOrder
    【解决方案3】:

    ** 编辑以考虑额外信息 **

    您可以调整代码隐藏中现有的“for each”逻辑来构建产品的数组列表或列表 - 此数组/列表应该是您的 Order 对象的属性。像当前一样通过您的 BAL 将 Order 对象传递给 DAL。

    然后在 DAL 代码 (InsertOrder) 中遍历 Order 对象中的产品,然后

    • 将每一行单独插入 循环
    • 或为订单动态构建插入语句 .

    你应该把它包装在一个事务中,以确保如果一行插入失败,订单会完全回滚。

    对于有大量产品的订单,我会选择@Aravind 的答案。

    【讨论】:

    • 是的,它适用于少量,最多 10 个。
    【解决方案4】:

    我会使用 SqlClient.SqlBulkCopy。这实际上是 Bulk Insert 的 .Net 版本,要使用它,您需要将要插入的对象放入 DataTable 中,或者创建一个类来读取实现 IDDataReader 的数据。如果您插入 1,000 行,那么您应该会看到性能的显着提升和更整洁的代码。

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

    【讨论】:

    • 我只会插入大约 10 行,顶部。
    • 在这种情况下,可能不值得额外的编码工作,使用 tugberk 解决方案。 Bulk Copy 是一种更简洁的解决方案,因为它使用了 Transaction 等。
    • 麻烦我真的不知道我需要如何更改我的代码才能使用 TugBerks 方法。
    【解决方案5】:

    【讨论】:

    • 问题是我不知道如何读出我的 Arraylist。
    【解决方案6】:

    我建议您使用逗号分隔值。不要在 DAL 层中发送数组列表,而是一个函数应该从表示层返回一个格式化的逗号分隔值,并将该值发送到 DAL,最后在存储过程中分隔值。

    另类 您可以将值格式化为 XML 并将其发送到存储过程。

    为了执行它,您的参数应该是 varchar 类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-09
      • 1970-01-01
      • 1970-01-01
      • 2017-12-11
      • 1970-01-01
      相关资源
      最近更新 更多