ASP.NET 3.5核心编程学习笔记(13):SQL Server 2005中特有的改进
时间:2011-04-17 来源:辛勤的代码工
获取自定义类型
SQL Server 2005支持所有CLR类型,除默认类型外,我们还可在SQL Server中存储和获取任何有效的.NET类型对象。其中包括系统类型(如Point)和用户定义的类。下面的代码演示了如何从表(MyCustomers)中获取用户自定义类(Customer)实例:
String cmdText = “Select CustomerData From MyCustomers”;
SqlConnection conn = new SqlConnection(connStr);
using(conn)
{
SqlCommand cmd = new SqlCommand(cmdText, conn);
cmd.Connection.Open();
SqlDataReader reader = cmd.ExecuteReader();
while(reader.Read())
{
Customer cust = (Customer)reader[0];
}
}
SQL Server 2005的用户自定义类型数据存储在二进制的字节流中。数据读取器的get访问器会获取相应字节,并将其反序列化为原始类的有效实例。
SQL通知与依赖
ADO.NET中的SQL Server 提供程序提供两种使用通知功能的方法,并包含两个相关的类:SqlDependency和SqlNotificationRequest。
SqlNotificationRequest是一种较底层的类,暴露了服务器端的功能,允许我们执行带有通知的请求。当SQL Server 2005执行T-SQL语句后,通过机制会对查询进行跟踪,如果检测到某个更改可能导致结果集的更改,会向队列中发送一条消息。队列是新引入的SQL Server 2005数据库对象,可通过新的T-SQL语句来创建和管理。队列的轮询和消息的解析方式与具体应用程序密切相关。
SqlDependency类提供了一种对通知机制的高级抽象,允许我们设置应用程序级的查询依赖,以便服务器中的更改可通过事件立即传输到客户应用程序中。示例代码:
SqlCommand cmd = new SqlCommand(“Select * from Employees”, conn);
SqlDependency dep = new SqlDependency(cmd);
dep.OnChange += new OnChangeEventHandler(OnDependencyChanged);
SqlDataReader reader = cmd.ExecuteReader();
当检测到命令的结果集发生更改时,SqlDependency类的OnChange事件会被引发,下面是一个典型的处理程序:
void OnDependencyChanged(object sender, SqlNotificationsEventArgs e)
{
……
}
这样使用通知机制并没有考虑到ASP.NET的特殊性,因为页面在查询执行后会立即返回。但ASP.NET 2.0缓存API提供了类似的功能。
多活动结果集MARS
在SQL Server 2005中,允许应用程序在一个连接上打开若干个SqlDataReader对象,每个对象由不同的命令生成。在单个连接上使用多个数据读取器会得到潜在的性能提升,因为多个读取器的开销比多个连接的开销小很多。
MARS的一种典型用法是:在获取数据读取器来遍历整个结果集的同时,通过另一个处于同一连接的命令来向数据库发送更新语句。示例代码:
using(SqlConnection conn = new SqlConnection(connString))
{
//查询命令
SqlCommand cmd1 = new SqlCommand(“Select * From employees”, conn);
cmd1.Connection.Open();
//执行查询
SqlDataReader reader = cmd1.ExecuteReader();
while(reader.Read())
{
//反转firstname
String firstNameReversed = reader[“firstname”].ToString();
Char[] buff = firstNameReversed.ToCharArray();
Array.Reverse(buf);
firstNameReversed = new string(buf);
int id = (int)reader[“emoloyeeid”];
//复用该连接执行Update
SqlCommand cmd2 = new SqlCommand(“Update emplyees Set firstname = @newFirstName Where employeeid = @empID”, conn);
cmd2.Parameters.AddWithValue(“@newFirstName”, firstNameReversed);
cmd2.Parameters.AddWithValue(“@empID”, id);
cmd2.ExecuteNonQuery();
}
Reader.close();
//复用连接,重新绑定数据
grid.DataSource = cmd1.ExecuteReader();
grid.DataBind();
cmd1.Connection.Close();
}
为使MARS工作,我们必须使用不同的SqlCommand对象。
MARS带来的另一个好处是,如果使用事务,它允许我们在与原始连接隔离级别相同的区域中执行代码。如果使用SQL Server 2005服务器,默认状态下,MARS是开启的。如果要关闭MARS,可将连接字串的MultipleActiveResultSets属性设置为false,该属性的作用主要是为了向后兼容。