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、マネージド ドライバー、接続文字列、またはOracleCommand
SQL ステートメントにエラーがある場合にサーバーにエラーをスローするように指示するオプションはありますか?
ボーナスおしゃべり
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 )