0

用下面的代碼:如何判斷我的SqlCeDataReader在調用SqlCeCommand.ExecuteReader()後是否包含任何vals?

SqlCeDataReader myReader = cmd.ExecuteReader(CommandBehavior.SingleRow); 
itemID = myReader.GetString(0); 
packSize = myReader.GetString(1); 

...我得到一個例外,「沒有數據存在行/列」我希望它靜靜地「中止」,而不是拋出異常

這個案例。嘗試分配前有沒有辦法先測試?

我嘗試這樣做,但它確實沒有好:

SqlCeDataReader myReader = cmd.ExecuteReader(CommandBehavior.SingleRow); 
if (null != myReader.GetString(0)) 
{ 
    itemID = myReader.GetString(0); 
} 
if (null != myReader.GetString(1)) 
{ 
    packSize = myReader.GetString(1); 
} 

另一種可能是把它包起來在一條try..catch和「吃」的例外,但我不知道如果是這樣的最好的方式去...

+1

這是基於我的SqlDataReader'的'知識,而不是' SqlCeDataReader',但在前一種情況下,您必須先「讀取()」第一條記錄。假(0)返回表示不再有記錄。 –

+0

謝謝;我曾經假定調用ExecuteReader去了一切。因此,我添加了「if(myReader.Read()){}」使您的評論成爲答案,並將其標記爲*答案。 –

+0

感謝您的提議。正如我所建議的,我的回答只是一個猜測,這就是爲什麼我把它放在評論中而不是答案中。此外,我喜歡@ MD.Unicorn對哈斯羅斯的額外支票,這已經讓我不知所措。 –

回答

4

這是因爲你在取得DataReader後沒有撥打Read()方法。這並不意味着結果不包含任何數據。這意味着不包含任何數據。

using (SqlCeDataReader myReader = cmd.ExecuteReader(CommandBehavior.SingleRow)) 
{ 
    if (myReader.Read()) // It returns `false` if there is no data 
    { 
     itemID = myReader.GetString(0); 
     packSize = myReader.GetString(1); 
    } 
} 

如果結果可以包含多個行,你要檢查,看看是否結果中包含的任何數據,使用HasRows

using (SqlCeDataReader myReader = cmd.ExecuteReader()) 
{ 
    if (myReader.HasRows) 
    { 
     while (myReader.Read()) 
     { 
      // read values from `myReader` 
     } 
    } 
} 
+0

+1。對於單行,你可能只用'if(myReader.Read()){...}'就可以逃脫。 – JosephHirn

+0

@Ginosaji哦!當然!我沒有看'CommandBehavior.SingleRow',我認爲它可能有多行! –

+0

謝謝;如果BK沒有回答我已經實施的答案,我會將其標記爲這樣(即使我懷疑馬里蘭州真的存在獨角獸)。 –

相關問題