使用ADO.NET的最佳实践 7
点击次数:34 次 发布日期:2008-11-26 11:18:43 作者:源代码网
|
源代码网推荐 源代码网推荐 只要用户没有指定元数据信息,ADO.NET的许多对象就会推断元数据信息。下面是一些示例: 源代码网推荐 源代码网推荐 1) DataAdapter.Fill方法,如果DataSet中没有表和列,DataAdapter.Fill方法会在DataSet中创建表和列。 源代码网推荐 源代码网推荐 2) CommandBuilder,它会为单表SELECT命令生成DataAdapter命令属性。 源代码网推荐 源代码网推荐 3) CommandBuilder.DeriveParameters,它会填充Command对象的Parameters集合。 源代码网推荐 源代码网推荐 但是,每次用到这些特性,都会有性能损失。建议将这些特性主要用于设计时和即席应用程序中。在可能的情况下,显式指定架构和元数据。其中包括在 DataSet中定义表和列、定义DataAdapter的Command属性、以及为Command定义Parameter信息。 源代码网推荐 源代码网推荐 ExecuteScalar和ExecuteNonQuery 源代码网推荐 源代码网推荐 如果想返回像Count(*)、Sum(Price)或Avg(Quantity)的结果那样的单值,可以使用 Command.ExecuteScalar。ExecuteScalar返回第一行第一列的值,将结果集作为标量值返回。因为单独一步就能完成,所以 ExecuteScalar不仅简化了代码,还提高了性能;要是使用DataReader就需要两步才能完成(即,ExecuteReader+取值)。 源代码网推荐 源代码网推荐 使用不返回行的SQL语句时,例如修改数据(例如INSERT、UPDATE或DELETE)或仅返回输出参数或返回值,请使用ExecuteNonQuery。这避免了用于创建空DataReader的任何不必要处理。 源代码网推荐 源代码网推荐 测试Null 源代码网推荐 源代码网推荐 如果表(在数据库中)中的列允许为空,就不能测试参数值是否“等于”空。相反,需要写一个WHERE子句,测试列和参数是否都为空。下面的SQL语句返回一些行,它们的LastName列等于赋给@LastName参数的值,或者LastName列和@LastName参数都为空。 源代码网推荐 源代码网推荐 SELECT * FROM Customers 源代码网推荐 WHERE ((LastName = @LastName) OR (LastName IS NULL AND @LastName IS NULL)) 源代码网推荐 源代码网推荐 将Null作为参数值传递 源代码网推荐 源代码网推荐 对数据库的命令中,当将空值作为参数值发送时,不能使用null(Visual Basic .net中为Nothing)。而需要使用DBNull.Value。例如: 源代码网推荐 源代码网推荐 "Visual Basic 源代码网推荐 Dim param As SqlParameter = New SqlParameter("@Name", SqlDbType.NVarChar, 20) 源代码网推荐 param.Value = DBNull.Value 源代码网推荐 源代码网推荐 //C# 源代码网推荐 SqlParameter param = new SqlParameter("@Name", SqlDbType.NVarChar, 20); 源代码网推荐 param.Value = DBNull.Value; 源代码网推荐 源代码网推荐 执行事务 源代码网推荐 源代码网推荐 ADO.NET的事务模型已经更改。在ADO中,当调用StartTransaction时,调用之后的任何更新操作都被视为是事务的一部分。但是,在 ADO.NET中,当调用Connection .BeginTransaction时,会返回一个Transaction对象,需要将它与Command的Transaction属性联系起来。这种设计可以在一个单一连接上执行多个根事务。如果未将Command.Transaction属性设置为一个针对相关的Connection而启动的 Transaction,那么Command就会失败并引发异常。 源代码网推荐 源代码网推荐 即将发布的.NET框架将使您可以在现有的分布式事务中手动登记。这对于对象池方案来说很理想;在该方案中,一个池对象打开一次连接,但是在多个独立的事务中都涉及到该对象。.NET框架1.0发行版中这一功能并不可用。 源代码网推荐 源代码网推荐 使用连接 源代码网推荐 源代码网推荐 高性能应用程序与使用中的数据源保持最短时间的连接,并且利用性能增强技术,例如连接池。下面的主题提供一些技巧,有助于在使用ADO.NET连接到数据源时获得更好的性能。 源代码网推荐 源代码网推荐 连接池 源代码网推荐 源代码网推荐 用于ODBC的SQL Server、OLE DB和.NET框架数据提供程序隐式缓冲连接。通过在连接字符串中指定不同的属性值,可以控制连接池的行为。 源代码网推荐 源代码网推荐 用DataAdapter优化连接 源代码网推荐 源代码网推荐 DataAdapter的Fill和Update方法在连接关闭的情况下自动打开为相关命令属性指定的连接。如果Fill或Update方法打开了连接,Fill或Update将在操作完成的时候关闭它。为了获得最佳性能,仅在需要时将与数据库的连接保持为打开。同时,减少打开和关闭多操作连接的次数。 源代码网推荐 源代码网推荐 如果只执行单个的Fill或Update方法调用,建议允许Fill或Update方法隐式打开和关闭连接。如果对Fill和Update调用有很多,建议显式打开连接,调用Fill和Update,然后显式关闭连接。 源代码网推荐 源代码网推荐 另外,当执行事务时,显式地在开始事务之前打开连接,并在提交之后关闭连接。例如: 源代码网推荐 源代码网推荐 "Visual Basic 源代码网推荐 Public Sub RunSqlTransaction(da As SqlDataAdapter, myConnection As SqlConnection, ds As DataSet) 源代码网推荐 myConnection.Open() 源代码网推荐 Dim myTrans As SqlTransaction = myConnection.BeginTransaction() 源代码网推荐 myCommand.Transaction = myTrans 源代码网推荐 源代码网推荐 Try 源代码网推荐 da.Update(ds) 源代码网推荐 myTrans.Commit() 源代码网推荐 Console.WriteLine("Update successful.") 源代码网推荐 Catch e As Exception 源代码网推荐 Try 源代码网推荐 myTrans.Rollback() 源代码网推荐 Catch ex As SqlException 源代码网推荐 If Not myTrans.Connection Is Nothing Then 源代码网推荐 Console.WriteLine("An exception of type " & ex.GetType().ToString() & " was encountered while attempting to roll back the transaction.") 源代码网推荐 End If 源代码网推荐 End Try 源代码网推荐 源代码网推荐 Console.WriteLine("An exception of type " & e.GetType().ToString() & " was encountered.") 源代码网推荐 Console.WriteLine("Update failed.") 源代码网推荐 End Try 源代码网推荐 myConnection.Close() 源代码网推荐 End Sub 源代码网推荐 源代码网推荐 //C# 源代码网推荐 public void RunSqlTransaction(SqlDataAdapter da, SqlConnection myConnection, DataSet ds) 源代码网推荐 { 源代码网推荐 myConnection.Open(); 源代码网推荐 SqlTransaction myTrans = myConnection.BeginTransaction(); 源代码网推荐 myCommand.Transaction = myTrans; 源代码网推荐 源代码网推荐 try 源代码网推荐 { 源代码网推荐 da.Update(ds); 源代码网推荐 myCommand.Transaction.Commit(); 源代码网推荐 Console.WriteLine("Update successful."); 源代码网推荐 } 源代码网推荐 catch(Exception e) 源代码网推荐 { 源代码网推荐 try 源代码网推荐 { 源代码网推荐 myTrans.Rollback(); 源代码网推荐 } 源代码网推荐 catch (SqlException ex) 源代码网推荐 { 源代码网推荐 if (myTrans.Connection != null) 源代码网推荐 { 源代码网推荐 Console.WriteLine("An exception of type " + ex.GetType() +" was encountered while attempting to roll back the transaction."); 源代码网推荐 } 源代码网推荐 } 源代码网推荐 源代码网推荐 Console.WriteLine(e.ToString()); 源代码网推荐 Console.WriteLine("Update failed."); 源代码网推荐 } 源代码网推荐 myConnection.Close(); 源代码网推荐 } 源代码网推荐 做人要厚道,请注明转自酷网动力(www.ASPCOOL.COM)。 源代码网推荐 源代码网供稿. |
