2013-06-26 44 views
0

我試圖通過WCF服務訪問一個Silverlight應用程序的SQL數據庫,由於某種原因,我的SqlDataReader對象不斷給我錯誤。我只是試圖從數據庫中檢索一個單一的值。SqlDataReader不識別列序號值

這是我的代碼現在:

using(SqlConnection oConnection = new SqlConnection(ConnectionString)) 
{ 
    SqlCommand oCommand = new SqlCommand("SELECT SystemVersNo FROM dbo.CoPolicyPointer WHERE SystemAssignId = '58859700000000'"); 

    CompositeType oCustomer = new CompositeType(); 

    SqlDataReader oReader = null; 
    oConnection.Open(); 
    oCommand.Connection = oConnection; 
    oReader = oCommand.ExecuteReader(); 

    if (oReader.HasRows) 
    { 
     oCustomer.SRVNo = oReader.GetValue(0).ToString(); 
    } 
    else 
    { 
     oCustomer.SRVNo = "No rows returned."; 
    } 

    oConnection.Close(); 

    return oCustomer; 
} 

oReader.HasRows返回true,但oReader.GetValue(0)(或oReader.GetAnythingElse,對於這個問題)拋出一個錯誤:

System.InvalidOperationException: Invalid attempt to read when no data is present.

的事情,真的絆倒不過,如果我撥打oReader.GetOrdinal("SystemVersNo")oReader.GetName(0),他們都會返回正確的值。它是如何返回零的序數位置,但它不能找到一個值在該位置閱讀?如果我在SQL Server Management Studio中運行相同的查詢,那麼值就沒有問題了,所以我知道它在那裏。

我是全新的,我缺少一些基本的東西嗎?或者有什麼奇怪的事情發生。

謝謝!

回答

5

的問題是,你有沒有在當時設定移動到第一條記錄。

if (oReader.HasRows) 
{ 
    oCustomer.SRVNo = oReader.GetValue(0).ToString(); 
} 

應該

if (oReader.Read()) 
{ 
    oCustomer.SRVNo = oReader.GetValue(0).ToString(); 
} 

斷言至少有一個記錄讀取,並在同一時間,移動到該記錄從獲取數據。

+0

啊我看到了,我沒有意識到'Read()'方法實際上讓讀者向前移動,而不是僅僅返回它是否可以,我不認爲這是必要的,因爲我不需要一個循環。謝謝! –

1

你已經忘記

while(oReader.Read()) 
{ // do stuff}