2013-02-06 52 views
1

我想從我的數據庫我的ASP.NET網站內返回的數據對象,這樣我可以訪問(例如)用戶ID。一旦客戶登錄對象返回。但是,我得到的錯誤:C#返回數據對象發行

'Invalid attempt to read when no data is present.' 

我已經完成了對數據庫的SQL查詢(執行我的存儲過程),它返回正確的信息,所以我知道它的存在。我只能推測,有什麼不對下面的方法:

using (SqlConnection sqlConn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString)) 
     { 
      using (SqlCommand sqlComm = new SqlCommand("Select_Customer_By_UserName_And_Password", sqlConn)) 
      { 
       sqlComm.Connection.Open(); 
       try 
       { 
        sqlComm.CommandType = CommandType.StoredProcedure; 
        sqlComm.Parameters.Add("@Username", SqlDbType.NVarChar, 25).Value = pUsername; 
        sqlComm.Parameters.Add("@Password", SqlDbType.NVarChar, 25).Value = pPassword; 

        using (SqlDataReader sqlDR = sqlComm.ExecuteReader(CommandBehavior.SingleRow)) 
        { 
         if (sqlDR.HasRows) 
         { 
          //Creating the new object to be returned by using the data from the database. 
          return new Customer 
          { 
           CustomerID = Convert.ToInt32(sqlDR["CustomerID"]) 
          }; 
         } 
         else 
          return null; 
        } 
       } 
       catch (Exception) 
       { 
        throw; 
       } 
       finally 
       { 
        sqlComm.Connection.Close(); 
       } 
      } 
     } 

回答

3

你需要調用sqlDR.Read(),否則「記錄指針」將指向一個記錄。 HasRows僅表示確實有可以讀取行。讀取每一行(或只是第一個),你需要調用Read一次性或分while循環。

例如:

if (reader.HasRows) 
{ 
    while (reader.Read()) 
     ... 
} 

您的代碼應閱讀:

using (SqlDataReader sqlDR = sqlComm.ExecuteReader(CommandBehavior.SingleRow)) 
{ 
    if (sqlDR.Read()) 
    { 
     //Creating the new object to be returned by using the data from the database. 
     return new Customer 
     { 
      CustomerID = Convert.ToInt32(sqlDR["CustomerID"]) 
     }; 
    } 
    else 
     return null; 
} 

順便說一句:恭喜使用using和參數化查詢!

+0

,完美的工作,謝謝! – ZeeeeeV

+0

快樂:-)隨意所接受,以紀念我的答案。 –