1

i just got started with ASP.Net, i only knew PHP so which means im a little stubborn. i need real examples.

heres my problem, i got this class in a class library called Class1, it connects to the database and ask for verification of user login.

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

here's my stored procedure

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

i need a set of examples please.

4

2 回答 2

1

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

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

应改为:

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

几个建议。

  1. 在连接和命令对象周围使用using子句。这将在以后为您节省很多痛苦。请参阅:使用返回值调用存储过程以获取示例。而SqlConnection SqlCommand SqlDataReader IDisposable的原因。 提示:如果您现在拥有的代码已发布到生产环境中,您很可能会开始看到与数据库相关的随机异常开始在各个地方弹出。所以这非常重要。

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

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

  4. 更改您的select语句以实际命名您想要返回的列。就目前而言,它很脆。请参阅:不使用 select * 的原因是什么?

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

于 2013-09-05T17:03:48.160 回答
0

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

type = dr["UserType"] as string
于 2013-09-05T17:00:20.470 回答