mysql_ *, официально устарел с PHP v5.5.0 и будет удален в будущем.
Используйте функцию mysqli _ * или pdo
Прочитать Oracle Преобразование в MySQLi
Возможно. В .NET 2.0+ SqlDataReader
наследуется от DbDataReader
, который реализует IEnumerable
(неуниверсальный). Это означает, что вы можете использовать LINQ:
List<string> list = (from IDataRecord r in dataReader
select (string)r["FieldName"]
).ToList();
Тем не менее, цикл все еще существует, он просто скрыт в Enumerable.Select
, вместо того, чтобы быть явным в вашем коде.
Очевидно, с тех пор .NET 1.1 SqlDataReader
имел следующий метод :
int size;
object[] data = new object[]{};
size = reader.GetValues(data);
Это заполняет data
значениями текущей строки читателя, присваивая размер количество объектов, которые были помещены в массив.
Вы должны сделать цикл, но есть проекты, которые могут сделать его проще. Кроме того, старайтесь не использовать 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;
}
Нет, поскольку 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
) будет более полезной?
Поскольку любая реализация IDataReader
(включая SqlDataReader
) будет считывать только вперед по определению, нет способа сделать это без цикла . Даже если бы для этого существовал метод библиотеки фреймворка, он должен был бы проходить через программу чтения, как и вы.
Если вы читаете свой SqlDataAdapter в DataTable:
DataTable dt as DataTable;
dt.fill(data);
Тогда вы можете использовать некоторые игрушки из System.Data.DataSetExtensions
, как указано в ответе Джоэла Мюллера на это вопрос.
Если используется немного Linq, вы получите .NET 3.5 или выше.