2016-08-23 32 views
0

我正在使用存儲過程從數據庫中獲取「密碼」值。我需要將這個值賦給一個變量。我正在使用asp.net- mvcAdo.net。 這是我的存儲過程。將存儲過程的值分配給變量

CREATE PROCEDURE [dbo].[getPassword] 
(
@Email VARCHAR(100) 
) 
AS 
BEGIN 
SELECT Password FROM dbo.Staff_Login WHERE [email protected] 
END 

這是我的存儲庫類。

using System; 
using System.Collections.Generic; 
using System.Configuration; 
using System.Data; 
using System.Data.SqlClient; 
using System.Linq; 

namespace Job_Recuitment_System.Repository 
{ 
    public class LoginRepository 
    { 
     private SqlConnection con; 
     //To handle sql connection 
     private void connection() { 
      string constr = ConfigurationManager.ConnectionStrings["mycon"].ToString(); 
      con = new SqlConnection(constr); 
     } 

     //to get the password 
     public List<StaffLogin> getPassword(StaffLogin obj) { 
      connection(); 
      List<StaffLogin> pword = new List<StaffLogin>(); 
      SqlCommand com = new SqlCommand("getPassword", con); 
      com.CommandType = CommandType.StoredProcedure; 
      com.Parameters.AddWithValue("@Email",obj.Email); 
      SqlDataAdapter da = new SqlDataAdapter(com); 
      DataTable dt = new DataTable(); 
      con.Open(); 
      da.Fill(dt); 
      con.Close(); 

      //Bind StaffLogin 
      pword = (from DataRow dr in dt.Rows 

         select new StaffLogin() 
         { 
          Password = Convert.ToString(dr["Password"]), 
         }).ToList(); 


      return pword; 

     } 

    } 
} 

我有一個列表。但我需要給一個變量賦值。因爲我只有我需要的是一個值(密碼)。

回答

1

在這種情況下,您正在檢索單個列的值,您可以在這種情況下使用ExecuteScalar()。然後命令執行將是這樣的:

string passwordStr= (string)com.ExecuteScalar(); 

所以getPassword方法的簽名也隨之發生變化,它的返回類型將成爲字符串,而不是爲List<StaffLogin>;新的簽名是:

public string getPassword(StaffLogin obj) 
{ 
    connection(); 
    string passwordStr = String.Empty; 
    using (SqlCommand com = new SqlCommand("getPassword", con)) 
    { 
     com.CommandType = CommandType.StoredProcedure; 
     com.Parameters.AddWithValue("@Email", obj.Email); 
     passwordStr = (string)com.ExecuteScalar(); 
    } 
    return passwordStr; 
} 
2

你並不需要一個SqlDataAdapter的,但你只需要使用SqlCommand.ExecuteScalar

 connection(); 
     SqlCommand com = new SqlCommand("getPassword", con); 
     com.CommandType = CommandType.StoredProcedure; 
     com.Parameters.Add("@Email",SqlDbType.NVarChar, 100). Value = obj.Email; 
     con.Open(); 
     var result = com.ExecuteScalar();    
     if(result != null) 
      MessageBox.Show("Password = " + result.ToString(); 
     con.Close(); 

的ExecuteScalar返回該命令和您檢索的第一行的第一列查詢很適合這種情況。然而,重要的是要考慮如果查詢不產生任何結果,ExecuteScalar可能返回NULL,因此在使用它之前總是針對空值測試結果。

關於另一個問題,我真的建議你避免這些簡單的瑣碎任務的存儲過程,除非有充分的理由使用它們。使用Add而不是AddWithValue並指定參數的確切大小可以爲Sql優化器提供足夠的提示來創建優化查詢。

最後,請記住以明文存儲/返回密碼被認爲是一個非常大的安全風險。嘗試使用這個問題中解釋的更安全的方法:Best way to store passwords in a database