2008-11-20 3 views
2

При запуске следующего кода он оставляет одну строку. Когда я делаю files.Count, он говорит, что есть 4 строки, но нет данных, хранящихся для 4-й строки. Когда я запускаю хранимую процедуру из SQL Manager, он возвращает все 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] 
} 

Это не сработает. Помните, что индексирование основано на 0 на C#.

В качестве примечания, вы можете избавиться от вашей попытки поймать 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; 
     } 
    } 
} 

используя заявление будет гарантировать удаление (и, следовательно, закрытие) читателю и связи.

+0

Thanks Marc, поскольку код gen я больше не пишу это вручную. – 2008-11-20 08:59:15

+0

+1 причина, по которой это кажется мне наиболее вероятным – 2008-11-20 09:18:52

1

Вы пробовали пройти через это в отладчике и проверить свои параметры команды перед тем, как запустить программу чтения? Получаете ли вы те же значения в наборе результатов, что и при запуске sproc direct на sql?

Я мог ошибаться, потому что есть несколько способов сделать это, но что-то выглядит немного странным в том, как вы добавляете параметры в команду.

Я обычно использую шаблон больше как:

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

в основном о том, что работает для вас ....

Большую часть времени, что у меня были проблемы с sprocs, когда я pooched параметры.

1

Код выглядит верным для меня. Я думаю, вы определенно захотите пройти через отладчик, чтобы узнать, сколько строк возвращается из ExecuteReader. Один комментарий у меня есть, что «if (dr.HasRows)» является излишним, поскольку «while (dr.Read())» даст вам тот же эффект.

Другой вопрос, который я хотел бы знать, если вам не хватает первой или последней записи?

Brian

2

Вы должны канаву «если (dr.HasRows)», все это делает дублируют проверку в то время цикла.

Вы никогда не должны звонить Close на соединение и не должны устанавливать его в null. Вместо этого вы должны обернуть соединение в «используя» блок, как так:

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

То же самое можно сказать для вас чтения данных и SQL Command.

Этот следующий бит ничего не делает, удалите его.

catch (Exception) { throw; }    

 Смежные вопросы

  • Нет связанных вопросов^_^