ADO.NET还是比较常用的,于是我研究了一下ADO.NET,在这里拿出来和大家分享一下,希望对大家有用。如果在运行时动态指定 SelectCommand 属性(例如,通过接受用户提供的文本命令的查询工具),那么您可能无法在设计时指定适当的 InsertCommand、UpdateCommand 或 DeleteCommand。 如果您的 DataTable 映射到单个数据库表或者是从单个数据库表中生成的,那么您可以利用 ADO.NET DbCommandBuilder对象来自动生成 DbDataAdapter 的 DeleteCommand、InsertCommand 和 UpdateCommand。
为了能够自动生成命令,必须设置 SelectCommand 属性,这是最低要求。 由 SelectCommand 属性检索的表架构确定自动生成的 INSERT、UPDATE 和 DELETE 语句的语法。
#T#为了返回构造 INSERT、UPDATE 和 DELETE SQL 命令所需的元数据,DbCommandBuilder 必须执行 SelectCommand。 因此,必须额外经历一次到数据源的过程,这可能会降低性能。若要实现最佳性能,请显式指定命令而不是使用 ADO.NET DbCommandBuilder。SelectCommand 还必须至少返回一个主键或唯一列。 如果不存在任何主键和唯一列,则会生成 InvalidOperation 异常,并且不会生成命令。当与 DataAdapter 关联时,ADO.NET DbCommandBuilder会自动生成 DataAdapter 的 InsertCommand、UpdateCommand 和 DeleteCommand 属性(如果它们为空引用)。 如果某个属性已存在 Command,则使用现有 Command。
通过联接两个或更多个表来创建的数据库视图不会被视为单个数据库表。 在这种情况下,您无法使用 DbCommandBuilder 来自动生成命令;必须显式指定命令。 有关显式设置命令以将对 DataSet 的更新解析回数据源的信息,请参见使用 DataAdapter 更新数据源 (ADO.NET)。
您可能需要将输出参数映射回 DataSet 的更新行。 一项常见的任务是从数据源中检索自动生成的标识字段或时间戳的值。 默认情况下,DbCommandBuilder 不会将输出参数映射到更新行中的列。 在这种情况下,必须显式指定命令。 有关将自动生成的标识字段映射回插入行的列的示例,请参见检索标识或 Autonumber 值 (ADO.NET)。
更新和删除的开放式并发模型
为 UPDATE 和 DELETE 语句自动生成命令的逻辑基于“开放式并发” -- 即未锁定记录的编辑功能,其他用户或进程可以随时修改。 由于在从 SELECT 语句中返回某记录之后但在发出 UPDATE 或 DELETE 语句之前,该记录可能已被修改,所以自动生成的 UPDATE 或 DELETE 语句包含一个 WHERE 子句,指定只有在行包含所有原始值并且尚未从数据源中删除时,才会更新该行。 这样做的目的是为了避免覆盖新数据。当自动生成的 UPDATE 命令试图更新已删除或不包含 DataSet 中原始值的行时,该命令不会影响任何记录,并且会引发 DBConcurrencyException。
如果要使 UPDATE 或 DELETE 在不考虑原始值的情况下完成,必须为 DataAdapter 显式设置 UpdateCommand,而不依赖自动命令生成。