2013-04-01 20 views
1

我有一個表userdata具有這些列:一個存儲過程來更新整個表或單個列太

userId 
userName 
userEmail 
userContact 
userDob 
userAdd 
userImage 
userPass 

我使用一個存儲過程來選擇從該表中的數據。

現在我想用存儲過程更新此表。我可以用存儲過程更新此表,但我的要求是在profile.aspx我允許用戶使用存儲過程更新所有列。但在其他形式中,我希望用戶只更新幾列,例如在setting.aspx頁面上我允許用戶只更新userPass列。

所以我必須做另一個存儲過程。而且我有很多這樣的桌子。我想知道我必須創建多少個存儲過程來更新具有不同列的許多表。

任何人都可以提出一個簡短的方法,以便我可以做到這一點每個表只有一個存儲過程來更新整個表或單個列,或任何C#代碼來縮短這一點?

在此先感謝

+0

我會***不推薦嘗試創建一個單一的存儲過程,可以更新一些或所有科爾在一個程序中提供全部內容。這將是一個巨大,凌亂,複雜,難以理解和難以維護的程序!不要這樣做 - 這不值得。要麼你需要x個存儲過程用於你的x更新場景 - 或者你使用一個像Entity Framework這樣的ORM來避免不得不寫很多過程...... –

回答

3

您可以使用MS SQL Server中的ISNULL函數,該函數由MSDN的以下語句說明。

用指定的替換值替換NULL。

您可以編寫一個存儲過程,它可以更新您在各種操作中更新的所有字段。從所有頁面調用相同的過程。然後從頁面只傳遞該頁面的相關參數&其餘參數(與該頁面無關)通過null

你的存儲過程應該是這樣的

UPDATE dbo.userTable SET 
userName = ISNull(@userName, userName), 
userEmail= ISNull(@userEmail, userEmail), 
-- list of all your table fields goes here 
WHERE userID = @userID 

這將完成,如果你傳遞的參數;它會更新該字段的值;如果您通過null任何字段,它將使用其現有值更新該字段。因此該字段在更新操作中不會受到影響。

+0

謝謝devraj ..你救了我的一天! :) –

0

你可以有多個if.. else..條件單一存儲過程來控制每個單場的更新用。然後您可以將它們作爲參數傳遞以控制要更新的字段。

0

我認爲你可以這樣做: 在頭版,你應該設置字段不可編輯,你沒有要更新,但傳遞值作爲參數傳遞到存儲過程。在存儲過程中,您將這些字段的舊值與相應的參數競爭,如果不相等,則更新它,否則,不對這些字段進行任何操作。

0

你可以使用這樣的事情:

UPDATE tbl t 
    SET t.userName = CASE WHEN @userName IS NULL THEN t.userName ELSE @userName END 
    , t.userEmail = CASE WHEN @userEmail IS NULL THEN t.userEmail ELSE @userEmail END 
    , ... 
    WHERE t.userName = CASE WHEN @WHERE_userName IS NULL THEN t.userName ELSE @WHERE_userName END 
    AND ... 

所以,如果你不想更新特定領域剛剛從代碼通過DBNull.Value的程序調用該參數。 請記住,只有當您不打算使用NULL值更新字段時,這纔會起作用。 如果你需要空值,那麼你可以重寫一些代碼來使它與空值一起工作。如果您需要進一步的幫助,請發表評論。

+0

感謝bugartist ..這似乎是我期待的..讓我試試..並將恢復到你..真的很感謝 –

0

獲取您需要更新的Datatable中的所有數據。 使用datatable.WriteXML方法並獲取對象所有字符串都使用XmlWriteMode.IgnoreSchema來獲取數據。

 DataTable dt = new DataTable(); 
     dt.WriteXml(stream object ,XmlWriteMode.IgnoreSchema) 

現在創建過程,它接受VARCHAR(最大)參數,並傳遞對象的程序。

之後,您可以使用Openxml或在Sqlserver 的XML變量中獲取所有這些東西獲取@tablevariable或#temp表中的所有數據。

Openxml in sqlserverFor Xml for XMl variable

那麼你會得到一個表中的每一件事使用該表上的主鍵ID 像更新 數據庫表的基礎....

SQl的qquery是像下面

Update "Database Table Name" 
set ......... 
from "GetDatafromc#table" 
相關問題