Заполните массив (или arraylist) от SqlDataReader

mysql_ *, официально устарел с PHP v5.5.0 и будет удален в будущем.

Используйте функцию mysqli _ * или pdo

Прочитать Oracle Преобразование в MySQLi

23
задан ristonj 2 September 2009 в 22:47
поделиться

6 ответов

Возможно. В .NET 2.0+ SqlDataReader наследуется от DbDataReader , который реализует IEnumerable (неуниверсальный). Это означает, что вы можете использовать LINQ:

List<string> list = (from IDataRecord r in dataReader
                     select (string)r["FieldName"]
                    ).ToList();

Тем не менее, цикл все еще существует, он просто скрыт в Enumerable.Select , вместо того, чтобы быть явным в вашем коде.

49
ответ дан 28 November 2019 в 22:28
поделиться

Очевидно, с тех пор .NET 1.1 SqlDataReader имел следующий метод :

int size;
object[] data = new object[]{};
size = reader.GetValues(data);

Это заполняет data значениями текущей строки читателя, присваивая размер количество объектов, которые были помещены в массив.

6
ответ дан JNF 28 November 2019 в 22:28
поделиться

Вы должны сделать цикл, но есть проекты, которые могут сделать его проще. Кроме того, старайтесь не использовать ArrayList, вместо этого используйте List.

Вы можете оформить заказ на FluentAdo для одного: http://fluentado.codeplex.com

    public IList<UserAccount> List()
    {
        var list = new FluentCommand<UserAccount>("SELECT ID, UserName, Password FROM UserAccount")
            .SetMap(reader => new UserAccount
            {
                ID = reader.GetInt("ID"),
                Password = reader.GetString("Password"),
                UserName = reader.GetString("UserName"),
            })
            .AsList();

        return list;
    }
0
ответ дан Chris Brandsma 28 November 2019 в 22:28
поделиться

Нет, поскольку SqlDataReader является потоком строк из базы данных SQL Server, доступным только для чтения, поток строк будет циклически повторяться, явно ли в вашем коде или скрытые в реализации фреймворка (например, метод DataTable Load ).

Похоже, использование общего списка с последующим возвратом списка в виде массива было бы хорошим вариантом. Например,

List<int> list = new List<int>();

using (SqlDataReader reader = cmd.ExecuteReader())
{
    while (reader.Read())
    {
         list.Add(reader.GetInt32(0));
    }    
}
return list.ToArray();

В ответ на ваш комментарий вызов ToArray () может быть накладным, это зависит. Вам нужен массив объектов для работы или общая коллекция (например, List или ReadOnlyCollection ) будет более полезной?

11
ответ дан 28 November 2019 в 22:28
поделиться

Поскольку любая реализация IDataReader (включая SqlDataReader ) будет считывать только вперед по определению, нет способа сделать это без цикла . Даже если бы для этого существовал метод библиотеки фреймворка, он должен был бы проходить через программу чтения, как и вы.

4
ответ дан 28 November 2019 в 22:28
поделиться

Если вы читаете свой SqlDataAdapter в DataTable:

DataTable dt as DataTable; 
dt.fill(data);

Тогда вы можете использовать некоторые игрушки из System.Data.DataSetExtensions , как указано в ответе Джоэла Мюллера на это вопрос.

Если используется немного Linq, вы получите .NET 3.5 или выше.

1
ответ дан 28 November 2019 в 22:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: