用架构填充DataSet
当用数据填充DataSet时,DataAdapter.Fill方法使用DataSet的现有架构,并使用从SelectCommand返回的数据填充它。如果在DataSet中没有表名与要被填充的表名相匹配,Fill方法就会创建一个表。默认情况下,Fill仅定义列和列类型。
通过设置DataAdapter的MissingSchemaAction属性,可以重写Fill的默认行为。例如,要让Fill创建一个表架构,并且还包括主键信息、唯一约束、列属性、是否允许为空、最大列长度、只读列和自动增量的列,就要将DataAdapter.MissingSchemaAction指定为MissingSchemaAction.AddWithKey。或者,在调用DataAdapter.Fill前,可以调用DataAdapter.FillSchema来确保当填充DataSet时架构已到位。
对FillSchema的调用会产生一个到服务器的额外行程,用于检索附加架构信息。为了获得最佳性能,需要在调用Fill之前指定DataSet的架构,或者设置DataAdapter的MissingSchemaAction。
使用CommandBuilder的最佳实践
假设SelectCommand执行单一表SELECT,CommandBuilder就会以DataAdapter的SelectCommand属性为基础自动生成DataAdapter的InsertCommand、UpdateCommand、和DeleteCommand属性。下面是为获得最佳性能而使用CommandBuilder的一些技巧。
1) CommandBuilder的使用应该限制在设计时或即席方案中。生成DataAdapter命令属性所必需的处理会影响性能。如果预先知道INSERT/UPDATE/DELETE语句的内容,就显式设置它们。一个比较好的设计技巧是,为INSERT/UPDATE/DELETE命令创建存储过程并显式配置DataAdapter命令属性以使用它们。
2) CommandBuilder使用DataAdapter的SelectCommand属性确定其他命令属性的值。如果DataAdapter的SelectCommand本身曾经更改过,确保调用RefreshSchema以更新命令属性。
3) 如果DataAdapter命令属性为空(命令属性默认情况下为空),CommandBuilder仅仅为它生成一条命令。如果显式设置了命令属性,CommandBuilder不会重写它。如果希望CommandBuilder为以前已经设置过的命令属性生成命令,就将命令属性设置为空。
批处理SQL语句
很多数据库支持将多条命令合并或批处理成一条单一命令执行。例如,SQL Server使您可以用分号“;”分隔命令。将多条命令合并成单一命令,能减少到服务器的行程数,并提高应用程序的性能。例如,可以将所有预定的删除在应用程序中本地存储起来,然后再发出一条批处理命令调用,从数据源删除它们。
虽然这样做确实能提高性能,但是,当对DataSet中的数据更新进行管理时,可能会增加应用程序的复杂性。要保持简单,可能要在DataSet中为每个DataTable创建一个DataAdapter。
