Чтение DataSet - PullRequest
       5

Чтение DataSet

42 голосов
/ 20 июня 2011

Как мне прочитать данные из DataSet в WPF? У меня есть таблица расписания поездов всего с 2 столбцами, и я хочу иметь возможность прочитать время отправления и рассчитать, когда следующий поезд отправляется. Например, сейчас время 12:29, и в моем заявлении должно быть указано, что следующий поезд отправится в 12:33.

Я уже гуглил влево и вправо. Я на .NET 3.5.

Ответы [ 4 ]

100 голосов
/ 20 июня 2011

DataSet напоминает базу данных. DataTable напоминает таблицу базы данных, а DataRow напоминает запись в таблице. Если вы хотите добавить параметры фильтрации или сортировки, то вы делаете это с DataView объектом и конвертируете его обратно в отдельный DataTable объект.

Если вы используете базу данных для хранения ваших данных, вы сначала загружаете таблицу базы данных в объект DataSet в памяти. Можно загрузить несколько таблиц базы данных в один DataSet и выбрать конкретную таблицу для чтения из объекта DataSet - DataTable . Впоследствии вы читаете определенную строку данных из вашей DataTable до DataRow . Следующие коды демонстрируют шаги:

SqlCeDataAdapter da = new SqlCeDataAdapter();
DataSet ds = new DataSet();
DataTable dt = new DataTable();

da.SelectCommand = new SqlCommand(@"SELECT * FROM FooTable", connString);
da.Fill(ds, "FooTable");
dt = ds.Tables["FooTable"];

foreach (DataRow dr in dt.Rows)
{
    MessageBox.Show(dr["Column1"].ToString());
}

Чтобы прочитать определенную ячейку в строке:

int rowNum // row number
string columnName = "DepartureTime";  // database table column name
dt.Rows[rowNum][columnName].ToString();
20 голосов
/ 20 июня 2011

Если ds является DataSet, вы можете получить доступ к столбцу CustomerID первой строки в первой таблице с помощью чего-то вроде:

DataRow dr = ds.Tables[0].Rows[0];
Console.WriteLine(dr["CustomerID"]);
1 голос
/ 22 марта 2016

DataSet - это копия данных, доступ к которым осуществляется из базы данных, но даже не требует использования базы данных.Однако предпочтительно.

Обратите внимание, что если вы создаете новое приложение, рассмотрите возможность использования ORM, такого как Entity Framework или NHibernate, поскольку наборы данных больше не являются предпочтительными;однако они все еще поддерживаются и, насколько я могу судить, не уходят в ближайшее время.

Если вы читаете из стандартного набора данных, то ответ @ KMC - это то, что вы ищете.Тем не менее, правильный способ сделать это - создать строго типизированный набор данных и использовать его, чтобы вы могли воспользоваться Intellisense.Предполагая, что вы не используете Entity Framework, продолжайте.

Если у вас еще нет выделенного пространства для слоя доступа к данным, такого как проект или папка App_Data, я предлагаю вам создать его сейчас.В противном случае выполните следующие действия в папке проекта данных: Добавить> Добавить новый элемент> Набор данных.Созданный файл будет иметь расширение .xsd.

Затем вам нужно будет создать DataTable.Создайте DataTable (щелкните файл, затем щелкните правой кнопкой мыши окно дизайна - файл имеет расширение .xsd - и выберите «Добавить»> «DataTable»).Создайте несколько столбцов (щелкните правой кнопкой мыши по таблице данных, которую вы только что создали> Добавить> Столбец).Наконец, вам нужен настольный адаптер для доступа к данным.Вам потребуется настроить соединение с вашей базой данных для доступа к данным, на которые есть ссылки в наборе данных.

После того, как вы закончите, после успешной ссылки на DataSet в вашем проекте (с помощью оператора), вы можете получить доступ к DataSet с помощью intellisense,Это делает это намного проще, чем нетипизированные наборы данных.

Когда это возможно, используйте наборы данных со строгой типизацией вместо нетипизированных.Хотя это больше работы для создания, в конечном итоге это сэкономит вам много времени с IntelliSense.Вы можете сделать что-то вроде:

MyStronglyTypedDataSet trainDataSet = new MyStronglyTypedDataSet();
DataAdapterForThisDataSet dataAdapter = new DataAdapterForThisDataSet();
//code to fill the dataset 
//omitted - you'll have to either use the wizard to create data fill/retrieval
//methods or you'll use your own custom classes to fill the dataset.
if(trainDataSet.NextTrainDepartureTime > CurrentTime){
   trainDataSet.QueueNextTrain = true; //assumes QueueNextTrain is in your Strongly-Typed dataset
}
else
    //do some other work

В приведенном выше примере предполагается, что ваш строго типизированный набор данных имеет столбец типа DateTime с именем NextTrainDepartureTime.Надеюсь, это поможет!

1 голос
/ 20 июня 2011

Если это из базы данных SQL Server, вы можете выполнить такой запрос ...

Select Top 1 DepartureTime From TrainSchedule where DepartureTime > 
GetUTCDate()
Order By DepartureTime ASC

GetDate() также может использоваться, не знаю, как хранятся даты.

Я не уверен, как данные хранятся и / или читаются.

...