无法从 SqlDataReader 读取数据
Can't read data from SqlDataReader
我正在尝试使用 C# 中的 DataReader 从数据库中读取数据。我遇到了一个错误,说没有数据存在。这是我的代码:
[WebMethod] //Login invoke
public string[] login(string u, string p)
{
SqlConnection con = new SqlConnection();
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
con.ConnectionString = @"******Database.mdf";
cmd.Parameters.AddWithValue("@u", u);
cmd.Parameters.AddWithValue("@p", p);
cmd.CommandText = "SELECT username, pass, st, lastonline FROM admins WHERE username='@u' AND pass='@p' ";
int st = 555;
string lastonline = "";
try
{
con.Open();
SqlDataReader r = cmd.ExecuteReader();
if (r.Read())
{
st = r.GetInt16(2);
lastonline = r.GetString(3);
}
else
{
string[] x = new string[1] { "err" };
return x;
}
r.Close();
con.Close();
}
catch { }
string[] arr = new string[3] { st.ToString(), lastonline, u };
return arr;
不可能有两行具有相同的用户名和密码,所以我没有为 r.Read();
使用 while
循环。
所有这些函数都获取用户名和密码,检查数据库是否有兼容的行,获取该行中的其余列,并将它们 returns 放入字符串数组中。如果什么都没有(没有这样的用户),它返回一个值为 "x" 的数组。问题是我总是得到 "x" 并且当我强制它读取时,它会弹出我上面提到的错误。
备注:
*我试过 运行 单独查询,它工作正常。
*我检查了 "u" 和 "p" 值是否对应于 "username" 和 "pass"。他们这样做没问题。
*在网上查了一下,在Whosebug这里,还是没有解决我的问题。
有什么解决办法吗?
那是因为您将用户名和密码与字符串 '@u'
和 '@p'
而不是参数值 @u
和 @p
进行比较。
删除参数周围的撇号:
cmd.CommandText = "SELECT username, pass, st, lastonline FROM admins WHERE username=@u AND pass=@p ";
您只是不需要参数化查询中参数名称的引号:
cmd.CommandText = "SELECT username, pass, st, lastonline FROM admins WHERE username=@u AND pass=@p";
您的版本试图实际匹配用户名 @u
和密码 @p
。
我正在尝试使用 C# 中的 DataReader 从数据库中读取数据。我遇到了一个错误,说没有数据存在。这是我的代码:
[WebMethod] //Login invoke
public string[] login(string u, string p)
{
SqlConnection con = new SqlConnection();
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
con.ConnectionString = @"******Database.mdf";
cmd.Parameters.AddWithValue("@u", u);
cmd.Parameters.AddWithValue("@p", p);
cmd.CommandText = "SELECT username, pass, st, lastonline FROM admins WHERE username='@u' AND pass='@p' ";
int st = 555;
string lastonline = "";
try
{
con.Open();
SqlDataReader r = cmd.ExecuteReader();
if (r.Read())
{
st = r.GetInt16(2);
lastonline = r.GetString(3);
}
else
{
string[] x = new string[1] { "err" };
return x;
}
r.Close();
con.Close();
}
catch { }
string[] arr = new string[3] { st.ToString(), lastonline, u };
return arr;
不可能有两行具有相同的用户名和密码,所以我没有为 r.Read();
使用 while
循环。
所有这些函数都获取用户名和密码,检查数据库是否有兼容的行,获取该行中的其余列,并将它们 returns 放入字符串数组中。如果什么都没有(没有这样的用户),它返回一个值为 "x" 的数组。问题是我总是得到 "x" 并且当我强制它读取时,它会弹出我上面提到的错误。
备注: *我试过 运行 单独查询,它工作正常。 *我检查了 "u" 和 "p" 值是否对应于 "username" 和 "pass"。他们这样做没问题。 *在网上查了一下,在Whosebug这里,还是没有解决我的问题。
有什么解决办法吗?
那是因为您将用户名和密码与字符串 '@u'
和 '@p'
而不是参数值 @u
和 @p
进行比较。
删除参数周围的撇号:
cmd.CommandText = "SELECT username, pass, st, lastonline FROM admins WHERE username=@u AND pass=@p ";
您只是不需要参数化查询中参数名称的引号:
cmd.CommandText = "SELECT username, pass, st, lastonline FROM admins WHERE username=@u AND pass=@p";
您的版本试图实际匹配用户名 @u
和密码 @p
。