打印本文 打印本文 关闭窗口 关闭窗口
ADO.NET最佳实践(中)
作者:武汉SEO闵涛  文章来源:敏韬网  点击数2793  更新时间:2009/4/23 10:49:22  文章录入:mintao  责任编辑:mintao
据填充时,只会影响customers表中数据,而orders表将会忽略并同时创建一个新的命名为customers1的表。要解决这个问题,你就要在customers1和orders之间建立一个DataTableMapping映射。其他表也如此。举例说明:

        ‘Visual Basic

Dim da As SqlDataAdapter = New SqlDataAdapter("SELECT * FROM Customers; SELECT * FROM Orders;", myConnection)

da.TableMappings.Add("Customers1", "Orders")

Dim ds As DataSet = New DataSet()

da.Fill(ds, "Customers")

‘C#

SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM Customers; SELECT * FROM Orders;", myConnection);

da.TableMappings.Add("Customers1", "Orders");

DataSet ds = new DataSet();

da.Fill(ds, "Customers");

    Q.使用DataReader

        下面是使用DataReader的一些技巧和一些问题的回答:

        I.在使用相关Command访问任何输出参数之前必须关闭DataReader;

        II.在读取数据结束后应当关闭DataReader。如果你的Connection仅仅是用来返回DataReader,那么在关闭DataReader之后你也应该立即关闭它。另外一个关闭Connection的方法是传递CommandBehavior.CloseConnection给ExecuteReader方法。此方法在你从一个方法中返回DataReader并且对这个DataReader没有关闭控制权或者关联的连接时使用时非常有用的。

        III.DataReader是为已连接的数据存取设计;

        IV.使用GetString、GetInt32等返回特殊数据类型数据;

        V.一个连接只允许使用一个DataReader。在ADO中,如果你只创建一个连接并使用两个recordsets,一个只读游标和一个只进游标,但实际上,ADO已经为你创建了一个隐式的连接,并在不用的时候隐式地关闭它。ADO.NET中是不行的,你必须为每个DataReader创建一个Connection,这也是为了让你在使用Connection时给予更多的控制信息。

        VI.默认下,DataReader每次读取时把行中所有的数据装载到内存中。并允许你随机存取当前行中数据。如果随即存取没有必要(没有必要把所有数据都装载到内存),并想提高执行效率,给ExecuteReader方法传递CommandBehavior.SequentialAccess,这样就会改变DataReader的默认动作为仅仅装载请求的数据到内存。注意的是这种方法要求你顺序地存取行中列数据,一旦你略过某一列,以后你将再不会读取到该列的数据。

        VII.如果当你在完成从一个DataReader读取数据后,仍然还有大量未读不需要的数据,这就要在调用DataReader的Close命令之前调用Cancel命令。调用DataReader的Close命令会导致把不需要的数据装载进来并在关闭游标之前清空数据。而调用Cancel命令就会丢弃这部分数据,从而DataReader在关闭之前就不会读取它们。如果你正在从你的命令返回输出参数,调用Cancel命令同样会丢弃它们。如果你需要读取任何输出参数,你就不要使用Cancel,而直接使用Close。

    R.BLOBs对象

        当你使用DataReader读取二进制数据时,你应该传递CommandBehavior.SequentialAccess给ExecuteReader方法调用。因为DataReader的默认情况是每次读取数据时把每行中所有的数据都存储到内存,而二进制数据又非常的大,结果就会使大量的内存空间被一个单一的BLOB占用。SequentialAccess使得你的DataReader默认行为为仅读取需要的数据。然后你就可以使用GetBytes或者GetChars决定一次读取多少数据。

        记住的是使用SequentialAccess后,你不能次序颠倒地访问DataReader中不同的字段。就是说,如果你的查询返回三列,其中第三列是BLOB数据类型,如果你想访问第三列数据,那么你就必须先访问第一列,然后是第二列,再然后才是第三列的BLOB数据。这是因为此时返回的数据是有序的,而且一旦你跳过某一列,再回过头来读取这一列是不行的。

    S.使用命令

        ADO.NET提供了执行命令的几种不同方法,同时也提供了优化执行命令的几种不同参数。下面将要介绍的是选择最佳执行命令的技巧和改善一个可执行命令的性能。

        I.OleDbCommand最佳实践

        .NET 框架中各种数据提供者之间的执行命令标准几乎是一样的。但是也有不同,下面是执行OleDbCommand的一些技巧:

            ①使用CommandType.Text调用存储过程,使用CommandType.StoredProcedure生成;

            ②确定设置OleDbParameter的类型、大小(如果要求)和精度(如果是数字或者小数),注意的是,如果你不明确设置OleDbParameter,OleDbCommand将会为你的执行命令重新生成OleDbParameter。

        II.SqlCommand最佳实践

            使用SqlCommand快速执行存储过程:如果你要调用一个存储过程,指定SqlCommand的CommandType为存储过程的CommandType。这样在执行命令时,就会提交此命令是调用存储过程,从而达到快速执行。

        III.使用已准备的方法

            Command.Prepare方法优化你的参数化执行命令。Prepare结构为多重调用最优化指定命令。要使用Prepare,你首先得理解你的数据库是怎样相应Prepare调用。SQL Server 2000中,Command已经被隐式优化和Prepare不是必须的;在SQL Server7.0或其它数据库中使用Prepare是有效的。

        IV.明确地指定计划和元数据

            ADO.NET中的很多对象都要推断元数据信息,只要用户不指定它,举例如下:

            ①如果在DataSet中不存在,DataAdapter.Fill方法就会创建表和列信息;

            ②CommandBuilder为独立表的Select命令生成DataAdpater命令参数;

            ③CommandBuilder.DeriveParameters组装一个命令对象的参数信息;

        如果什么时候都使用上面讲的方法,可能会降低执行性能。推荐在设计阶段和广告段应用程序中使用。可能的情况下,一般都要指定计划和元数据。这些包括指定DataSet的表和列、指定DataAdapter的Command属性和指定Command的参数信息。

        V.ExecuteScalar和ExecuteNonQuery

            如果你想只返回一个简单值,比如Count(*)、Sum(Price)或者Avg(Quantity),你可以使用ExecuteScalar,它帮助你一步到位得到你想要的值,从而避免使用DataReader的两步计算(ExecuteReader+GetValue);

            当你不想返回行信息,比如修改数据(INSERT、UPDATE、DELETE)或者仅需要输出参数或者返回值,使用ExecuteNonQuery,它去掉不必要的处理创建一个空的DataReader。

        VI.空值检查

            如果在你的表中某列允许空值,你可以使用Where语句进行空值检查,下面举例说明:

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

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