SqlDataReader意外返回null

时间:2015-07-19 19:10:53

标签: c# sql-server database

我与一台无效的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中但未在用户代码中处理

     

附加信息:没有数据时读取的尝试无效。

我有点迷失在这里。我知道这可能是我在这里错过的一件简单的事情,我无法找到它。有什么想法吗?

2 个答案:

答案 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;

在此之后,继续你的行动。