2010-10-21 153 views
4

我正在處理一個項目,我們必須通過存儲過程實現與數據庫的所有通信。我們正在使用Linq-to-SQL,因此所有的數據庫實體都已就位。我的問題是如何寫一個返回實體的存儲過程,如果這是可能的話。SQL Server存儲過程和Linq-to-SQL

例如,我們在用戶名和密碼登錄時驗證用戶,然後執行檢查,但是應該如何編寫才能使存儲過程返回Employee實體?

CREATE PROCEDURE GetLogin (
    @UserName NVARCHAR(50), 
    @Password NVARCHAR(50)) 
+0

我不認爲這是可能的。 – AlexanderMP 2010-10-21 09:49:21

+0

@Alexander:當然是 - 請參閱我的回答... – 2010-10-21 11:47:54

回答

4

GetLogin程序做了什麼和/或返回?

將存儲過程添加到Linq-to-SQL數據上下文時,可以在屬性窗口中定義一個「返回類型」 - 如果您確定存儲過程返回所有構成的屬性一個User,那麼你可以設置存儲過程的返回類型爲User,然後這應該工作。

在這種情況下,您的代碼會是這個樣子:

User found = ctx.GetLogin("YourUserName", "TOP$SECRET").SingleOrDefault(); 

如果在數據庫中找到了用戶,found將包含用戶 - 否則,這將是NULL。

更新:一旦你有這樣的User對象,當然,你可以使用它就像任何其他的LINQ到SQL對象!

您可以修改屬性:

found.UserName = "New User Name"; 
ctx.SubmitChanges(); 

,或者你可以將其刪除:

ctx.Users.DeleteOnSubmit(found); 
ctx.SubmitChanges(); 

你要回來是LINQ到SQL對象,就像任何其他的對象!

+0

您好,感謝您的幫助!當我將它改爲返回用戶時,它的工作就像一個魅力,所以現在它恢復了一個列表,我只是選擇第一個。但是如果我不確定我會得到什麼回報,我如何以最佳方式與這些數據進行交互?例如,如果我想返回像上面這樣的用戶,但出現錯誤,然後我希望過程返回帶有錯誤消息的字符串,那麼我應該如何處理? //謝謝 – Fore 2010-10-21 13:27:42

+0

@Fore:在這種情況下,拋出一個帶有錯誤信息的異常,並在你的應用程序中捕獲異常並向用戶顯示錯誤(類似「未找到用戶」) - 這是標準的.NET方式做這樣的東西 – 2010-10-21 13:38:35

+0

好吧,所以一旦我有這個用戶,我能夠編輯它,或從數據庫中刪除它,而不訴諸於數據庫查找?我的意思是,它是如何知道它實際上是來自數據庫的有效用戶?如果我以相同的形式傳輸數據,但數據庫中實際上不存在這樣的數據呢?在這種情況下,這將不再是一個真正的實體,而是一個具有零功能的簡單數據結構(這是從LINQ to SQL中的SP獲得的)。這就是我在上述評論中的意思。 – AlexanderMP 2010-10-21 19:56:12