1

Oracle ODP.NET マネージド ドライバーを使用して、C# からクエリを発行しています。

データを返すのに永遠にかかった、私が書いた多くのクエリがありました。私の行制限句を無視していたように:

SELECT TOP 10 * 
FROM Customers

また

SELECT * 
FROM Customers
FETCH FIRST 10 ROWS ONLY

オラクルが私の10行の制限を無視しているようで、すべてを返し始めました-返すのに永遠に時間がかかっていたからです。最終的に、クエリが大量のデータを返すのに忙しかったわけではないことに気付きました。クエリ SQL が無効でした。

Oracle に無効な SQL を発行しても、エラーで失敗することはありません。

  • select top 10 * from customers;
  • select 'Hello, world!';
  • select sysdate from duel;
  • select sysdate fro;
  • Ceilings make pie and markers drive the ocean with their feet

Oracle は、コマンドのタイムアウトが期限切れになるまで待機します。

IDbCommand cmd = connection.CreateCommand();
cmd.CommandText = "Ceilings make pie and markers drive the ocean with their feet";

IDataReader rdr = cmd.ExecuteReader(); //<--will wait forever

while (rdr.Read()) 
{
   //...
}

私は最終的に、Oracle.ManagedDataAccess.Client.OracleCommandオブジェクトには (奇妙なことに) がないことに気付きましたCommandTimeout。デフォルトでは永久に実行されます。より妥当な 30 秒に変更すると、次のエラー メッセージが表示され始めます。

ORA-12537: ネットワーク・セッション: ファイルの終わり

Oracle ODP.NET、マネージド ドライバー、接続文字列、またはOracleCommandSQL ステートメントにエラーがある場合にサーバーにエラーをスローするように指示するオプションはありますか?

ボーナスおしゃべり

Oracle は、ADO.net 用に 2 つのデータベース ドライバを提供します。

  • 1 つは、すでにインストールしている必要がある 100MB のネイティブ データベース ドライバの ADO.net マネージド ラッパーです ( Oracle.DataAccess ) 。
  • もう 1 つは、純粋なマネージド コードで記述されたスタンドアロンの 3.8 MB ドライバーで、他の依存関係はありません ( Oracle.ManagedDataAccess ) 。

Microsoft は、.NET Framework に含まれる Oracle ドライバーを作成しました。しかし、そのドライバーは非推奨であり、.NET 4.5 では機能しなくなりました。完全な Oracle クライアント ソフトウェア バージョン 8.1.7 以降をインストールする必要があります ( System.Data.OracleClient )

4

0 に答える 0