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

C# 如何从存储过程中获取某些选定值的值,c#,asp.net,sql-server,stored-procedures,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("

我刚开始学习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
我需要一组示例。

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

type = dr["UserType"] as string
假设“UserType”是您要查找的列(因为您使用的是Select*,所以无法判断),则该行将是

type = dr["UserType"] as string

在不知道用户表是如何构造的情况下,以下是一个猜测:

while (dr.Read()) {
...  
}
应改为:

if (dr.Read()) {
  type = dr["type"].ToString();
}
一些建议

  • 在连接和命令对象周围使用
    子句。这将为你以后省去很多痛苦。参见:示例。以及原因提示:如果现在的代码已发布到生产环境中,则很有可能会在不同的地方出现与数据库相关的随机异常。所以这很重要

  • SqlCommand中的进程名称(“checkid”)与存储过程的实际名称(“logincheck”)不匹配。换一个。您现在拥有的将在执行时导致sql错误

  • 考虑更改变量的名称
    类型
    。类型是系统命名空间中的一个类,读取方式有点混乱。可能是accountType、loginType、userType或类似的东西。您当然可以将其保留为
    类型
    ;只有跟随你的人会质疑它

  • 更改
    select
    语句以实际命名要返回的列。就目前而言,它是易碎的。见:

  • 我使用了
    if
    语句而不是
    while
    ,因为您实际上只需要第一行


  • 在不知道用户表是如何构造的情况下,以下是一个猜测:

    while (dr.Read()) {
    ...  
    }
    
    应改为:

    if (dr.Read()) {
      type = dr["type"].ToString();
    }
    
    一些建议

  • 在连接和命令对象周围使用
    子句。这将为你以后省去很多痛苦。参见:示例。以及原因提示:如果现在的代码已发布到生产环境中,则很有可能会在不同的地方出现与数据库相关的随机异常。所以这很重要

  • SqlCommand中的进程名称(“checkid”)与存储过程的实际名称(“logincheck”)不匹配。换一个。您现在拥有的将在执行时导致sql错误

  • 考虑更改变量的名称
    类型
    。类型是系统命名空间中的一个类,读取方式有点混乱。可能是accountType、loginType、userType或类似的东西。您当然可以将其保留为
    类型
    ;只有跟随你的人会质疑它

  • 更改
    select
    语句以实际命名要返回的列。就目前而言,它是易碎的。见:

  • 我使用了
    if
    语句而不是
    while
    ,因为您实际上只需要第一行