初始化具有查询文本、SqlConnection 和 Transaction 的 SqlCommand 类实例,DATEREADER相关技巧
string conString = "data source=127.0.0.1;Database=codematic;user id=sa;
password=";
SqlConnection myConnection = new SqlConnection(conString );
string strSql = "update P_Product set Name='电脑4' where Id=52";
string strSql2 = "update P_Product set Name='数码4' where Id=53";
myConnection.Open();
SqlTransaction myTrans = myConnection.BeginTransaction();
SqlCommand myCommand = new SqlCommand(strSql, myConnection, myTrans);
try
{
int rows = myCommand.ExecuteNonQuery();
myCommand.CommandText = strSql2;
rows = myCommand.ExecuteNonQuery();
myTrans.Commit();
myConnection.Close();
}
catch
{
myTrans.Rollback();
}
下面是一些使用DataReader获得最佳性能的技巧。
l 在使用带参数的Command前,必须关闭DataReader。
l 完成读数据之后一定要关闭DataReader。如果使用Connection只返回DataReader,那么关闭DataReader之后立刻关闭它。另外一个显式关闭Connection的方法是将CommandBehavior.CloseConnection传递给ExecuteReader方法,以确保关闭DataReader时相应的连接也被关闭。如果从一个方法返回DataReader,而且不能控制DataReader的相关连接的关闭,则这样做特别有用。
l 不能在层之间远程访问DataReader。DataReader是为已连接好的数据访问而设计的。
l 当访问列数据时,使用类型化访问器,例如GetString、GetInt32等。这使你不用将GetValue返回的Object强制转换成特定类型。
l 一个单一连接每次只能打开一个DataReader。如果想在相同的数据存储区上同时打开两个DataReader,则必须显式创建两个连接,每个DataReader一个。这是ADO.NET为池化连接的使用提供更多控制的一种方法。
l 在默认情况下,DataReader每次Read时都要将整行加载到内存。这允许在当前行内随机访问列。如果不需要这种随机访问,为了提高性能,则将CommandBehavior.SequentialAccess传递给ExecuteReader调用。这将DataReader的默认行为更改为仅在请求时将数据加载到内存。注意,CommandBehavior. SequentialAccess要求顺序访问返回的列。也就是说,一旦读过返回的列,就不能再读它的值了。
l 如果已经读取了来自DataReader的数据,但仍然有大量挂起的未读结果,则在关闭DataReader之前先要取消Command。因为取消Command可使服务器放弃这些结果,从而释放服务器的资源。
5.1.7 随用随关,释放资源
对于C#程序员来说,确保始终关闭Connection和DataReader对象的一个方便的方法就是使用using语句。using语句在离开自己的作用范围时,会自动调用被“使用”的对象的Dispose。例如:
string connectionString = "data source=127.0.0.1;Database=codematic;
user id=sa;password=";
using (SqlConnection myConnection = new SqlConnection(connectionString))
{
SqlCommand cmd = myConnection.CreateCommand();
cmd.CommandText = "SELECT * FROM P_Product";
myConnection.Open();
using (SqlDataReader dr = cmd.ExecuteReader())
{
while (dr.Read())
{
Response.Write(dr.GetInt32(0).ToString()+","+dr.GetString(1)+"<br>");
}
}
}