OracleCommand блокирует выполнение, если имеет OracleDependency - PullRequest
1 голос
/ 30 октября 2009

У меня есть следующий код:

OracleConnection conn = new OracleConnection(connString);
OracleCommand command = new OracleCommand("select * from testtable", conn);
conn.Open();
OracleDependency.Port = 2010;
OracleDependency dependency = new OracleDependency(command);
command.AddRowid = true;
command.Notification.IsNotifiedOnce = false;

dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);

command.CommandTimeout = 1000;
DataTable t = new DataTable();
OracleDataAdapter adapter = new OracleDataAdapter(command);
adapter.Fill(t);
conn.Close();

Это очень простой код, который использует Oracle Notification Service для получения уведомлений об определенных изменениях в таблице.

Моя проблема в том, что когда я вызываю adapter.Fill(t);, выполнение просто блокируется. Команда выполняется в экземпляре, если к нему не прикреплена зависимость, поэтому это не база данных или данные. Я вижу регистрацию обратного вызова в базе данных, запрашивая таблицу user_change_notification_regs, а также открыл указанный порт (2010):

net8://(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST='myIp')(PORT=2010)))?PR=0

Я нахожусь в тупике и изо всех сил пытаюсь.

1 Ответ

0 голосов
/ 22 декабря 2009

Я видел исключение, возникающее в аналогичной ситуации, когда я пытался установить номер порта для порта, уже используемого на моей машине. Как только я прокомментировал установку номера порта, он работал нормально, так что, возможно, вы могли бы попробовать это? И проверьте "netstat -na" для используемых портов.

Исключение, которое я увидел, было:

Oracle.DataAccess.Client.OracleException: ORA-24912: Listener thread failed. Listen failed.
at Oracle.DataAccess.Client.OracleException.HandleErrorHelper(Int32 errCode, OracleConnection conn, IntPtr opsErrCtx, OpoSqlValCtx* pOpoSqlValCtx, Object src, String procedure, Boolean bCheck)
at Oracle.DataAccess.Client.OracleException.HandleError(Int32 errCode, OracleConnection conn, String procedure, IntPtr opsErrCtx, OpoSqlValCtx* pOpoSqlValCtx, Object src, Boolean bCheck)
at Oracle.DataAccess.Client.OracleCommand.ExecuteReader(Boolean requery, Boolean fillRequest, CommandBehavior behavior)
at Oracle.DataAccess.Client.OracleDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet)

Смущает (по крайней мере, для меня) то, что исключение возникает не тогда, когда порт настроен, а позже, когда к нему был выполнен первый запрос.

...