2014-01-08 2 views
1

Я использую следующую универсальную функцию хелпера данных для запуска запросов и возврата их в виде коллекции DbDataRecords.Single DBDataRecord From DataReader

public static IEnumerable<DbDataRecord> GetDataRecords(string Query, Dictionary<string, object> Parameters, CommandType CommandType = CommandType.Text) 
    { 
     using (MySqlConnection Connection = CreateConnection()) 
     { 
      using (MySqlCommand cmd = new MySqlCommand(Query, Connection)) 
      { 
       cmd.CommandType = CommandType; 

       foreach (var Parameter in Parameters) 
       { 
        cmd.Parameters.AddWithValue(Parameter.Key, Parameter.Value); 
       } 

       Connection.Open();  
       using (MySqlDataReader Reader = cmd.ExecuteReader()) 
       { 
        foreach (DbDataRecord record in Reader) 
        { 
         yield return record; 
        }   
       }      
       Connection.Close(); 
      } 
     } 
    } 

Это прекрасно работает для нескольких результатов, но я также хотел бы создать функцию, которая возвращает одну запись от читателя как единого DbDataRecord. Я не могу понять, как преобразовать одну строку из чтения в DbDataRecord. Вот то, что я до сих пор:

public static DbDataRecord GetDataRecord(string Query, Dictionary<string, object> Parameters, CommandType CommandType = CommandType.Text) 
    { 
     DbDataRecord Record = null; 

     using (MySqlConnection Connection = CreateConnection()) 
     { 
      using (MySqlCommand cmd = new MySqlCommand(Query, Connection)) 
      { 
       cmd.CommandType = CommandType; 

       foreach (var Parameter in Parameters) 
       { 
        cmd.Parameters.AddWithValue(Parameter.Key, Parameter.Value); 
       } 

       Connection.Open(); 
       using (MySqlDataReader Reader = cmd.ExecuteReader()) 
       { 
        if(Reader.Read() != false)       
        { 
         Record = ???; 
        }       
       } 
       Connection.Close(); 
      } 
     } 

     return Record; 
    } 

Я видел много примеров, которые показывают, как вернуть один столбец (ExecuteScalar), то есть не то, что я ищу. Я также знаю, как получить отдельные значения столбцов. Опять же, это не то, что я ищу.

В основном я хочу быть заменить следующий цикл по каждому элементу

foreach (DbDataRecord record in Reader) 
{ 
    yield return record; 
} 

с чем-то, что превращает одну строку для чтения в DbDataRecord

ответ

1

Вы можете вернуть IDataRecord вместо, что может быть достаточно, то вы можете верните MySqlDataReader напрямую. Или вы должны бросить его соответствующим образом:

Так что это не представляется возможным непосредственно:

Record = (DbDataRecord)Reader; 

, но таким образом:

Record = (DbDataRecord)(IDataRecord)Reader; 
+0

Я закончил с использованием ваше предложение вернуть IDataRecord вместо DbDataRecord. Одна из проблем, с которыми я столкнулась, заключалась в том, что мне пришлось удалить инструкцию using из MySqlConnection Connection = CreateConnection() и MySqlDataReader Reader = cmd.ExecuteReader(). Я понимаю, что читатель уничтожается, как только я выхожу из инструкции using, но поскольку я назначил вывод читателя в IDataRecord, я думал, что он сохранит его. Вся моя цель - вернуть IDataRecord или DBDataRecord, потому что они остаются в живых после закрытия соединения. –

+0

@LouiseEggleton: Я бы предложил создать собственный класс, который создаст экземпляр в методе и вернет его. Это гораздо более значимый и поддерживаемый (но также и больше). Если вам нужен общий объект в памяти, вы можете вместо этого вернуть DataRow. Тем не менее, я бы всегда закрывал/удалял 'DataReader' /' Command'/'Connection' как можно скорее с помощью' using'-statement. –

+0

Тим, я намерен поместить это в класс, а также некоторые другие методы БД. На данный момент я просто пытался заставить мои общие методы запросов работать, поэтому у меня не получилось так далеко. Я использую Reader = cmd.ExecuteReader (CommandBehavior.CloseConnection), чтобы закрыть соединение, но я до сих пор не понимаю, почему, если я назначаю вывод Reader в переменную IDataRecord, почему переменная IDataRecord уничтожается при выходе из инструкции using. –

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