繁体   English   中英

ASP.NET/VB.NET问题解决帮助!

[英]ASP.NET/VB.NET problem solving help!

有需要帮助的问题。 基本上,我要开发一个表格(是更大的Web应用程序的一部分),该表格列出了很多客户,并列出了业务联系人,技术联系人1和技术联系人2。

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

该数据库如下所示:

tblClient

客户编号

客户名称

业务联系

技术1

科技2

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

客户

业务联系

技术1

科技2

客户2

业务联系

技术1

科技2

我所坚持的是如何进行批量更新? 我可以对Repeater1中的每个项目执行类似的操作,然后执行更新SQL语句吗? 琼斯

如果您使用VS中的GUI工具通过DataAdaptor构建数据源并将其挂钩到gridview中,则将为您编写所有代码,而不是在保存按钮上调用update。

手动方法是将数据格式化为XML块并将其传递给存储过程,然后您可以在其中创建一个UPDATE语句,该语句将JOINS加入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

上面的代码尚未经过测试,但我认为这里存在通用模式。 我在很多场合都使用这种技术进行批量插入。 我喜欢它,因为它可以在单个数据库操作中完成工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM