2010-04-01 62 views
1

有一個問題,我需要幫助。基本上,我會制定一個表格(更大的web應用程序的一部分),該目錄的客戶端的負載,有業務聯繫,技術聯繫人1,和技術聯繫人2.ASP.NET/VB.NET解決問題的幫助!

的想法是快速的數據輸入。因此,一種形式顯示了其在下拉菜單中的聯繫人每一個客戶和我,我們可以改變每一個然後點擊保存按鈕做了大規模救。

數據庫看起來是這樣的:

tblClient

的ClientID

CLIENTNAME

BusinessContact

Tech1

技術2

我的想法是使用一箇中繼器格式化這樣的數據:

客戶

業務聯繫

Tech1

TECH2

客戶端2

業務聯繫

Tech1

TECH2

什麼我卡上是如何做大規模更新?我可以爲Repeater1中的每個項目執行類似操作,然後執行更新SQL語句嗎? - Jonesy

回答

0

如果你使用VS的GUI工具來建立與DataAdaptors一個數據源,這些鉤到一個gridview,所有的代碼爲你寫的,不是你的保存按鈕調用更新等。

+0

這個保存按鈕是否會在oner中完成所有操作?我以前使用過gridview更新按鈕,但我需要添加幾個下拉菜單。 GridView支持下拉列表可以嗎? – iamjonesy 2010-04-01 10:22:19

+0

一個gridview可以支持一些工作下拉。如果您將gridview綁定到數據源對象,然後該數據源對象掛鉤到數據適配器中,則Save只需調用DataAdaptor上的update方法。 – cjk 2010-04-01 11:25:01

+0

這已經變成了一個小丑。熟悉VS sqldatasources不支持SQL 2008 :(所以我不得不在後面的代碼中查詢它們,並綁定gridview和dropdowns。這將能夠工作相同嗎? – iamjonesy 2010-04-01 11:39:05

0

手動方法是將數據格式化爲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 

上面的代碼沒有被測試過,但我覺得一般模式在那裏。我曾多次使用這種技術進行批量插入。我喜歡它,因爲它可以在單個數據庫操作中完成工作。