一个绝对的初学者问题:如何从WPF中的DataSet读取数据?我有一个只有2列的火车时刻表,我希望能够读取出发时间并计算下一班火车何时离开。例如,现在的时间是12:29,我的申请应该告诉我下一班火车将在12:33离开。
我已经用Google搜索了左右。我在.NET 3.5上。
由于
答案 0 :(得分:100)
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();
答案 1 :(得分:20)
如果ds是DataSet,您可以使用以下内容访问第一个表中第一行的CustomerID列:
DataRow dr = ds.Tables[0].Rows[0];
Console.WriteLine(dr["CustomerID"]);
答案 2 :(得分:1)
如果这是来自SQL Server数据库,您可以发出此类查询...
Select Top 1 DepartureTime From TrainSchedule where DepartureTime >
GetUTCDate()
Order By DepartureTime ASC
也可以使用 GetDate()
,不确定日期的存储方式。
我不确定如何存储和/或读取数据。
答案 3 :(得分:1)
DataSet是从数据库访问的数据的副本,但根本不需要使用数据库。不过,这是首选。
请注意,如果要创建新应用程序,请考虑使用ORM,例如Entity Framework或NHibernate,因为DataSet不再是首选;然而,他们仍然受到支持,据我所知,不会很快消失。
如果您正在阅读标准数据集,那么@ KMC的答案正是您所寻找的。但是,正确的方法是创建一个强类型数据集并使用它,这样您就可以利用Intellisense。假设您没有使用实体框架,请继续。
如果您还没有专门用于数据访问层的空间,例如项目或App_Data文件夹,我建议您立即创建一个。否则,请在数据项目文件夹下进行以下操作: 添加>添加新项>数据集。创建的文件将具有.xsd扩展名。
然后,您需要创建一个DataTable。创建一个DataTable(单击该文件,然后右键单击设计窗口 - 该文件具有.xsd扩展名 - 并单击添加> DataTable)。创建一些列(右键单击刚刚创建的数据表>添加>列)。最后,您需要一个表适配器来访问数据。您需要设置与数据库的连接以访问数据集中引用的数据。
完成后,在成功引用项目中的DataSet(using语句)后,可以使用intellisense访问DataSet。这使得它比无类型数据集更容易。
如果可能,请使用强类型数据集而不是无类型数据集。尽管创建它还需要做更多的工作,但最终会通过智能感知为您节省大量时间。你可以这样做:
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
上面的示例假设您的Strongly-Typed DataSet有一个名为NextTrainDepartureTime的DateTime类型的列。希望有所帮助!