Ручной подход состоит в том, чтобы отформатировать данные в блок 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
Приведенный выше код не был проверен, но я думаю, что общая схема есть. Я использовал эту технику для массовых вставок в ряде случаев. Мне это нравится, потому что он выполняет работу за одну операцию с базой данных.