2016-10-07 51 views
0

我正在嘗試使用我的密碼。使用輸出參數調用實體框架過程時出錯

這裏是我的存儲過程返回我的PW作爲一個nvarchar(512):

alter proc [dbo].g_GetPWFromEmail 
@emailAddress nvarchar(50), 
@EncrPass nvarchar(512) OUTPUT 

as 
if ((Select count(*) from users where emailAddress = @emailAddress) > 0) 
begin 
    select @EncrPass = password 
    from users 
    where emailAddress = @emailAddress 
end 
else 
begin 
    select @EncrPass = '' 
end 

這裏是什麼在emdx文件架式:

public virtual ObjectResult<string> g_GetPWFromEmail(string emailAddress, ObjectParameter encrPass) 
{ 
    var emailAddressParameter = emailAddress != null ? 
     new ObjectParameter("emailAddress", emailAddress) : 
     new ObjectParameter("emailAddress", typeof(string)); 

    return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<string>("g_GetPWFromEmail", emailAddressParameter, encrPass); 
} 

而當我把它稱爲它的錯誤出...不知道如何調用此 - 這是我到目前爲止:

//Pull Current Encrypted Password from DB 
string DbPw = ""; 
ObjectParameter DBPW1 = null; 
var DbPassWord = databaseManager.g_GetPWFromEmail(model.Username, DBPW1).ToList(); 
if (DbPassWord != null && DbPassWord.Count() > 0) 
{ 
    DbPw = Convert.ToString(DBPW1); 
} 

我該如何調用此函數返回我的從數據庫中散列pw?我知道有一個更好的方法,但已經嘗試了幾種方法,並且不能很好地理解語法。

+0

該存儲過程的要點是什麼?你是否試圖檢查哈希是否與數據庫中的內容匹配(因爲這是你應該做的)? – DavidG

+0

許多事情可以改進......你的方法'g_GetPWFromEmail()'返回一個字符串,所以不需要將它轉換爲字符串,它是一個字符串......它以小寫字母開頭,並有一個下劃線針對[Microsoft命名約定](https://msdn.microsoft.com/en-us/library/ms229045(v = vs.110).aspx))。而不是'〜= null && Count()> 0',你應該使用'string.IsNullorWhiteSpace()'。你執行這些程序的方式非常古老,請閱讀[Execute SP](http://www.entityframeworktutorial.net/EntityFramework4.3/execute-stored-procedure-using-dbcontext.aspx)。 –

+0

確實 - 是的 - 我試圖檢查哈希是否與數據庫中的內容匹配(因爲這是你應該做的)。我只是不能讓這個代碼工作!任何想法都會被理解。如果您查看鏈接的網站,您將看到幫助程序文件。 –

回答

1

工作這個簡單的,然後定期LINQ到實體將工作,假設你已經設置瞭如表實體:

using (var context = new MyContext()) { 
    string encryptedPassword = context.Users 
     .Where(u => u.emailAddress == emailAddress) 
     .Select(u => u.password) 
     .SingleOrDefault(); 
} 
+0

謝謝!這是我正在尋找的。仍在研究細節......請繼續關注。 –

0

您向方法中傳入空引用(DPBW1)。因此,該方法無法使用輸出值更新該引用。

ObjectParameter DBPW1 = null; 
var DbPassWord = databaseManager.g_GetPWFromEmail(model.Username, DBPW1).ToList(); 

我沒有在EF做到了這一點,但在SQL ADO.NET,你還是創建參數,只是標記參數方向作爲輸出,PROC運行在此之後,參數值填充。

你應該可以在這裏做同樣的事情。

編輯看起來像ObjectParameter沒有定義參數方向。也許它是自動完成的 - 我不得不試着看看它是否有效。

var DPBW1 = new ObjectParameter("EncrPass", typeof(string)); 

編輯它確實沒有。如果你的使用情況是真的設置參數方向

相關問題