【发布时间】: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