2015-07-19 68 views
0

我有一个简单的连接到SQL Server不工作。我试图在C#中使用SqlDataReader来读取数据。SqlDataReader意外返回NULL

下面是代码:

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中,但未在用户代码中处理

附加信息:无数据存在时无效尝试读取。

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

+1

在您的查询中甚至没有使用“@ a”,并且您的问题是现在行已返回,因此您得到***无数据存在时尝试读取*** – Amit

+1

几件事情。为什么你不使用参数@a?另外,如果添加参数,则不应将“字符”手动添加到查询中。它将被自动处理。您应该测试r.Read是否成功(使用返回值),如果它没有在数据库中找到您的数据。我怀疑这是这里的问题。 – Saragis

回答

2

除了阿密特讲述的是未使用的参数的观察,你是滥用参数

如果你有

cmd.CommandText = @"SELECT username FROM admins WHERE pass='@b'"; 

你不应该围绕价值的报价,因此:

cmd.CommandText = @"SELECT username FROM admins WHERE [email protected]"; 

该参数将知道它是一个VARCHAR

+0

删除值附近的引号解决了它。非常感谢。 – user3107990

+0

感谢您的支持。请注意,Amit的答案会更进一步(提供您甚至没有问过的信息),解释如何更好地在您的用例中使用查询结果。我建议你接受他的回答,所以问题被标记为回答! – Stan

+0

@ user3107990:如果此答案可帮助您解决问题,请[**接受此答案**](http://meta.stackoverflow.com/q/5234/153998)。这将表明你对那些花时间帮助你的人表示感谢。 –

0

您没有使用SqlDataReader正确。

如果你想知道是否存在与正确的用户名和密码的用户,您的查询也许应该是:SELECT 1 FROM admins WHERE [email protected] AND [email protected]

一旦这样做了,既然你不关心所选择的值是什么(你只关心有一个返回的行...)使用如下命令:

r = cmd.ExecuteReader(); 
ok = r.HasRows; 

在此之后,继续您的操作。