遇到问题我需要帮助。基本上我将开发一个表单(一个更大的Web应用程序的一部分),列出了大量的客户端和业务联系人,技术联系人1和技术联系人2.
这个想法是快速输入数据。因此,一个表单显示每个客户端在下拉列表中的联系人,我可以更改每个客户端,然后单击保存按钮进行大量保存。
数据库如下所示:
tblClient
客户端ID
CLIENTNAME
BusinessContact
Tech1
TECH2
我的想法是使用转发器格式化这样的数据:
客户端
业务联系
Tech1
TECH2
客户机2
业务联系
Tech1
TECH2
我坚持的是如何进行批量更新?我可以对Repeater1中的每个项执行类似的操作,然后执行更新SQL语句吗? - 琼西
答案 0 :(得分:0)
如果您使用VS中的GUI工具使用DataAdaptors构建数据源并将它们挂钩到gridview中,那么除了在保存按钮上调用update之外,所有代码都是为您编写的。
答案 1 :(得分:0)
手动方法是将数据格式化为XML块并将其传递给存储过程,然后您可以创建一个UPID语句来加入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
上面的代码尚未经过测试,但我认为一般模式存在。我已经在很多场合使用过这种技术进行批量插入。我喜欢它,因为它可以在单个数据库操作中完成工作。