C#用ソースコード


using Oracle.DataAccess.Client;
using Oracle.DataAccess.Types;

namespace ChangeNotifyCS
{
  public partial class Form1 : Form
  {
    public Form1()
    {
      InitializeComponent();

      empOracleConnection1.Open();
      //変更通知用のポートを指定します
      OracleDependency.Port = 1005;
      OracleDependency dep =
          new OracleDependency(empSelectOracleCommand1);
      empSelectOracleCommand1.Notification.IsNotifiedOnce = false;
      //イベントハンドラを追加
      dep.OnChange +=
          new OnChangeEventHandler(OnMyNotificaton);
      //EMP表の取得
      empOracleDataAdapter1.Fill(this.emp1.Emp);
    }

    private void btnCommit_Click(object sender, EventArgs e)
    {
      empOracleDataAdapter1.Update(this.emp1.Emp);
    }
リスト1 変更通知イベントハンドラとEMP表の表示/更新(C#)

//イベント(Notification)が発生した時の処理
public void OnMyNotificaton(object src,
    OracleNotificationEventArgs arg)
{
  //OracleNotificationEventArgsのROWIDを基に、変更行データを取得
  foreach (DataRow detailRow in arg.Details.Rows)
  {
    string rowid = detailRow["Rowid"].ToString();
    string sqlupdate =
      "SELECT emp.*, emp.rowid FROM emp WHERE rowid = '" 
      + rowid + "'";
    OracleConnection con2 = new OracleConnection(
      "USER ID=scott;DATA SOURCE=ORCL10GR2;PASSWORD=tiger;" 
      + "PERSIST SECURITY INFO=true;");
    OracleCommand  cmd2 = new OracleCommand(sqlupdate, con2);
    con2.Open();
    OracleDataReader dr2 = cmd2.ExecuteReader();

    Int32 iRow;
    if (dr2.Read())
    {
      //OracleNotificationEventArgs.ResourceNamesよりオブジェクト名を取得
      string msgtitle = arg.ResourceNames[0].ToString 
        + "が変更されました";
      string msgdesc = "EMPNO=" + dr2["empno"].ToString()
        + " ENAME=" + dr2["ename"].ToString()
        + "が変更されました。" + "\r\n" + "表示を更新しますか?";

      if (MessageBox.Show(msgdesc, msgtitle,
        MessageBoxButtons.YesNo) == DialogResult.Yes)
      {
        for (iRow = 0; iRow < gvEmp.Rows.Count; iRow++)
        {
          if (gvEmp.Rows[iRow].Cells[0].Value.ToString() ==
              dr2["empno"].ToString())
          {
            gvEmp.Rows[iRow].Selected = true;
            break;
          }
        }
        //更新されたデータをDataGridViewに表示
        empOracleDataAdapter1.Fill(emp1.Emp);
      }
    }
    con2.Close();
  }
}
リスト3 コンストラクタに変更通知のイベントハンドラを追加(C#)