HOWTO: 从 ADO.NET 中 SQLServer 存储过程返回错误和警告
HOWTO: 从 ADO.NET 中 SQLServer 存储过程返回错误和警告
注意:这篇文章是由无人工介入的自动的机器翻译系统翻译完成。这些文章是微软为不懂英语的用户提供的, 以使他们能够理解这些文章的内容。微软不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的使用所引起的任何直接的, 或间接的可能的问题负责。
文章编号
:
321903
最后修改
:
2006年7月24日
修订
:
6.0
本页
概要
本文介绍如何在 ADO.NET 中显示 SQLServer 错误和警告。 如果您引发错误有严重级别为 10 或小于, 它是警告, 会引发任何异常。 此警告不填充到 SqlErrorCollection 。 您必须挂钩到 InfoMessage 事件的 连接 对象并处理有消息。
SQLServer 中错误在 SqlErrorCollection 中捕获, SQL 存储过程使用严重级别为 11 通过 20 引发错误。 还要注意, 某些错误有严重度级别为 11 或更中止整个存储过程。
要求
以下列表概括了推荐硬件、 软件、 网络结构, 以及 ServicePack 所需:
•
MicrosoftVisualStudio.NET 兼容 MicrosoftWindows 操作系统上安装
•
带有示例 Northwind 数据库安装 SQL 服务器
本文假定您已熟悉以下主题:
•
VisualBasic.NET
•
ADO.NET 数据访问
创建项目并添加 SQLServer 中存储过程
以下示例使用 Sev 10 和 11 Sev 错误的组合来演示如何使用 ADO.NET 来显示错误消息具有不同严重级别。 此示例还说明如何使用 IF | ELSE 逻辑结合 RAISERROR 向 SQL 存储过程中错误处理。
示例 SQLServerNorthwind 数据库中 Customers 表上执行简单搜索。 如果未找到之一 CustomerIDs, 引发 SEV 10 异常。 如果两个 CustomerIDs 没有找到, 引发异常 SEV 11, 并存储过程终止。 注意, 您必须添加到挂钩到 InfoMessage 事件的 连接 对象以显示具有严重级别为 10 或更少的错误处理程序。
1.
请执行下列步骤来创建新的 VisualBasicWindows 应用程序项目:
a.
启动 VisualStudio.NET。
b.
在 文件 菜单, 指向 新建 , 然后单击 项目 。
c.
在 新建项目 对话框中, 单击 项目类型 下 VisualBasic 项目 , 单击 模板 , 下 WindowsApplication@@@ 然后单击 确定 。
2.
在 ServerExplorer@@, 配置提供一个 SQLServer 上新数据连接到 Northwind 示例数据库。
3.
展开 罗斯文数据库 节点, 右键单击 存储过程 , 然后单击新存储过程。
4.
在, 存储过程的代码窗口粘贴以下存储过程代码:
CREATE proc GetCustomers @CustomerID1 nvarchar (5), @CustomerID2 nvarchar (5) AS DECLARE @err_message nvarchar(255) --if no customers found return SEV 11 error to abort stored procedure IF NOT EXISTS (Select CustomerID from Customers where CustomerID = @CustomerID1 or CustomerID = @CustomerID2) BEGIN SET @err_message = @CustomerID1 + ' and ' + @CustomerID2 + ' Not found raise sev 11' RAISERROR (@err_message, 11,1) END --if 1st customerid not found throw SEV 10 exception IF EXISTS (Select CustomerID from Customers where CustomerID = @CustomerID1) BEGIN select * from Customers where CustomerID = @CustomerID1 END ELSE BEGIN SET @err_message = @CustomerID1 + ' not found raise sev 10' RAISERROR (@err_message,10, 1) END --if 2nd customerid not found throw SEV 10 exception IF EXISTS (select * from Customers where CustomerID = @CustomerID2) BEGIN select * from Customers where CustomerID = @CustomerID2 END ELSE BEGIN SET @err_message = @CustomerID2 + ' not found raise sev 10' RAISERROR (@err_message,10, 1) END
5.
关闭存储过程代码窗口, 然后单击 是 以保存更改。
添加代码以显示错误和警告
1.
Form 1, 的代码窗口或, VisualBasic.NET 项目中通过将下行添加到 Form 1 .vb 文件顶部添加对 System.Data.SQLClient 引用:
Imports System.Data.SqlClient
2.
将两个 TextBox 控件 (TextBox 和 TextBox 2) 从工具箱向 Form 1。
3.
按 F 4 TextBox 的 Text 属性改为 ALFKI 。
4.
按 F 4 改为 ANATR TextBox 2 的 Text 属性。
5.
将 Button 控件 (Button 1) 从工具箱拖到 Form 1, 然后按 F 4 Text 属性改为 搜索 。
6.
双击 Button 1 , 然后将以下代码添加到 Button 1 _ Click 事件处理程序:
注意 您必须更改用户 ID < 用户名 > 值和密码 = < 强密码 > 值正确值在运行此代码之前。 确保该用户 ID 具有适当的权限, 对数据库执行此操作。
Try Dim cn As New SqlConnection("Server=servername;Database=Northwind;User Id=<username>Password=<strong password>") AddHandler cn.InfoMessage, AddressOf cn_InfoMessage cn.Open() Dim cmd As New SqlCommand("GetCustomers") cmd.CommandType = CommandType.StoredProcedure cmd.Connection = cn cmd.Parameters.Add(New SqlParameter("@CustomerID1", SqlDbType.NVarChar, 5)) cmd.Parameters.Add(New SqlParameter("@CustomerID2", SqlDbType.NVarChar, 5)) cmd.Parameters("@CustomerID1").Value = TextBox1.Text cmd.Parameters("@CustomerID2").Value = TextBox2.Text Dim myReader As SqlDataReader = cmd.ExecuteReader() Dim RecordCount As Integer = 0 'You must check the nextresult method because there is a possiblity that the 'stored procedure may return multiple resultsets; the NextResult method 'positions the DataReader at the next result in the resultset if you 'have multiple results, otherwise it will return false. Do Do while myreader.read() Debug.WriteLine("Found customer ID : " & myReader(0)) Loop Loop While myreader.NextResult() myReader.Close() Catch SqlEx As SqlException Dim myError As SqlError Debug.WriteLine("Errors Count:" & SqlEx.Errors.Count) For Each myError In SqlEx.Errors Debug.WriteLine(myError.Number & " - " & myError.Message) Next End Try
7.
修改连接字符串指向 SQLServer 服务器上 Northwind 数据库。
8.
要显示具有严重级别为 10 或少, 错误添加下列子来处理 InfoMessage 事件:
Public Sub cn_InfoMessage(ByVal sender As Object, ByVal e As System.Data.SqlClient.SqlInfoMessageEventArgs) Debug.WriteLine("info message event: " & e.Message) End Sub
9.
按 CTRL+F 5 组合键以运行该程序。 单击 Button 1 , 注意, 看不到 CustomerIDs ALFKI 和 ANATR 输出窗口中。 确保输出窗口是可见, 按 CTRL+ALT+O 组合键。
生成和处理 SEV 10 警告
从 ALFKI 更改到 AAAAA , TextBox 中的值, 然后单击 Button 1 以尝试 Customers 数据库中选择一个值不存在。 存储过程中自定义错误代码捕获此方案并引发 SEV 10 异常。 您看到该 SEV 10 异常被引发和通过使用 InfoMessage 事件 Connection 对象的显示。 错误消息具有严重级别为 10 或更少被视为信息性消息, 并不返回错误或查询结果中。
生成并处理 SEV 11 异常
和 TextBox 2 , TextBox 更改到 AAAAA , 值从 ALFKI 中将值从 ANATR 到 AAAAA , 并单击 Button 1 。 在 Customers 数据库, 这确实不查找值并引发 SEV 11 异常存储过程。 现在看到了您自定义错误消息 SQLErrorCollection SEV 11 错误。
Source: Joey's Boring Blog: @编程开发