打印本文 打印本文 关闭窗口 关闭窗口
ADO.NET最佳实践(中)
作者:武汉SEO闵涛  文章来源:敏韬网  点击数1989  更新时间:2009/4/23 10:49:22  文章录入:mintao  责任编辑:mintao

        使用DataReader可以在你的应用程序中做以下事情:

        I.不需要缓存数据;

        II.处理太大而不能存储的数据;

        III.需要以只进、只读和快速方式一次性访问数据的。

    G.使用一个自定义的强有力的DataSet类型的好处

        通过创建一个继承于DataSet的子对象,你可以在运行期间执行类型检查和声明。当你有了一个确定的计划或者为你的DataSet有相关的结构,你就可以创建一个用行和列表述一个对象的DataSet。比如,你表露一个消费者对象的名字属性来取代表露消费者表的一行中的名字列。有关此节详细信息,请参考微软站点上的文章:Working with a Typed DataSet

    H.在自定义的DataSet中处理无效数据

        通过XSD语言检查你的DataSet确保你的DataSet适当地处理无效引用。nullValue注释使你把BBNull替换成别的字符,String.Empty;或者保留无效引用,抛出错误提示,提示将取决于你应用程序的上下文,默认情况是引用了无效字符。

    I.在DataSet中刷新数据

        如果你要从数据库刷新你的DataSet,使用DataAdapter.Fill,如果你的DataTable拥有主键,DataAdapter.Fill将根据主键匹配新的行,同时从数据库取值运用到已存在的行。除非已刷新行在再次刷新前被修改,否者它的RowState将会被设置为UnChanged。注意的是如果DataTable没有设置主键,你的DataSet有可能出现重复的值。如果你想从数据库刷新一个表并保留任何表中行的更改,那么你就要首先填充一个新表,然后利用preserveChanges等于true来合并那个DataTable到你的DataSet中去。

    J.在DataSet中搜索数据

        当你在一个DataSet中查询特殊标准的行时,利用索引查询将会增加你的查询性能。当你给一个DataTable设计主键时,索引同时也创建了。当你为一个DataTable创建DataView时,索引也同时创建了。以下是使用索引查询的一些情况:

        I.如果查询与DataTable中标识主键的列顺序相反,使用DataTable.Rows.Find代替DataTable.Select;

        II.如果查询包括无主键的列,你可以使用DataView为数据的多重查询改善性能。当你在DataView中使用排序时,查询的同时就会创建一个索引。DataView使用Find和FindRows方法查询DataTable中的数据;

        IV.假如你不需要表的排序视图,你也可以利用DataView为DataTable创建一个索引查询。注意的是这仅仅在你执行多重查询时才有优势,如果你只是执行一个简单查询,使用此方法将会降低你的查询效率。

    K.DataView的结构

        前面也讲过,在给DataTable创建DataView和Sort、RowFilter或者RowStateFilter属性发生更改的同时潜在的也给DataTable创建了索引。创建DataView对象时,如果Sort、RowFilter和RowStateFilter属性也同时指定,那么索引将只创建一次;如果创建一个空的DataView,那么索引至少被创建两次。

    L.页面调度

        ADO.NET使你可以很清楚地控制从你的数据库返回什么样的数据和有多少数据存储到一个DataSet。以下没有单一的介绍调度一个查询结果,但是当你设计你的应用程序时应该考虑到以下情况:

        I.避免在使用DataAdapter.Fill时,在startRecord和maxRecords值上溢出。

        II.解决这类问题的办法是使用WHERE语句、ORDER BY语句和TOP断言。

        III.还有一种解决办法是使用TOP断言和嵌套的SELECT声明。比如如下代码:

     SELECT TOP 10 * FROM

(SELECT TOP 30 * FROM Customers ORDER BY Id ASC) AS Table1 ORDER BY Id DESC

IV.如果你的日期不是经常改变,你可以使用DataSet的存储功能改善执行性能,比如你可以存储相当10页的数据到你的DataSet,然后当用户访问超过在存储区的FirstPage和LastPage时才查询数据库以获得新的数据。

    M.有计划地填充DataSet

        当使用数据填充DataSet时,DataAdapter.Fill方法使用DataSet已有的计划和SelectCommand返回的数据对DataSet进行填充。如果DataSet中没有与之对应的表将会失败,Fill创建一个表,默认情况下,Fill仅仅定义列和列的类型。你可以通过设置DataAdapter的MissingSchemaAction属性重载默认的Fill方法。举例,要使Fill方法创建表时总是包含主键信息、唯一约束、列属性、是否允许空值、列的最大长度、只读列和自动增量列,指定DataAdapter.MissingSchemaAction为MissingSchemaAction.AddWithKey。作为选择,你也可以在调用DataAdapter.Fill之前调用DataAdpater.FillSchema来保证填充DataSet时计划到位。调用FillSchema会给数据库增加额外的负担来输出Schema信息,所以最好的建议是指定DataSet的计划,或者在调用Fill之前设置DataAdapter的MissingSchemaAction。

    N.使用CommandBuilder

        CommandBuilder自动地生成基于DataAdapter的SelectCommand的DataAdapter的InsertCommand、UpdateCommand和DeleteCommand属性。提供SelectCommand执行一个简单的SELECT,以下信息介绍使用CommandBuilder的最佳处理。

        I.在设计阶段不要使用CommandBuilder,否者产生DataAdapter Command属性的进程将会受到干扰。如果你预先知道你的UPDATE、INSERT和DELETE声明的内容,你应该清楚地指定。一个最好的设计方案是为你的UPDATE、INSERT和DELETE创建存储过程,并在DataAdapter的Command属性中设置和使用它们。

        II.CommandBuilder使用SelectCommand决定其他Command属性的值。如果DataAdapter的SelectCommand本身发生变化,应该使用RefreshSchema去刷新Command的属性。

        III.只要DataAdapter的Command属性为空,CommandBuilder就仅仅创建一个Command,即使你明确地指定Command的属性值,CommandBuilder也不会重写,所以如果你想创建一个Command并保留以前的属性设置,那么就把Command的属性设置为null。

    O.SQL的批声明和处理

        很多的数据库都支持在一条命令中使用综合查询或批处理或多条子命令。比如SQL Server中使用“;”。在一条命令中使用综合的多重命令可以有效地减少与数据库之间交互的次数并在你的应用程序中提高效率。比如在你的应用程序中使用批处理完成所有的删除(delete)任务等等。

        使用批处理确实提高了效率,但同时也在你的应用程序中管理更新DataSet数据时增加了复杂性。要使得复杂性变简单化,你就要在你的DataSet中为每个DataTable创建一个DataAdapter。

    P.使用多个表填充一个DataSet

        如果你是用批处理从多个表返回数据并把这些数据填充到一个DataSet,fill方法将会使用第一个表的表名命名第一个表,以后的表命名将会采用在第一个表的表名基础上加上一个递增的数字。举例,下面的代码将逐步说明fill方法的工作原理:

        ‘Visual Basic

        Dim da As SqlDataAdapter = New SqlDataAdapter(“select * from customers;select * from orders;”,myConnection)

        Dim ds As DataSet = New DataSet()

        da.fill(ds,”customers”)

        ‘C#

        SqlDataAdapter da = new SqlDataAdapter(“select * from customers;select * from orders;”,myConnection);

        DataSet ds = new DataSet();

        da.fill(ds,”customers”);

        如上面代码所示,customers表数据将会存放在一个命名为customers的DataTable中,而orders表数据将会放在一个命名为customers1的DataTable中。当然你也可以在数据填充结束后很容易地修改customers1表属性(TableName)为orders。然而,在以后的数

[1] [2] [3] [4] [5]  下一页

打印本文 打印本文 关闭窗口 关闭窗口