我刚开始使用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
我需要一套例子。
答案 0 :(得分:1)
在不知道用户表的结构方式的情况下,以下是猜测:
while (dr.Read()) {
...
}
应更改为:
if (dr.Read()) {
type = dr["type"].ToString();
}
一些建议。
在连接和命令对象周围使用using
子句。这将为您以后节省很多痛苦。有关示例,请参阅:Calling stored procedure with return value。并SqlConnection SqlCommand SqlDataReader IDisposable原因。What is the reason not to use select *?。 提示:如果现在的代码已经发布到生产环境中,很可能您会开始看到随机数据库相关的异常开始在各个地方弹出。所以这非常重要。
SqlCommand中的proc名称(“checkid”)与存储过程的实际名称(“logincheck”)不匹配。改变其中一个。你现在拥有的东西会在执行时导致sql错误。
考虑更改变量type
的名称。 Type是System命名空间中的一个类,读取方式有点令人困惑。也许是accountType,loginType,userType或类似的东西。您当然可以将其保留为type
;只有跟随你的人会质疑它。
更改select
语句以实际命名要返回的列。因为它很脆弱。请参阅:{{3}}
我使用了if
语句而不是while
,因为你真的只想要第一行。
答案 1 :(得分:0)
假设“UserType”是您要查找的列(无法判断,因为您使用的是Select *)该行将是
type = dr["UserType"] as string