【问题标题】:DataAdapters against Typed DataSets = SQL Schema nightmares针对类型化数据集的数据适配器 = SQL 架构噩梦
【发布时间】:2010-10-17 04:52:46
【问题描述】:

我看到很多参考资料说 TableAdapter 很弱而且很愚蠢,而且任何真正的开发人员都会使用 DataAdapter。我不知道这是否属实,但我正在探索这个问题,并强调整个 'DataAdapter/TableAdapter 对抗 Typed DataSets' 的气味有多糟糕。

让我试着解释一下……

假设我在 xsd 文件中有我的 Typed DataSet 定义,现在我准备在代码中创建一个针对该架构的 DataAdapter...(顺便说一下,我正在使用 OleDb 访问独立的 .dbf文件夹中的文件...这里没有可调用的 SQL Server 存储过程,只是普通的旧原始表,准备好执行操作。)

从我目前的研究来看,这是我如何看待 DataAdapter 与 Typed DataSet 一起使用的。告诉我我是否错了。 (最后我有我的大抱怨/问题。)

public DataTable GetJobsByCustomer(string CustNo)
{
    OleDbConnection conn1 = new OleDbConnection(dbConnectionString);
    conn1.Open();

    LMVFP ds1 = new LMVFP(); //My Typed DataSet

    string sqlstring = @"SELECT act_compda, contact, cust_num, est_cost, invoiced, job_hours,
                        job_invnum, job_num, job_remark, job_start, mach_cost, mat_cost, mat_mkup,
                        p_o_num, priority, quote_no, quoted_by, ship_date, ship_info, shop_notes, status, total_cost
                        FROM job_info
                        WHERE (cust_num = ?) AND (status = 'A')
                        ORDER BY priority";

    OleDbDataAdapter JobsAdapter = new OleDbDataAdapter(sqlstring,conn1);
    JobsAdapter.SelectCommand.Parameters.Add("?", OleDbType.VarChar,6).Value=CustNo;

    JobsAdapter.Fill(ds1, "Jobs"); // A table schema in the Typed DataSet

    return ds1.Jobs;

}

是这样的吗?它确实有效,所以这很好。确实,强类型行为很棒。

现在,我的抱怨......你的意思是告诉我,我已经在我的 DAL 方法 (GetJobsByCustomer) 中维护了相同的 exaxt SQL 语法以匹配 xsd 中表的架构?在我的手工编码的 SQL 和 xsd 模式之间进行如此多的维护和分离真是太疯狂了。根本没有错误,因为您正在编写文本字符串!您可以在运行时了解它是否有效。

当您在代码中键入所有 SQL 时,必须来回查看以使您的编码 SQL 与 xsd 表架构保持同步,这很糟糕。

我肯定错过了什么。

真是一场闹剧。类型化的数据集可以与漂亮的智能感知一起使用,因为它是从模式生成的,但是归根结底,编写与类型化模式匹配的 SQL 只是一件痛苦的事。他们所做的只是将头痛转移到一个新的领域。

请告诉我,我在这里遗漏了一些可以让事情变得更好的东西。

【问题讨论】:

  • 我知道这是几年前的事了,但对于通过这种方式的其他人来说——使用设计师你不需要做任何这些。您无需处理 xsd 文件,您的 SQL 将是 tableadapter 中的一个或多个参数查询。类型化的数据集和表格适配器并不像他们在 SO 上的代表所暗示的那样糟糕——只是似乎没有人知道如何正确使用它们!

标签: strongly-typed-dataset dataadapter


【解决方案1】:

我不相信你错过了什么;维护这种类型的代码从来都不是一件有趣的事情。幸运的是,我们现在拥有 LINQ to SQL 和 Entity Framework,它们都可以减少使模型对象与数据库保持同步所需的手动代码维护量。

【讨论】:

    【解决方案2】:

    我赞同 Adam 对 LINQ to SQL 和 EF 的赞赏,但我认为这对您来说(目前)还不是一个选择,因为缺乏对第三方 DBMS 的支持。另一方面,第三方 ORM(例如 NHibernate)可能是一种选择。

    也许我没有给予足够的关注,但我不知道有什么好的理由避免使用 TableAdapters 与 DataAdapters。你有一两个链接吗?

    【讨论】:

    • 我认为 TableAdapters 的大惊小怪可能与联接有关? TA 可以只写一个表,而 DA 可以处理连接的表吗?
    • 这里有一些关于为什么不能轻易在 TableAdapters 中使用 Joins 的问题,如果需要更新:asp.net/learn/data-access/tutorial-01-cs.aspx 阅读第 5 步中的所有废话。味道不好?
    • DataAdapter 和 TableAdapter 都设计为与一个“DataTable”一起工作。是否可以更新多个 DBMS 表取决于适配器的配置方式和/或 DBMS 的功能。
    • @MattSlay:这篇文章提到了 TableAdapters 的一个问题,但我不明白使用 DataAdapter 会如何使它变得更好。
    • @Daniel:同意。在这方面,两者都不是无痛的。
    猜你喜欢
    • 2011-02-11
    • 2011-01-18
    • 1970-01-01
    • 2021-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多