Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将存储过程中的值赋给变量_C#_Asp.net_Asp.net Mvc_Stored Procedures_Ado.net - Fatal编程技术网

C# 将存储过程中的值赋给变量

C# 将存储过程中的值赋给变量,c#,asp.net,asp.net-mvc,stored-procedures,ado.net,C#,Asp.net,Asp.net Mvc,Stored Procedures,Ado.net,我正在使用存储过程从数据库中获取“password”值。我需要把这个值赋给一个变量。我使用的是asp.net-mvc和Ado.net。 这是我的存储过程 CREATE PROCEDURE [dbo].[getPassword] ( @Email VARCHAR(100) ) AS BEGIN SELECT Password FROM dbo.Staff_Login WHERE Email=@Email END 这是我的存储库类 using System; using System.Collec

我正在使用存储过程从数据库中获取“password”值。我需要把这个值赋给一个变量。我使用的是
asp.net-mvc
Ado.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;

        }

    }
}
使用系统;
使用System.Collections.Generic;
使用系统配置;
使用系统数据;
使用System.Data.SqlClient;
使用System.Linq;
命名空间作业\u重现\u系统存储库
{
公共类登录还原
{
私有连接;
//处理sql连接的步骤
专用无效连接(){
string constr=ConfigurationManager.ConnectionString[“mycon”].ToString();
con=新的SqlConnection(cont);
}
//获取密码
公共列表getPassword(StaffLogin obj){
连接();
List pword=新列表();
SqlCommand com=新的SqlCommand(“getPassword”,con);
com.CommandType=CommandType.StoredProcess;
com.Parameters.AddWithValue(“@Email”,obj.Email);
SqlDataAdapter da=新的SqlDataAdapter(com);
DataTable dt=新的DataTable();
con.Open();
da.填充(dt);
con.Close();
//绑定StaffLogin
pword=(来自dt.行中的数据行dr
选择新的statfflogin()
{
Password=Convert.ToString(dr[“Password”]),
}).ToList();
返回pword;
}
}
}

我有一份使用清单。但我需要给变量赋值。因为我只需要一个值(密码)。

在本例中,您检索的是单个列的值,您可以在这种情况下使用。然后,命令执行将如下所示:

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

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;
 }

在本例中,您正在检索单个列的值,您可以在这种情况下使用。然后,命令执行将如下所示:

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

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;
 }

您不需要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返回命令检索到的第一行的第一列,您的查询非常适合此条件。然而,重要的是,如果查询没有产生任何结果,ExcuteSCALAR可以返回null,因此在使用之前总是将结果与空值进行测试。 另一方面,我建议您避免使用存储过程来执行这些简单的琐碎任务,除非有充分的理由使用它们。使用Add而不是AddWithValue并指定参数的确切大小可以为Sql优化器提供足够的提示来创建优化的查询


最后,请记住,以明文形式存储/返回密码被认为是一个非常大的安全风险。尝试使用本问题中解释的更安全的方法:

您不需要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返回命令检索到的第一行的第一列,您的查询非常适合此条件。然而,重要的是,如果查询没有产生任何结果,ExcuteSCALAR可以返回null,因此在使用之前总是将结果与空值进行测试。 另一方面,我建议您避免使用存储过程来执行这些简单的琐碎任务,除非有充分的理由使用它们。使用Add而不是AddWithValue并指定参数的确切大小可以为Sql优化器提供足够的提示来创建优化的查询

最后,请记住,以明文形式存储/返回密码被认为是一个非常大的安全风险。尝试使用本问题中说明的更安全的方法: