手動方法是將數據格式化爲XML塊並將其傳遞給存儲過程,然後在該存儲過程中創建UPDATE語句,該語句連接到XML以一次性執行更新。
<ClientData>
<Client ClientID="1" BusinessContact="..." Tech1="..." Tech2="..." />
<Client ClientID="2" ... />
...
</ClientData>
一種方法通過使用的XmlWriter和循環您的中繼收穫數據來創建此:
你想創建是類似於XML。在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
上面的代碼沒有被測試過,但我覺得一般模式在那裏。我曾多次使用這種技術進行批量插入。我喜歡它,因爲它可以在單個數據庫操作中完成工作。
這個保存按鈕是否會在oner中完成所有操作?我以前使用過gridview更新按鈕,但我需要添加幾個下拉菜單。 GridView支持下拉列表可以嗎? – iamjonesy 2010-04-01 10:22:19
一個gridview可以支持一些工作下拉。如果您將gridview綁定到數據源對象,然後該數據源對象掛鉤到數據適配器中,則Save只需調用DataAdaptor上的update方法。 – cjk 2010-04-01 11:25:01
這已經變成了一個小丑。熟悉VS sqldatasources不支持SQL 2008 :(所以我不得不在後面的代碼中查詢它們,並綁定gridview和dropdowns。這將能夠工作相同嗎? – iamjonesy 2010-04-01 11:39:05