在 ODP.NET 和 Oracle 数据库 11g 中使用数据库更改通知

本教程将介绍 Oracle Data Provider for .NET 和 Oracle 数据库支持的数据库更改通知特性。

大约 30 分钟

本教程包括下列主题:

将鼠标置于此图标上可以加载和查看本教程的所有屏幕截图。(警告:因为此操作会同时加载所有屏幕截图,所以网速较慢时,响应时间可能会比较长。)

注:此外,您还可以在下列步骤中将鼠标放在每个单独的图标上,从而仅加载和查看与该步骤相关的屏幕截图。可以通过单击各个屏幕截图来将其隐藏。

Oracle Data Provider for .NET 提供了一个通知框架,可以在数据库服务器中支持数据库更改通知。数据库更改通知使应用程序能够在查询结果集、模式对象或影响缓存客户端结果集结果的数据库状态发生变化时接收来自注册回调例程的通知。

在 ODP.NET 中使用这个特性,应用程序可以轻松地维持客户端缓存(如 ADO.NET 数据集)的有效性。客户端无需维护与数据库的连接。即使不再连接到数据库,也能收到通知。

该特性适用于那些结果很少随时间变化的查询,以及无法维持众多活动数据库连接的查询。

在本教程中,应用程序将显示一个包含 HR.EMPLOYEES 表的值的数据集网格。填充网格后,应用程序将断开与数据库的连接,并等待数据更改通知。一旦检测到更改,应用程序将重新连接到数据库,并刷新数据。

本教程演示了数据库更改通知特性的灵活性,包括持续不断的通知注册(即使经过多次更改)以及按行区分(无论更改是否会影响客户端的查询结果)。该特性在 Oracle 数据库 10g 第 2 版中称为数据库更改通知 (DCN)。在 Oracle 数据库 11g 中,该特性被重命名为连续查询通知 (CQN)。两者指的都是同一特性。

开始本教程之前,您应该:

安装并创建 Oracle 数据库 11g 或 Oracle 数据库 10g 第 2 版数据库服务器

安装带有 Visual C# 的 Visual Studio 2005

通过 Oracle 数据库 11g 客户端或从 OTN 安装 ODP.NET 11g

下载“Change Notification.zip”并将其解压缩到您的工作目录中

用户或角色必须具有 CHANGE NOTIFICATION 权限,才能运行接受更改通知回调的应用程序。

1.

从 Windows“程序”菜单启动 Visual Studio。在 Visual Studio 中,从 View 菜单中选择 Server Explorer

Server Explorer 面板打开。

2.

右键单击 Data Connections 并从菜单中选择 Add Connection

Add Connection 对话框打开。

3.

在 Add Connection 对话框中,确保 Data Source 设置为 Oracle Database Server (Oracle ODP.NET)

注:如果未将 Data Source 设置为 Oracle Database Server (Oracle ODP.NET)单击 Change 选择正确的数据源和数据源提供程序。

在 Change Data Source 对话框中,从 Data Source 列表中选择 Oracle Database Server,并从 Data Provider 下拉列表中选择 Oracle Data Provider for .NET。单击 OK

4.

在 Add Connection 对话框中,确保选择 Connection Details 选项卡。从 Data Source 下拉列表中,选择您使用的 Oracle 数据库实例 SID。

输入 SYS 作为用户名,输入 oracle 作为口令,并从下拉列表中选择 SYSDBA 角色。单击 OK 进行连接。

注:您的 sys 口令可以不是 oracle。请询问您的数据库管理员以获得 sys 口令。

5.

同样,为 HR 模式创建一个连接。在 Server Explorer 中,右键单击 Data Connections 并选择 Add Connection

在 Add Connection 对话框中,已经选择了正确的数据源和数据源提供程序。

在 Connection Details 选项卡中,输入 HR 作为用户名,并输入 hr 作为口令。单击 OK

注:HR 模式的口令可以不是 hr。请询问您的数据库管理员以获得 HR 模式的口令。

Server Explorer 会显示这两个连接。

6.

右键单击 Server Explorer 中的 SYS.ORCL 连接节点,并选择 Query Window。这将打开 Query 窗口。

7.

在 Query 窗口中,输入以下授权语句:

grant change notification to hr

单击 Execute Query 按钮。

您将在查询输出窗口中看到一则表明成功完成的消息。关闭查询编辑器。

已经为您预先创建了一个用于加载和运行的更改通知 Visual Studio 解决方案。

该程序将在 HR 模式中选择 EMPLOYEES 表中 EMPLOYEE_ID 值小于 200 的所有记录,然后将结果放入 ADO.NET 数据集。该数据集不与数据库服务器保持连接,因此它不再占用任何数据库资源,从而实现了更好的可伸缩性。

在执行 SELECT 语句之前,将 OracleDependency 对象绑定到 OracleCommand。执行 SELECT 语句时,该 OracleDependency 对象将在数据库服务器上创建一个通知注册。

即使断开与原始数据集的连接,当其他用户修改 EMPLOYEES 表时,通知处理程序将通知 .NET 应用程序源数据已经发生了更改。在客户端,这将触发一个刷新数据集结果的事件处理程序。

1.

在 Visual Studio 中,从 File 菜单中选择 Open > Project/Solution。在 Open Project 对话框中,导航到解压缩“Change Notification.zip”文件的文件夹,并选择 DB 更改通知解决方案文件。单击 Open。

2.

从 View 菜单中,选择 Solution Explorer。在 Solution Explorer 中,右键单击 Form1.cs 并选择 View Code

Form1.cs 代码窗口打开。

3.

您可能需要修改连接字符串属性才能连接到 Oracle。如果您的数据源是一个以 orcl 作为服务名或网络服务名的本地实例,则无需更改数据源连接字符串属性。

如果您需要使用其他数据源别名,可以修改连接字符串变量“constr”中的 Data Source 值。

注:您将连接到 HR 模式,因此需要检查 User Id 是否设置为 HR,并且 Password 是否正确设置。在示例代码中,HR 的口令是“hr”。如果“hr”不是您的 HR 模式的口令,请询问您的 DBA 以获得正确口令。

4.

在各自的注释下添加以下代码。注释用于解释各行代码的作用。

cmd.AddRowid = true;
OracleDependency dep = new OracleDependency(cmd);
cmd.Notification.IsNotifiedOnce = false;
dep.OnChange += new OnChangeEventHandler(OnMyNotificaton);

5.

在 Visual Studio 中,从 Debug 菜单中选择 Start Debugging。这将运行演示。如果出现断点,按 F5 键继续运行,直到包含 HR 值的网格为止。这时会出现 EMPLOYEES 表。

注:首次运行该程序时,可能会从 Windows 防火墙收到以下屏幕截图中所示的消息。单击 Unblock 以允许将更改通知从数据库服务器发送到客户端。

不要 退出运行中的演示。

返回主题列表

现在,更改通知应用程序正在运行,可以接收有关 HR.EMPLOYEES 表中数据更改的通知。下面我们来修改 EMPLOYEES 表的数据。

1.

单击 Server Explorer 中 HR.ORCL 节点旁边的 (+) 加号将其展开。展开 Tables 节点。

右键单击 EMPLOYEES 表并选择 Retrieve Data...,以在 Visual Studio 中显示它的数据。

这时可能会出现一个 Microsoft Visual Studio 对话框,要求您确认是否要检索更多的行(设置限定为 100 行)。单击 Yes

这时会打开一个显示 employees 表数据的窗口。

2.

在 Visual Studio(而不是更改通知应用程序网格)中新打开的数据窗口内,修改其中一个 SALARY 值。单击 Save 将该值提交到 Oracle 数据库。

3.

更改通知应用程序会立刻打开一个 Notification Alert 窗口,通知该结果集已经更改。

注:如果该窗口未出现,查看桌面底部的任务栏。它可能处于隐藏状态。(如果在看到该窗口之前出现断点,按 F5 键继续)

单击 OK。关闭 Oracle 数据库更改通知演示。

返回主题列表

我们的应用程序马上就会收到更改通知回调,但我们的事件处理程序只包含您在前面看到的对话框。下面,我们将添加代码以连接到数据库,并获取已经修改的那些行。

对于单个 SELECT 表,更改通知回调将针对表中所有经过修改的行返回 ROWID 信息。该 ROWID 将被追加到原始查询,以便您可以只检索那些经过更改的行,而不是整个数据集(检索性能较差)。然后,用刚才的新数据刷新数据集。

1.

单击 Form1.cs 选项卡。在下拉框中选择 OnMyNotificaton(..

这将带您进入 OnMyNotificaton 回调例程。

2.

在各自的注释下添加以下代码行。注释用于解释各行代码的作用。

以下代码行可将 ROWID 追加到基础查询,以便只检索经过修改的行。

DataRow detailRow = args.Details.Rows[0];
string rowid = detailRow["Rowid"].ToString();
string sqlUpdate = sqlSelect + "where rowid = \'"+ rowid +"\'";
如果还有其他更新的行,则添加以下代码行以追加到 sqlUpdate 语句
for (int i = 1; i < args.Details.Rows.Count; i++)
{
detailRow = args.Details.Rows[i];
rowid = detailRow["Rowid"].ToString();
sqlUpdate = sqlUpdate + " or rowid = \'"+ rowid +"\'";
}

3.

添加以下代码行以刷新数据。

OracleConnection con2 = new OracleConnection(constr);
OracleCommand cmd2 = new OracleCommand(sqlUpdate,con2);
con2.Open();
OracleDataAdapter da2 = new OracleDataAdapter(cmd2);
da2.Fill(ds, tablename);


4.

Build 菜单中,选择 Build Solution。

确保没有错误或警告发生。


5.

Debug 菜单中,选择 Start Debugging。这时会出现一个包含 HR 值的网格。EMPLOYEES 表出现。


6.

现在,您将更改数据库中的多行,并看到 ODP.NET 只更新那些经过更改的行。

在 Solution Explorer 中,双击 multiple_row_change.sql

7.

从 multiple_row_change.sql 中选择以下代码。 按 CTRL+C 复制该代码。

update employees set salary=salary+10 where employee_id=100 or employee_id=101;
commit;


在 Server Explorer 中,右键单击 HR.ORCL 并选择 Query Window。在 Query 窗口中,粘贴该代码并确保选择这两条语句。单击 Execute Query 运行该查询。

8.

您将收到通知警报。单击 OK

检查经过修改的行是否已在应用程序网格中刷新。

注:Oracle 数据库通过 ROWID 识别经过更改的行。OracleNotificationEventArgs 实例可将 ROWID 信息传回 ODP.NET。因此,只检索经过更改的行,而不是整个表。这就避免了应用程序刷新仍然有效的数据。

此外,您将注意到,对于每个不同的数据库更改,您都能收到一条通知。即使只修改了两行,也会作为一个单独的事件发出通知。因此,只发出了一条通知。

关闭 Oracle 数据库更改通知演示窗口。

返回主题列表

从 Oracle 数据库 11g 开始,ODP.NET 现在可以在数据库中注册其查询,并接收对象更改通知或结果集更改通知。

对象更改通知由与查询关联的对象(例如表)的 DML 或 DDL 更改引发。结果集更改通知(默认)由与查询关联的特定结果集行的 DML 或 DDL 更改引发。

结果集更改通知通过只关注选定的特定结果集来为客户端应用程序提供更好的细粒度,而对象更改通知处理程序则更加轻型。

注:这部分教程内容只能在使用 ODP.NET 11g 和 Oracle 数据库 11g 时使用。

1.

从 Visual Studio 菜单中,选择 Debug > Start Debugging。Oracle 数据库更改通知演示窗口将显示员工记录。

现在,更改数据库中的多行内容。ODP.NET 将只更新经过更改的那些行。

如果该窗口尚未打开,从 Solution Explorer 中打开 multiple_row_change.sql


2.

从 multiple_row_change.sql 中选择以下代码。 按 CTRL+C 复制该代码。

Update employees set salary=salary+10 where employee_id=200 or employee_id=201;
commit;

在 Server Explorer 中,右键单击 HR.ORCL 并选择 Query Window。在 Query 窗口中,粘贴该代码并确保选择这两个语句。单击 Execute Query 运行该查询。

完成后,您将注意到 Notification Alert 窗口仍 出现。

这是因为更新语句只影响原始查询以外的行,因此数据库通知处理程序不会采取行动。


返回主题列表

在本教程中,您学习了如何:

为 HR 授予更改通知权限
加载并运行更改通知演示应用程序
修改 Employees 表并观看更改通知事件的发生
添加回调例程以处理更改通知事件
使用结果集更改通知

返回主题列表

 

将鼠标移到该图标上可以隐藏所有屏幕截图。