.NET 数据访问架构指南 8
点击次数:26 次 发布日期:2008-11-26 10:38:37 作者:源代码网
|
源代码网推荐 源代码网推荐 T-SQL提供了一个RAISERROR(注意拼写)函数。你可用此函数生成定置错误,并将错误返回客户。对于ADO.NET客户,SQL Server .net数据供应器对这些数据错误进行解释,并把它们转化为SqlError对象。 源代码网推荐 源代码网推荐 使用RAISERROR函数是简单地方法是将消息文本作为第一个参数包括进来,然后指定严重及状态参数,如下面的代码片段所示: RAISERROR( "Unknown Product ID: %s", 16, 1, @ProductID ) 源代码网推荐 源代码网推荐 在这个例子中,替代参数用于将当前产品ID作为错误消息文本的一部分返回,参数2是消息的严重性,参数3是消息状态。 源代码网推荐 源代码网推荐 更多信息 源代码网推荐 为了避免对消息文本进行硬编码,你可以利用sp_addmessage系统存储过程或SQL Server 企业管理器将你自己的消息增加到sysmessages表中。然后你就可以使用传递到RAISERROR函数的ID引用消息了。你所定义的消息Ids必须大于50000,如下代码片段所示: 源代码网推荐 源代码网推荐 源代码网推荐 RAISERROR( 50001, 16, 1, @ProductID ) 源代码网推荐 源代码网推荐 源代码网推荐 关于RAISERROR函数的完整细节,请在SQL Server的在线书目中查询RAISERROR。 源代码网推荐 正确使用严重性等级 源代码网推荐 源代码网推荐 仔细选择错误严重性等级,并要清楚每个级别造成的冲击。错误严重性等级的范围是0-25,并且它用于指出SQL Server 2000所遇到的问题的类型。在客户端代码中,通过在SqlException类的Errors集合中检查SqlError对象的 Class属性,你可以获得错误的严重性。表1 指出了不同严重性等级的意义及所造成的冲击。 源代码网推荐 源代码网推荐 表1.错误严重性等级--冲击及意义 源代码网推荐 源代码网推荐 严重性等级 链接已关闭 生成SqlException对象 意义 源代码网推荐 10及其以下 No No 通知型消息,并不表示犯错误状态。 源代码网推荐 11-16 No Yes 可由用户修改的错误,例如,使用修改后的输入数据重试操作。 源代码网推荐 17-19 No Yes 资源或系统错误。 源代码网推荐 20-25 Yes Yes 致命的系统错误(包括硬件错误)。客户链接被终止。 源代码网推荐 源代码网推荐 控制自动化事务 源代码网推荐 源代码网推荐 SQL Server .NET数据供应器对它所遇到的任何严重性大于10的错误都抛出SqlException对象。当作为自动化(COM+)事务一部分的组件检测到SqlException对象后,该组件必须确保它能取消事务。这也许是,也许不是自动化过程,并要依赖该方法是否已经对AutoComplete属性作出了标记。 源代码网推荐 源代码网推荐 关于在自动化事务上下文中处理对象的更多信息,见本文中的确定事务结果一节。 源代码网推荐 源代码网推荐 得到通知型消息 源代码网推荐 源代码网推荐 10及其以下严重性等级用于表示通知型消息,并且不会引发SqlException对象的抛出。 源代码网推荐 源代码网推荐 要获得通知型消息: 源代码网推荐 创建事件处理程序,并提交给SqlConnection对象所暴露的InfoMessage事件。下面的代码片段显示了事件代理。 源代码网推荐 public delegate void SqlInfoMessageEventHandler( object sender, 源代码网推荐 SqlInfoMessageEventArgs e ); 源代码网推荐 源代码网推荐 通过传递到你的事件处理处理程序中的SqlInfoMessageEventArgs对象,可以得到消息数据。此对象暴露了Errors属性,该属性包含一组SqlError对象--每个通知消息一个SqlError对象。下面的代码片段演示了如何注册用于记录通知型消息的事件处理程序。 源代码网推荐 源代码网推荐 public string GetProductName( int ProductID ) 源代码网推荐 { 源代码网推荐 SqlConnection conn = new SqlConnection( 源代码网推荐 "server=(local);Integrated Security=SSPI;database=northwind"); 源代码网推荐 try 源代码网推荐 { 源代码网推荐 // ReGISter a message event handler 源代码网推荐 conn.InfoMessage += new SqlInfoMessageEventHandler( MessageEventHandler ); 源代码网推荐 conn.Open(); 源代码网推荐 // Setup command object and execute it 源代码网推荐 . . . 源代码网推荐 } 源代码网推荐 catch (SqlException sqlex) 源代码网推荐 { 源代码网推荐 // log and handle exception 源代码网推荐 . . . 源代码网推荐 } 源代码网推荐 finally 源代码网推荐 { 源代码网推荐 conn.Close(); 源代码网推荐 } 源代码网推荐 } 源代码网推荐 // message event handler 源代码网推荐 void MessageEventHandler( object sender, SqlInfoMessageEventArgs e ) 源代码网推荐 { 源代码网推荐 foreach( SqlError sqle in e.Errors ) 源代码网推荐 { 源代码网推荐 // Log SqlError properties 源代码网推荐 . . . 源代码网推荐 } 源代码网推荐 } 源代码网推荐 源代码网推荐 性能 源代码网推荐 源代码网推荐 本节介绍了一些常见的数据访问方案,对每种方案,以ADO.NET 数据访问代码的形式描述了最优性能和扩展性解决方案。在合适的地方,还对性能,功能及开发最作出了比较。本节考虑了下面的功能方案。 源代码网推荐 获取多行. 获取一个结果集,并在得到的行中重复。 源代码网推荐 源代码网推荐 源代码网推荐 获取一行. 获取具有指定关键字的一行。 源代码网推荐 源代码网推荐 源代码网推荐 获取一项. 从指定的行中得到一项。 源代码网推荐 源代码网推荐 源代码网推荐 确定某项数据的存在性. 检查具有特定关键字的一行是否存在。这是单项查找方案的一种变体,这里返回一个简单的布尔值就足够了。 源代码网推荐 获取多行 源代码网推荐 源代码网推荐 在这个方案中,你要获取一组表格化数据,并在得到的行中重复执行某个操作。例如你得到了一组数据,并以非链接的方式处理,然后(可能通过Web服务)将它作为XML文档传递给客户应用程序。可选的,你也可以以HTML表的形式将这些数据显示出来。 源代码网推荐 源代码网推荐 为了帮助确定最合适的数据访问方法,考虑你是否需要(非链接)DataSet 对象的附加灵活性,还是只需要SqlDataReader对象提供的原有性能,这些性能非常适合于B2C Web应用程序的数据表示。图4显示了这两种基本场景。 源代码网推荐 源代码网推荐 注意用于填充DataSet的SqlDataAdapter利用SqlDataReader方法数据。 源代码网推荐
源代码网推荐 图4 多行数据访问方案 源代码网推荐 源代码网推荐 方法比较 源代码网推荐 源代码网推荐 当从数据源中获取多行时,你可以使用下面的方法: 源代码网推荐 使用SqlDataAdapter对象生成DataSet 或 DataTabl对象。 源代码网推荐 源代码网推荐 源代码网推荐 利用SqlDataReader对象提供只读的只向前的数据流。 源代码网推荐 源代码网推荐 源代码网推荐 利用XMLReader对象提供只读的只向前的XML数据流。 源代码网推荐 SqlDataReader 与 DataSet/DataTable间的选择本质上是性能与功能间的选择。SqlDataReader 提供了最优性能,而DataSet提供了额外的功能与灵活性。 源代码网推荐 做人要厚道,请注明转自酷网动力(www.ASPCOOL.COM)。 源代码网推荐 源代码网供稿. |
