如何从存储过程中获取某些选定值的值

时间:2013-09-05 16:57:18

标签: c# asp.net sql-server stored-procedures

我刚开始使用ASP.Net,我只知道PHP,这意味着我有点固执。我需要真实的例子。

继承我的问题,我在一个名为Class1的类库中得到了这个类,它连接到数据库并要求验证用户登录。

public string userlogin(string loginuser,string loginpass)
    {
        string type = null;
        myCon.Open();
        SqlCommand logincheck = new SqlCommand("CheckID", myCon);
        logincheck.CommandType = CommandType.StoredProcedure;
        logincheck.Parameters.Add("@userid", SqlDbType.NVarChar).Value = loginuser;
        logincheck.Parameters.Add("@password", SqlDbType.NVarChar).Value = loginpass;
        SqlDataReader dr;
        dr = logincheck.ExecuteReader();
        while (dr.Read())
        {
            type = //here i want to get the value of type in my database
            break;

        }
        myCon.Close();
        return type;
    }

这是我的存储过程

ALTER PROCEDURE dbo.logincheck
@userid nchar(10),
@password nchar(20)
AS
Select * from users Where userid = @userid and password = @password
RETURN

我需要一套例子。

2 个答案:

答案 0 :(得分:1)

在不知道用户表的结构方式的情况下,以下是猜测:

while (dr.Read()) {
...  
}

应更改为:

if (dr.Read()) {
  type = dr["type"].ToString();
}

一些建议。

  1. 在连接和命令对象周围使用using子句。这将为您以后节省很多痛苦。有关示例,请参阅:Calling stored procedure with return value。并SqlConnection SqlCommand SqlDataReader IDisposable原因。What is the reason not to use select *?提示:如果现在的代码已经发布到生产环境中,很可能您会开始看到随机数据库相关的异常开始在各个地方弹出。所以这非常重要。

  2. SqlCommand中的proc名称(“checkid”)与存储过程的实际名称(“logincheck”)不匹配。改变其中一个。你现在拥有的东西会在执行时导致sql错误。

  3. 考虑更改变量type的名称。 Type是System命名空间中的一个类,读取方式有点令人困惑。也许是accountType,loginType,userType或类似的东西。您当然可以将其保留为type;只有跟随你的人会质疑它。

  4. 更改select语句以实际命名要返回的列。因为它很脆弱。请参阅:{{3}}

  5. 我使用了if语句而不是while,因为你真的只想要第一行。

答案 1 :(得分:0)

假设“UserType”是您要查找的列(无法判断,因为您使用的是Select *)该行将是

type = dr["UserType"] as string