2011-10-31 243 views
3

我正在讀一本書 - 使用Visual Studio 2008進行ASP.Net 3.5企業應用程序開發,當它談到使用Linq-to-SQL更新數據庫中的記錄時,它使用以下代碼:更新記錄Linq-to-SQL

MyUserAccount ua = new MyUserAccount 
{ 
... Update fields 
}; 

ua.UserAccountID = Convert.ToInt32(session["UserAccountID"]); 
ua.Version = Convert.ToInt32(session["Version"]); 

MyDataContext db = new MyDataContext(); 
db.MyUserAccounts.Attach(ua,true); 
db.SubmitChanges(); 

對戰什麼我習慣了,在這裏我只需要保存的AccountID在會話變量 ,然後從數據庫中獲取的記錄,進行修改,然後提交更改。

BtnUpdate

int UserAccountID = Convert.ToInt32(Request["UserAccountID"]); 

//Get User fron Context 
MyDataContext db = new MyDataContext(); 
MyUserAccount ua = db.MyUserAccounts.Single(
    x => x.UserAccountID == UserAccountID); 

//Make changes 
ua.Blah = ""; 

db.SubmitChanges(); 

所以我的問題是:如何做到這一點的最佳方法是什麼?在過去沒有看到這一點,我不確定最佳或最好的方式。任何幫助表示讚賞。

韋德

注:

我原來的問題,有人改變了我的標題,是什麼是最好的LINQ到SQL的方式來更新記錄。所以我改變了代碼以使用會話變量,並將標題恢復爲原始。請閱讀整個問題,因爲我只是在尋找最好的方法來使用Linq-to-SQL更新數據庫中的記錄。

+0

你讓所有無關代碼混淆的人。編輯你的答案只包括你所問的關於linq到SQL的兩種形式,並忘記其餘的部分。 –

回答

1

在SQL方面產生的前者將產生一個SQL語句像

Update MyUserAccount set [email protected] where UserAccountID = @UserAccountID 

而後者會產生

Select UserAccountID, Blah, .... From MyUserAccount where UserAccountID = @UserAccountID 
Update MyUserAccount set [email protected] where UserAccountID = @UserAccountID 
+0

好吧,但在第一個示例中,我需要更新記錄的所有值,並且在我的場景中,我只需要更新更改的字段。那麼如果我沒有設置字段,那麼第一個場景會不會有用null覆蓋數據的風險?謝謝。 – Wade73

+0

不,Sql更新語句是通過嘗試確定哪些列/字段已更改而生成的,因此它不會更新未提及的列或者它認爲您沒有更改該值。 – sgmoore

+0

非常感謝,非常感謝您的幫助! – Wade73

1

不要這樣做,將關鍵數據存儲到會話中。隱藏字段(viewstate是一個隱藏字段)可能被用戶篡改。會話將阻止用戶能夠更改該值。

+0

問題不是關於變量,其他人改變了我的頭銜。我改變了這個問題來反映我的原始問題。 – Wade73

+1

這可能會導致會話膨脹,並可能導致可伸縮性問題。在ViewState或隱藏字段中存儲此信息不應有任何問題,只要您的應用程序具有安全性,但不允許訪問用戶不應該訪問的數據。這是使用會話的一個不好的理由。 –

0

該示例從本書是存儲在useraccount和版本信息viewstate - 這是一個asp.net用來維護狀態和存儲窗體變量的大隱藏字段。事實上,如果您打開了viewstate,您的隱藏字段可能會處於視圖狀態。

如果關閉viewstate並使用隱藏字段,則頁面加載速度可能會加快(由於涉及維護視圖狀態的膨脹)。但是這可能會影響功能。

此外,您的代碼中的sql語句的linq將產生與本書不同的結果 - 所以我會假設書本代碼不會按照您的意願更新,而不會適應您的需求。

@Matthew是正確的,如果你有安全問題,那麼明文隱藏字段是一個不好的地方存儲的東西(+1)。

0

Viewstate在數據上添加了一些加密功能,因此您不能輕易篡改數據,而不是使用原始隱藏字段進行加密。用戶信息的最佳方法是將其存儲在會話中。

+0

好吧,我更新了這個問題,我不是在尋找什麼是保存UserAccountID的最佳方式,但什麼是使用Linq-to-SQL來更新數據庫中記錄的最佳方法。 – Wade73