2015-07-19 67 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; 

在此之後,繼續您的操作。