🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Oracle Database 11g

Oracle DatabaseはRDBMSの商品です。具体的な発売商品として知られているのが、 Oracle9i、Oracle10g、Oracle 11gとOracle 12cです。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

Q&A

解決済

2回答

3493閲覧

OracleDataAdapter.FillでArgmentNullExceptionが発生する

.tack

総合スコア8

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Oracle Database 11g

Oracle DatabaseはRDBMSの商品です。具体的な発売商品として知られているのが、 Oracle9i、Oracle10g、Oracle 11gとOracle 12cです。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

0グッド

0クリップ

投稿2019/11/28 02:29

C#初心者です。

OracleDataAdapterのFill関数で、下記エラーが発生し、対応方法が分かりません。

ArgumentNullException: 値を Null にすることはできません。 パラメーター名:path1

発生する箇所のコードは次の通りです。

C#

1public DataTable ExecuteDataTable(string sql) 2 { 3 using (OracleConnection connection = new OracleConnection(connectionString)) 4 { 5 using (OracleCommand command = new OracleCommand(sql, connection)) 6 { 7 OracleDataAdapter adapter = new OracleDataAdapter(command); 8 DataTable data = new DataTable(); 9 //data.Clear(); 10 adapter.Fill(data);//ここでエラー 11 return data; 12 } 13 } 14 }

VisualStudioでDataの中身を確認すると、下記のようになっていました。
dataの要素

これを見る限りdataはnullではないと思い、確認のためエラー行の一行上にdata.Clear()を追加してみましたが、そちらではエラーは発生しませんでした。

C#はほとんど経験がなく、初心者質問で申し訳ないのですが、
こちらのエラーは何が原因なのか、ご存じの方がいらっしゃれば、ご教授頂けると幸いです。

対象Frameworkは
.NET Framework 4.7.2です。
エラーが発生しているコードはDLLとしてビルドしていて、別のプログラムから参照する形で使用しています。親プログラムも.NETのバージョンは同じく4.7.2です。
OS:Windows10 pro
Visual Studio 2019 communication

よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YAmaGNZ

2019/11/28 03:20

どのようなSQLを実行しているのですか?
.tack

2019/11/28 04:52

"select * from table1 where id = 'xxxx' "というSQLを実行していました。
guest

回答2

0

コード自体に問題はありません。
connectionString と sql が正しければ動きますので、中身を確認してください。

#追記
tnsnames.ora を参照する順番は以下の URL を参照してください。

「ローカル・ネーミング・パラメータ(tnsnames.ora)」
https://docs.oracle.com/cd/E16338_01/network.112/b56287/tnsnames.htm#i433681

Oracle.ManagedDataAccess の場合は、この前に app.config の設定がくるわけですが、app.config での記述はやめて TNS_ADMIN 環境変数で設定するのが楽かと思います。

正しく設定できていれば

C#

1 OracleClientFactory factory = OracleClientFactory.Instance; 2 DataTable dt = factory.CreateDataSourceEnumerator().GetDataSources();

で、dt に設定が格納されます。

投稿2019/11/28 03:18

編集2019/11/28 07:09
KOZ6.0

総合スコア2707

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

.tack

2019/11/28 04:51

sql文がsqlplusで正しく動くことは確認しました。 connectionStringは "User ID=user;Password=pass;Data Source=EOA05" となっています。 (App.configでtnsnames.oraの場所は指定しています。) sqlの中身を select 'test' from dual に変更しても同様のエラーが発生しました。
.tack

2019/11/28 08:43

KOZ6.0様 TNS_ADMIN環境変数に "%ORACLE_HOME%\client_1\network\admin" を設定することで、app.configの<oracle.manageddataaccess.client>の項目を削除しても、 プログラムが正しく動作しました。 有用な情報をご教授頂き、誠にありがとうございます。
guest

0

ベストアンサー

public DataTable ExecuteDataTable(string sql)

string sql の内容を sqlplus で実行して本当にNULLが入っていないか確認しては?

SQL

1SET NULL NULL 2SQL を実行

NULLが入っている列があれば

SQL

1SELECT ... 2 , NVL(NUM1, 0) AS NUM1 -- 数値型列 3 , NVL(CHAR1, ' ') AS CHAR1 -- 文字型列 4...

などと対応。

投稿2019/11/28 02:47

編集2019/11/28 03:26
Orlofsky

総合スコア16417

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

.tack

2019/11/28 04:45

Orlofsky様 SQL文ですが、"select * from table where ..."となっており、 返ってきた文にも値がNULLのフィールドがありましたので、 ご教授頂いた通り、 ```SQL select nvl(f1,' ') as f1, nvl(f2,' ') as f2 where ... ``` と修正しましたが、エラーが発生しました。 更に、 ```SQL public DataTable ExecuteDataTable(string sql) { sql = "select 'test' from dual"; using (OracleConnection connection = new OracleConnection(connectionString)) { using (OracleCommand command = new OracleCommand(sql, connection)) { OracleDataAdapter adapter = new OracleDataAdapter(command); DataTable data = new DataTable(); adapter.Fill(data); return data; } } } ``` のように、sql = "select 'test' from dual"を追記しても、 エラーが発生しました。 どこの値がNullだと怒られているのでしょうか...
Orlofsky

2019/11/28 05:34

>OS:Windows10 pro Oracle Client のバージョンは? Windows10 Proに対応していますか? Oracle11.2 Database Client インストレーション・ガイド for Microsoft Windows ソフトウェア要件 https://docs.oracle.com/cd/E16338_01/install.112/b58879/pre_install.htm#CIHIAGFG Oracle12.1 Database Client インストレーション・ガイド for Microsoft Windows ソフトウェア要件 https://docs.oracle.com/cd/E57425_01/121/NTCLI/pre_install.htm#CIHIAGFG Oracle12.2 Database Client インストレーション・ガイド for Microsoft Windows ソフトウェア要件 https://docs.oracle.com/cd/E82638_01/ntcli/oracle-database-client-software-requirements.html#GUID-DED9F165-5E75-40FD-B5F9-9A5628536C26
.tack

2019/11/28 05:56

Orlofsky様 こちら、非常にお恥ずかしい話なのですが、 tnsnames.oraを正しく参照できていないことが原因のようでした。 app.configの<dataSources>にtnsnames.oraの内容を直接記載すると、問題なくプログラムが動作しました。 もともとは https://qiita.com/monta31538/items/b31382e98ae03f5d9c3c を参考に、<settings>にtnsnames.oraの場所を記入していました。 最終的にはローカルのtnsnames.oraの場所を参照にするにしたいので、もう少し試行錯誤しますが、 元の質問からはズレてしまうため、本件は一旦クローズさせて頂きます。 nvl関数やその他非常に丁寧に解説をしてくださったOrlofsky様の回答を、ベストアンサーにさせて頂きます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問