2012-04-02 12 views
3

私は、アプリケーション構成ファイルで定義されているSQL ServerとOracle Databaseの両方にC#アプリケーションを作成しています。 SQL Server環境でコードを実行すると、正常に動作します。私は正しい結果を得る。OracleDataAdapterが問合せからDataTableを埋めていない

サーバコードはここにある作業SQL:次のように

sqlConn.Open(); 
stmt = "SELECT ACTION_ID, ACTION FROM DB.ACTIONS WHERE ACTION_DATE < GETDATE() AND STATUS = 'Pending'"; 
SqlDataAdapter sqlAdapt = new SqlDataAdapter(stmt, sqlConn); 
sqlAdapt.Fill(dt); 
sqlConn.Close(); 

Oracleのコードに動作していないです。

oraConn.Open(); 
stmt = "SELECT ACTION_ID, ACTION FROM DB.ACTIONS WHERE ACTION_DATE < SYSDATE AND STATUS = 'Pending'"; 
OracleDataAdapter oraAdapt = new OracleDataAdapter(stmt, oraConn); 
oraAdapt.Fill(dt); 
oraConn.Close(); 

私は結果とデータテーブルDTを埋めるためにしようとしています。私はDataSetを最初に使用し、DataSetでDataSetを埋めようとしましたが、SQL Serverで行ったときにOracleでは機能しませんでした。単純な行方不明のものがあるようです。

私はエラーが発生していない、私はちょうどそこからデータがあることを知っているにもかかわらず、Oracleから0の結果セットを取得しています。

+0

OracleではどのバージョンのOracleを使用していますか?また、Oracleでスキーマの名前を使用していますか? – Turbot

+0

私は10.2を使用しています。この例では、実際には別のものでも、スキーマは「DB」です。 SQL Developerでクエリを実行すると2つの結果が得られます。 – Matthew

+0

Oracle Database 10g Express Editionリリース10.2.0.1.0 - 製品 PL/SQLリリース10.2.0.1.0 - 製品 CORE \t 10.2.0.1.0 \tプロダクション 32ビットWindows用TNS:バージョン10.2.0.1.0 - Production NLSRTLバージョン10.2.0.1.0 - Production – Matthew

答えて

3

問題は、データベースにログインしていたDBOアカウントがテーブルへのアクセス権を持っていないことでした。私は簡単な助成金をかけて、それは素晴らしい仕事をした。

GRANT SELECT ON DB.ACTIONS TO USER; 
0

(たとえば、sqlplus、TOAD、SQLDEveloperなどを使用して)DBで直接クエリを実行します。それは何かを返しますか? そうでない場合:

a)SQL Serverのテキスト比較(STATUS = 'Pending')では、Oracleでは大文字と小文字を区別しませんが、大文字と小文字が区別されます。たとえば、「保留」のようなステータス列にデータがあるとしますか?

b)ACTION_DATEは日付データ型ですか? varcharの場合は動作しません。

希望します。

+0

クエリはSQLDeveloperで正常に実行されます。フィールドタイプは正しいです。 Oracle:ACTION_DATEはDATEで、statusのフィールド値はPendingです – Matthew

+0

その他の理由:1)SQLDeveloperを使用してテストデータを挿入したのはあまりにも明白でしょうか?もしそうなら、取引をコミットしましたか? 2)SQLDeveloperとC#アプリケーションで同じユーザー名を使用してdbに接続していますか?私はそうは考えていませんが、Oracleでは、あるユーザーが他のユーザー(OracleのVPDと呼ばれる行レベルのセキュリティ)を隠しているレコードを表示できるポリシーをOracleで作成することは可能です。 – arturro

+0

テーブルのアクセス権の問題です。私はしなければならなかった 付与するDB.ACTIONSをROLE; OracleDataAdapterはテーブルの列を認識していましたが、DBOとしてログインしていてもテーブルにアクセスする権限があるかどうかはわかりません。 ありがとうございます。 – Matthew

0

あなたのコードを変更して診断レベルを分けることをお勧めします。

1)ステートメントを単純な「select sysdate from dual;」に置き換えます。行の戻り値があるかどうかを確認します。

2)何も返さない場合は、接続の問題である可能性があります。接続プロパティを表示します。

3)何かが返されてもデータセットに入力されない場合は、oracleリーダーを使用して出力をスローし、実際に結果を確認してみてください。

希望すると、これが役立ちます。

+0

oracleセクションのコードをstmt = "SELECT 1 AS ACTION_ID"に変更すると、 "SYS.DUALからのACTIONを試して"私のDataTableに結果が得られます – Matthew

+0

テーブルの権限の問題でした。私はしなければならなかった 付与するDB.ACTIONSをROLE; OracleDataAdapterはテーブルの列を認識していましたが、DBOとしてログインしていてもテーブルにアクセスする権限があるかどうかはわかりません。 ありがとうございます。 – Matthew

関連する問題