【问题标题】:Reading DataSet读取数据集
【发布时间】:2011-09-18 14:03:07
【问题描述】:

如何在 WPF 中从 DataSet 中读取数据?我有一个只有 2 列的火车时刻表,我希望能够读取出发时间并计算下一班火车的出发时间。例如,现在时间是 12:29,我的应用程序应该告诉我下一班火车将在 12:33 发车。

我已经左右搜索过了。我在 .NET 3.5 上。

【问题讨论】:

  • 这里的主要问题是:你在哪里阅读这个数据集?在代码中?在 XAML 中?在数据网格中?在列表视图中?
  • 如果回复回答了您的问题,您应该将其标记为已接受的答案。

标签: c# .net wpf ado.net dataset


【解决方案1】:

DataSet 类似于数据库。 DataTable 类似于数据库表,DataRow 类似于表中的记录。如果您想添加过滤或排序选项,请使用 DataView 对象执行此操作,并将其转换回单独的 DataTable 对象。

如果您使用数据库来存储数据,那么您首先将数据库表加载到内存中的 DataSet 对象中。您可以将多个数据库表加载到一个DataSet 中,并通过DataTable 对象从DataSet 中选择要读取的特定表。随后,您通过 DataRowDataTable 中读取特定的数据行。以下代码演示了步骤:

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();

【讨论】:

  • 非常有用且易于理解的解释。有些人只是想得清晰简洁,它就显示出来了。谢谢。
  • 作为另一个阅读本文的 C# 菜鸟,我很兴奋,直到我尝试实际编写 DataTable。经过一番寻找,我发现我需要一个using System.Data; 声明。
  • 程序实际上是在哪一步从数据库中获取数据的?
  • 实例化 SqlCommand 对象时解析 SQL 查询,并使用来自 connString 的连接信息访问数据库。
  • @KMC 如果有join语句,那么哪一个是正确的表?每个表有多少次相同的记录?
【解决方案2】:

如果 ds 是 DataSet,您可以通过以下方式访问第一个表中第一行的 CustomerID 列:

DataRow dr = ds.Tables[0].Rows[0];
Console.WriteLine(dr["CustomerID"]);

【讨论】:

    【解决方案3】:

    如果这是来自 SQL Server 数据库,您可以发出这种查询...

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

    GetDate() 也可以使用,不确定日期是如何存储的。

    我不确定数据是如何存储和/或读取的。

    【讨论】:

      【解决方案4】:

      TL;DR: - 从数据集中获取数据表并从 rows 属性中读取。

                  DataSet ds = new DataSet();
                  DataTable dt = new DataTable();
                  DataColumn col = new DataColumn("Id", typeof(int));
                  dt.Columns.Add(col);
                  dt.Rows.Add(new object[] { 1 });
                  ds.Tables.Add(dt);
      
                  var row = ds.Tables[0].Rows[0];
                  //access the ID column.  
                  var id = (int) row.ItemArray[0];
      

      DataSet 是从数据库访问的数据的副本,但根本不需要使用数据库。不过,这是首选。

      请注意,如果您正在创建新应用程序,请考虑使用 ORM,例如实体框架或 NHibernate,因为不再首选数据集;但是,它们仍然受到支持,据我所知,它们不会很快消失。

      如果您从标准数据集读取,那么@KMC 的答案就是您要寻找的。但是,执行此操作的正确方法是创建一个强类型数据集并使用它,以便您可以利用 Intellisense。假设您没有使用实体框架,请继续。

      如果您还没有专门的数据访问层空间,例如项目或 App_Data 文件夹,我建议您现在创建一个。否则,在您的数据项目文件夹下进行如下操作: 添加 > 添加新项目 > 数据集。创建的文件将具有 .xsd 扩展名。

      然后您需要创建一个数据表。创建一个 DataTable(单击文件,然后右键单击设计窗口 - 该文件具有 .xsd 扩展名 - 然后单击 Add > 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
      

      上面的示例假设您的强类型数据集有一个名为 NextTrainDepartureTime 的 DateTime 类型的列。希望对您有所帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-08-11
        • 1970-01-01
        • 1970-01-01
        • 2014-04-01
        • 2016-09-27
        • 2014-05-18
        • 1970-01-01
        相关资源
        最近更新 更多