我与一台无效的SQL Server建立了简单的连接。我试图在C#中使用SqlDataReader
从中读取数据。
以下是代码:
bool ok = false;
SqlConnection con = new SqlConnection();
con.ConnectionString = @"********";
SqlCommand cmd = new SqlCommand();
cmd.Parameters.AddWithValue("@a", uname);
cmd.Parameters.AddWithValue("@b", pass);
cmd.CommandText = @"SELECT username FROM admins WHERE pass='@b'";
cmd.Connection = con;
SqlDataReader r;
con.Open();
r = cmd.ExecuteReader();
r.Read();
string n;
n = r.GetString(0);
if (n != null)
{
ok = true;
}
con.Close();
if (ok)
{
Session["admin"] = uname;
Response.Redirect("admin_page.aspx");
}
else
{
eror.Text = "An eror occured";
Response.Redirect("index.aspx#work");
}
注意:在上面的代码字符串中" uname"并且"通过"绝对不是空的。
注意#2:我确实尝试在while循环中运行r.read()
(即使它不可能有多行) - >同样的结果。
我尝试在步进模式下运行此代码,看起来它在这一行中断了:
n = r.GetString(0);
有这个例外:
类型' System.InvalidOperationException'的例外情况发生在System.Data.dll中但未在用户代码中处理
附加信息:没有数据时读取的尝试无效。
我有点迷失在这里。我知道这可能是我在这里错过的一件简单的事情,我无法找到它。有什么想法吗?
答案 0 :(得分:2)
除了Amit对未使用参数的观察之外,您还在滥用参数
你在哪里
cmd.CommandText = @"SELECT username FROM admins WHERE pass='@b'";
你不应该在值周围加上引号,所以:
cmd.CommandText = @"SELECT username FROM admins WHERE pass=@b";
参数将知道它是VARCHAR
答案 1 :(得分:0)
您未正确使用SqlDataReader
。
如果您想知道是否存在使用正确用户名和密码的用户,您的查询应该是:SELECT 1 FROM admins WHERE username=@a AND pass=@b
完成后,由于您不关心所选值是什么(您只关心返回的行...)使用如下命令:
r = cmd.ExecuteReader();
ok = r.HasRows;
在此之后,继续你的行动。