2010-08-08 59 views
1

使用C#DataReader爲空或爲空

我有一個datareader,它從mysql數據庫返回一串記錄。

我正在嘗試編寫檢查datareader是否爲空的代碼。這背後的邏輯是:如果datareader有字段,然後顯示信息,否則隱藏字段。

我曾嘗試:

cmd1 = new OdbcCommand("Select * from tb_car where vehicleno = '" + textbox2.text + "';", dbcon); 
     dr1 = cmd1.ExecuteReader(); 

if (dr1["tb_car"]. != DBNull.Value) 
{ 
    textbox1.Text = "contains data"; 
} 
else 
{ 
    textbox1.Text = "is null"; 
} 

上面的代碼給了我這個錯誤:

異常詳細信息:System.IndexOutOfRangeException:其他

任何幫助將不勝感激...

+1

ps。代碼中存在一個巨大的安全漏洞,因爲您沒有使用參數。如果我輸入「';從tb_car刪除*;」進入你的文本字段,你會失去所有記錄!噢? =) – Will 2010-08-08 04:12:53

+0

男人,我沒有明白。 @戈帕爾 - 他是對的。請務必閱讀以下內容:http://www.aspnet101.com/2007/03/parameterized-queries-in-asp-net/ – David 2010-08-08 04:15:56

回答

9

我在這裏看到一些問題......首先,它看起來像你試圖訪問該行中的表名:

if(dr1["tb_car"] != DBNull.Value 

您應該傳遞一個FIELD NAME而不是表名。所以,如果名爲「tb_car」表中有一個名爲CarId場,你會希望你的代碼的樣子:

if(dr1["CarId"] != DBNull.Value) 

如果我是正確的,那麼有可能是沒有名爲「tb_car」字段和索引超出範圍錯誤是因爲DataReader正在查找名爲「tb_car」的列集合中的項目,但未找到它。這幾乎是錯誤的含義。

其次,在你甚至可以檢查它之前,你必須首先調用DataReader的Read()命令來讀取數據庫中的一行。

所以真的是你的代碼看起來應該像...

while(dr.Read()) 
{ 
    if(dr1["CarId"] != DBNull.Value) 
    { 
     .... 

等。

看到這裏的正確使用一個DataReader的:http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.read.aspx


最後,如果你只是檢查,看看是否有任何表中的行,你可以無視上述所有和使用在HasRows財產作爲

if(dr.HasRows) 
{ 
    .... 

但如果您使用的是while(dr.Read())語法,在while循環代碼將只有在有擺在首位行執行的,所以如果你不將HasRows可能是不必要的不想做任何事情都沒有結果。你仍然想,如果你想返回的消息,如「沒有找到結果」,當然用它..

編輯 - 添加

我覺得有一個問題也與線

if(dr1["CarId"] != DBNull.Value) 

您應該使用if DataReader的IsDbNull()方法。如在

if(dr.IsDbNull("CarId")) 

對不起,我錯過了第一次。

3

使用dr1.Read()在嘗試讀取值之前檢查是否有一行。 Read首先獲取第一行,然後返回後續行,如果行可用或空/集合結束,則返回true。

例如。

// for reading one row 
if (rd1.Read()) 
{ 
    // do something with first row 
} 

// for reading thru multiple rows 
while (rd1.Read()) 
{ 
    // do something with current row 
} 
+0

+1。這是一個很好的答案,但我相信它只解決了部分問題。 – David 2010-08-08 04:01:19