2008-11-20 74 views
2

運行以下代碼時,它會留下一行。當我做一個files.Count它說有4行,但沒有數據存儲的第四行。當我從SQL管理器中運行存儲過程時,它將返回所有4行和所有數據。任何幫助?SQL DataReader在循環中缺少一行

  List<File> files = new List<File>(); 
      SqlConnection active_connection = new SqlConnection(m_connection_string); 
      SqlCommand cmd = new SqlCommand(); 
      SqlDataReader dr = null; 

      try 
      { 
       active_connection.Open(); 
       cmd.Connection = active_connection; 
       cmd.CommandType = CommandType.StoredProcedure; 
       cmd.CommandText = "dalsp_Select_Organization_Files"; 

       SqlParameter param; 

       param = cmd.Parameters.Add("@p_organization_guid", SqlDbType.UniqueIdentifier); 
       param.Value = new Guid(organization_guid); 

       param = cmd.Parameters.Add("@p_file_type", SqlDbType.NVarChar, 50); 
       param.Value = file_type; 

       dr = cmd.ExecuteReader(CommandBehavior.CloseConnection); 

       if (dr.HasRows)      
       {      
        while (dr.Read()) 
        { 
         File file = new File(); 
         file.OrganizationGuid = dr["OrganizationGuid"].ToString(); 
         file.FileGuid = dr["FileGuid"].ToString(); 
         file.FileLocation = dr["FileLocation"].ToString(); 
         file.FileName = dr["FileName"].ToString(); 
         file.FileType = (FileTypeEnum)Enum.Parse(typeof(FileTypeEnum), dr["FileType"].ToString()); 
         file.FileExtension = dr["FileExtension"].ToString(); 
         file.FileDescription = dr["FileDescription"].ToString(); 
         file.ThumbnailPath = dr["ThumbnailPath"].ToString(); 
         files.Add(file); 
        }  
       } 
       dr.Close(); 
       dr = null; 

       active_connection.Close(); 
       cmd = null; 

      } 
      catch (Exception) 
      { 
       throw; 
      } 
      finally 
      { 
       if (active_connection.State != ConnectionState.Closed) 
       { 
        active_connection.Close(); 
        active_connection.Dispose(); 
       } 
      } 

      return files; 

回答

5

如果你說你的文件集合有4個項目,但4個項目不包含任何值,那麼你的意思是什麼?它是否爲空,對象是否沒有數據,或者是否將索引超出範圍異常?

你正在做一個文件[4]或類似以下的東西?

for(int x = 1; x < files.length; x++) 
{ 
    files[x] 
} 

這是行不通的。在C#中記住基於0的索引。

作爲一個側面說明,你可以通過執行類似弄死你嘗試捕捉statments:

using (SqlConnection connection = new SqlConnection(conn_string)) 
{ 
    connection.Open(); 
    using (SqlCommand cmd = new SqlCommand("SELECT * FROM MyTable", connection)) 
    { 
     using (SqlDataReader dr = cmd.ExecuteReader()) 
     { 
      return result; 
     } 
    } 
} 

using語句將保證讀寫器和連接處理(並因此關閉)。

+0

謝謝馬克,因爲代碼我不用手寫這個了。 – 2008-11-20 08:59:15

+0

+1引起這似乎最有可能對我來說 – 2008-11-20 09:18:52

1

您是否嘗試在調試器中逐步完成此操作,並在執行讀取器之前檢查您的命令參數?你是否在結果集中獲得與在sql上直接運行sproc直接相同的值?

我可能是錯的,因爲有幾種方法可以做到這一點,但是在將命令添加到命令中的方式看起來有些扭曲。

我通常使用的模式更像是:

SqlParameter param = new SqlParameter(); 
// set param stuff - here or in ctor 
cmd.Parameters.Add(param); 

主要是關於你的作品....

大多數,我曾與存儲過程的問題時代的是,當我pooched的參數。

1

該代碼看起來對我來說是正確的。我想你肯定會想通過一個調試器來查看從ExecuteReader返回的行數。我的一個意見是,「if(dr.HasRows)」有點多餘,因爲「while(dr.Read())」會給你同樣的效果。

我會有的另一個問題是,你知道如果你錯過了第一個或最後一個記錄?

布賴恩

2

你應該拋棄「如果(dr.HasRows)」,它的作用是複製在while循環檢查。

您不應該在連接上調用Close,也不應將其設置爲null。相反,您應該將連接包裝在「使用」塊中,如下所示:

using (SqlCommand cmd = new SqlCommand()) { 
    //use the connection 
} 

對於您的數據讀取器和SQL命令也是如此。

這下一個位什麼也不做,刪除它。

catch (Exception) { throw; }