Я пытаюсь получить записи из базы данных Azure с помощью Ado.net. Для этого я использовал класс SqlDataReader. Несмотря на то, что выборка данных прошла успешно, я не знаю, как преобразовать ее в общий список.
protected List<T> GetList<T>()
{
try
{
using (var query = ExecuteReader())
{
// What Goes Here ?
}
}
finally
{
if (_sqlCommand.Connection.State == ConnectionState.Open)
{
_sqlCommand.Connection.Close();
}
}
}
метод ExecuteReader,
protected SqlDataReader ExecuteReader()
{
if (_sqlCommand.Connection.State != ConnectionState.Open)
{
_sqlCommand.Connection.Open();
}
return _sqlCommand.ExecuteReader();
}
Модель данных,
public class Student
{
[EntityKey]
public int StudentId { get; set; }
public string Name { get; set; }
public int Age { get; set; }
public string Major { get; set; }
}
ПРИМЕЧАНИЕ: Я хотел бы знать, есть ли другие простые способы
🤔 А знаете ли вы, что...
С C# можно разрабатывать мобильные приложения для платформы Android с использованием Xamarin.
while (query.Read())
{
Console.WriteLine($"First column {query[0]}");
Console.WriteLine($"Named column {query["put a columnname here"]}");
}
Read() даст вам первую и следующую строки.
SqlDataReader — это не контейнер, это курсор, используемый для загрузки данных. Его нельзя преобразовать в любой тип контейнера. Код приложения должен использовать его для загрузки результатов, а затем создавать объекты и помещать их в список. Это описано в документах ADO.NET, например, в Получение данных с помощью DataReader:
var list=new List<Student>();
if (reader.HasRows)
{
while (reader.Read())
{
var student=new Student();
student.Id=reader.GetInt32(0);
student.Name = reader.GetString(1));
...
}
}
else
{
Console.WriteLine("No rows found.");
}
Это много шаблонов, поэтому ORM, такие как Entity Framework, или микро-ORM, такие как щеголеватый, используются для выполнения запросов и сопоставления результатов с объектами.
Используя Dapper, весь этот код можно заменить на:
var sql = "Select * from Students where Major=@major";
var students=connection.Query<Student>(sql,new {major = "Computer Science"});
Dapper создаст параметризованный запрос с параметром @major
, выполнит его, создаст объекты Student
из результатов и вернет их в виде IEnumerable<Student>
. Он даже заботится об открытии и удалении соединения.
Dapper использует Reflection для определения свойств типа, использует их имена для загрузки правильных полей и присваивает их создаваемым объектам.
var dt=new DataTable();
dt.Load(myDataReader);
list<DataRow> dr=dt.AsEnumerable().ToList();
ИЛИ
public DataReaderToListModel()
{
StudentList = new ObservableCollection<StudentModel>();
LoadData();
}
public ObservableCollection<StudentModel> StudentList { get; set; }
#region Varible declarations
private SqlConnection _sqlConnection;
private SqlCommand _sqlCommand;
private SqlDataReader _sqlDataReader;
private string _strsqlcommand;
#endregion
#region Method for Getting the data from Database
public void LoadData()
{
try
{
// Connection Strings
// Connecting to DB
_sqlConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["ConString"].ConnectionString);
if (_sqlConnection.State != ConnectionState.Open)
_sqlConnection.Open();
_strsqlcommand = "Your Query";
_sqlDataReader = _sqlCommand.ExecuteReader();
var studentmodellist = new ObservableCollection<StudentModel>();
while (_sqlDataReader.Read())
{
var studentModel = new StudentModel
{
StudentId = _sqlDataReader.GetInt32(_sqlDataReader.GetOrdinal("StudentId ")),
Name= _sqlDataReader.GetString(_sqlDataReader.GetOrdinal("Name")),
Age= _sqlDataReader.GetInt32(_sqlDataReader.GetOrdinal("Age")),
Major = _sqlDataReader.GetString(_sqlDataReader.GetOrdinal("Major"))
};
studentmodellist.Add(studentModel);
}
StudentList = studentmodellist;
_sqlConnection.Close();
}
catch (Exception exception)
{
MessageBox.Show("DataLoading Failed beacause of following Reason \n" + exception.Message, "Error", MessageBoxButton.OK, MessageBoxImage.Error);
}
}
#endregion
Пожалуйста, обратитесь к ТАК нить для получения дополнительной информации.