Я использую следующую универсальную функцию хелпера данных для запуска запросов и возврата их в виде коллекции 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
Я закончил с использованием ваше предложение вернуть IDataRecord вместо DbDataRecord. Одна из проблем, с которыми я столкнулась, заключалась в том, что мне пришлось удалить инструкцию using из MySqlConnection Connection = CreateConnection() и MySqlDataReader Reader = cmd.ExecuteReader(). Я понимаю, что читатель уничтожается, как только я выхожу из инструкции using, но поскольку я назначил вывод читателя в IDataRecord, я думал, что он сохранит его. Вся моя цель - вернуть IDataRecord или DBDataRecord, потому что они остаются в живых после закрытия соединения. –
@LouiseEggleton: Я бы предложил создать собственный класс, который создаст экземпляр в методе и вернет его. Это гораздо более значимый и поддерживаемый (но также и больше). Если вам нужен общий объект в памяти, вы можете вместо этого вернуть DataRow. Тем не менее, я бы всегда закрывал/удалял 'DataReader' /' Command'/'Connection' как можно скорее с помощью' using'-statement. –
Тим, я намерен поместить это в класс, а также некоторые другие методы БД. На данный момент я просто пытался заставить мои общие методы запросов работать, поэтому у меня не получилось так далеко. Я использую Reader = cmd.ExecuteReader (CommandBehavior.CloseConnection), чтобы закрыть соединение, но я до сих пор не понимаю, почему, если я назначаю вывод Reader в переменную IDataRecord, почему переменная IDataRecord уничтожается при выходе из инструкции using. –