将存储过程中的值分配给变量

时间:2016-08-23 07:08:21

标签: c# asp.net asp.net-mvc stored-procedures ado.net

我正在使用存储过程从数据库中获取“密码”值。我需要将此值赋给变量。我正在使用asp.net- mvcAdo.net。 这是我的存储过程。

CREATE PROCEDURE [dbo].[getPassword]
(
@Email VARCHAR(100)
)
AS
BEGIN
SELECT Password FROM dbo.Staff_Login WHERE Email=@Email
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;

        }

    }
}

我使用了一个列表。但我需要为变量赋值。因为我只需要一个值(密码)。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

在这种情况下,您要检索单个列的值,在这种情况下可以使用ExecuteScalar()。然后命令执行如下:

if(pos >= questions.length){
    $scope.myBackgroundUrl = 'url(animatedthankyou.gif)';
}

因此string passwordStr= (string)com.ExecuteScalar(); 方法的签名也将被更改,其返回类型将变为字符串,而不是getPassword;新签名将是:

List<StaffLogin>