【问题标题】:Accessing a database using c# and Visual Studio design-time dataset使用 c# 和 Visual Studio 设计时数据集访问数据库
【发布时间】:2012-09-20 11:16:26
【问题描述】:

我见过很多使用 C# 访问数据库的方法,我不知道哪种方法最适合简单的读/写/操作数据。我过去只使用通用 DataSet/DataTable 对象,但我正在尝试使用更多类型安全的结构。我首先在 Visual Studio 中添加数据集 (xsd) 并连接到 SQL Server 后端。

我正在尝试查询在表中搜索给定字符串的列,但该列不是主键(所以我不能使用 .Find())。我该怎么做呢?我需要使用 LINQ 还是可以使用扩展方法/lambda 表达式?

在更基本的层面上,在使用设计时数据集时,我需要使用表适配器来填充我使用的数据集中的每个表,还是我只是实例化数据集?文档让我有点困惑。

【问题讨论】:

  • 有什么理由不能只在tableadapter中使用参数查询来定位想要的行,而不是先拉取所有数据再定位?

标签: c# dataset visual-studio-2012 strongly-typed-dataset


【解决方案1】:

您可以使用Linq-To-DataSet,这是查询DataSet的最强大的方式(不是在效率方面,而是在可读性和可维护性方面)。

阅读更多:Querying Typed DataSets

您可以选择在 VS 设计器上创建 TableAdapter 或仅创建 DataTable。如果添加 TableAdapter VS 也会创建相应的 DataTable。如果只添加 DataTable,则必须提供自己的填充方式。 TableAdapters 类似于 ADO.NET 中的 DataAdapter

因此,如果您创建了一个名为 DataSet1 的 DataSet 并添加了一个选择名为 tabData 的表的 TableAdapter,Visual Studio 将自动在命名空间中创建一个名为 tabDataDataTable 的 DataTable 和一个名为 tabDataTableAdapterTableAdapter DataSet1TableAdapters.

所以你可以这样填写这张表:

var dataSet = new DataSet1();
var da = new DataSet1TableAdapters.tabDataTableAdapter();
da.Fill(dataSet.tabData);

假设表有NameAge列,并且你想查找名称以"Jon"开头并且年龄> 30的所有行,你可以使用LINQ的Where

var jons = dataSet.tabData
                  .Where(r => r.Name.StartsWith("Jon") && r.Age > 30);
foreach (DataSet1.tabDataRow row in jons)
{
    Console.WriteLine("{0} is {1} years old", row.Name, row.Age);
}

请注意,您可以使用安全的 LINQ-To-DataSet 类型(r.Name 是字符串,r.Age 是 int)。

【讨论】:

  • 这看起来是从数据库中读取数据的好方法。可以使用 Link to DS 将数据推送到数据库吗?那篇文章似乎没有直接解决这个问题。
  • @FistOfFury:如果你想要一个真正的 ORM 映射器,你可以使用 Linq-To-SqlLinq-To-EnititesLinq-To-DataSet 只是 Linq-To-Objects 的一个子集,它有助于查询已经在内存中的对象。您当然可以使用DataAdapterDataTable 更新数据库。但那是 ADO.NET,与 Linq 没有直接关系。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-11
  • 1970-01-01
  • 1970-01-01
  • 2012-04-09
  • 2011-12-26
  • 2013-02-06
  • 2011-02-08
相关资源
最近更新 更多