【问题标题】:ASP.NET/VB.NET problem solving help!ASP.NET/VB.NET问题解决求助!
【发布时间】:2011-02-03 07:33:03
【问题描述】:

有一个问题需要帮助。基本上,我将开发一个表单(更大的网络应用程序的一部分),列出大量客户以及业务联系人、技术联系人 1 和技术联系人 2。

这个想法是快速数据输入。因此,一个表单会在下拉列表中显示每个客户及其联系人,我们可以更改每个表单,然后单击保存按钮进行批量保存。

数据库如下所示:

tblClient

客户 ID

客户名称

业务联系

技术1

技术2

我的想法是使用转发器来格式化数据,如下所示:

客户

业务联系

技术1

技术2

客户端2

业务联系

技术1

技术2

我坚持的是如何进行大规模更新?我可以为 Repeater1 中的每个项目执行类似操作,然后执行更新 SQL 语句吗? -- 琼斯

【问题讨论】:

    标签: asp.net database vb.net controls repeater


    【解决方案1】:

    如果您使用 VS 中的 GUI 工具使用 DataAdaptor 构建数据源并将它们挂接到网格视图中,则所有代码都是为您编写的,除了在保存按钮上调用更新。

    【讨论】:

    • 这个保存按钮能一次性完成所有工作吗?我之前使用过 gridview 更新按钮,但我需要添加一些下拉菜单。网格视图可以支持下拉列表吗?
    • gridview 可以通过一些工作来支持下拉菜单。如果您将gridview 绑定到数据源对象中,该对象又会连接到数据适配器中,那么Save 只需要调用DataAdaptor 上的更新方法。
    • 这被证明是个小问题。显然 vs sqldatasources 不支持 SQL 2008 :( 所以我必须在后面的代码中查询它们并数据绑定 gridview 和下拉列表。这能工作吗?
    • 另外,当我单击编辑链接时,我收到此错误消息: GridView 'GridView1' 触发了未处理的事件 RowEditing。
    【解决方案2】:

    手动方法是将数据格式化为 XML 块并将其传递给存储过程,然后您可以在其中创建一个 UPDATE 语句,该语句连接到 XML 以一次性执行更新。

    您要创建的 XML 类似于:

    <ClientData>
        <Client ClientID="1" BusinessContact="..." Tech1="..." Tech2="..." />
        <Client ClientID="2" ... />
        ...
    </ClientData>
    

    通过使用 XmlWriter 并循环遍历您的转发器来收集数据来创建它的一种方法。在 VB.NET 中:

    Dim stream As New System.IO.MemoryStream
    Dim settings As New System.Xml.XmlWriterSettings
    
    settings.Encoding = Encoding.GetEncoding("iso-8859-1") 'This encoding handles special characters pasted in from MS Word
    
    Dim writer As System.Xml.XmlWriter = System.Xml.XmlWriter.Create(stream, settings)
    
    With writer
        .WriteStartElement("ClientData")
        For Each item As RepeaterItem In myRepeater.Items
            .WriteStartElement("Client")
            .WriteAttributeString("ClientId", CType(item.FindControl("ClientIdHidden"), HtmlInputHidden).Value)
            .WriteAttributeString("BusinessContact", CType(item.FindControl("BusinessContact"), TextBox).Text)
            ...
            .WriteEndElement()
        Next
        .WriteEndElement()
        .Flush()
    End With
    
    Dim xmlString As String = writer.Settings.Encoding.GetString(stream.ToArray())
    

    然后创建一个带有参数的存储过程,您可以在其中传递 XML:

    CREATE PROCEDURE [dbo].[BulkUpdateClients]
    (
        @xmlInput AS text
    )
    AS
    
    DECLARE @xmlHandle int
    
    EXEC sp_xml_preparedocument @xmlHandle output, @xmlInput
    
    UPDATE c
    SET
        BusinessContact = x.BusinessContact,
        Tech1 = x.Tech1,
        Tech2 = x.Tech2
    FROM tblClient c
        JOIN 
        (
            SELECT
                ClientId,
                BusinessContact,
                Tech1,
                Tech2
            FROM
               OPENXML (@xmlHandle, '/ClientData/Client', 1)
               WITH
               (
                   ClientId int,
                   BusinessContact varchar(50),
                   Tech1 varchar(50),
                   Tech2 varchar(50)
               )
       ) x ON c.ClientId = x.ClientId
    

    上面的代码还没有经过测试,但我认为一般模式是存在的。我已经多次使用这种技术进行批量插入。我喜欢它,因为它可以在单个数据库操作中完成工作。

    【讨论】:

      猜你喜欢
      • 2011-05-17
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      • 2011-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-17
      相关资源
      最近更新 更多