質問をすることでしか得られない、回答やアドバイスがある。

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

ただいまの
回答率

87.59%

OracleDataAdapter.FillでArgmentNullExceptionが発生する

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 2,038

score 6

C#初心者です。

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

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

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

public DataTable ExecuteDataTable(string sql)
        {
            using (OracleConnection connection = new OracleConnection(connectionString))
            {
                using (OracleCommand command = new OracleCommand(sql, connection))
                {
                    OracleDataAdapter adapter = new OracleDataAdapter(command);
                    DataTable data = new DataTable();
                    //data.Clear();
                    adapter.Fill(data);//ここでエラー
                    return data;
                }
            }
        }

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • YAmaGNZ

    2019/11/28 12:20

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

    キャンセル

  • .tack

    2019/11/28 13:52

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

    キャンセル

回答 2

checkベストアンサー

+1

public DataTable ExecuteDataTable(string sql)

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

SET NULL NULL
SQL を実行


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

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


などと対応。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/11/28 13: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だと怒られているのでしょうか...

    キャンセル

  • 2019/11/28 14: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

    キャンセル

  • 2019/11/28 14:56

    Orlofsky様

    こちら、非常にお恥ずかしい話なのですが、
    tnsnames.oraを正しく参照できていないことが原因のようでした。
    app.configの<dataSources>にtnsnames.oraの内容を直接記載すると、問題なくプログラムが動作しました。

    もともとは
    https://qiita.com/monta31538/items/b31382e98ae03f5d9c3c
    を参考に、<settings>にtnsnames.oraの場所を記入していました。

    最終的にはローカルのtnsnames.oraの場所を参照にするにしたいので、もう少し試行錯誤しますが、
    元の質問からはズレてしまうため、本件は一旦クローズさせて頂きます。

    nvl関数やその他非常に丁寧に解説をしてくださったOrlofsky様の回答を、ベストアンサーにさせて頂きます。

    キャンセル

+1

コード自体に問題はありません。
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 環境変数で設定するのが楽かと思います。

正しく設定できていれば

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


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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/11/28 13:51

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

    キャンセル

  • 2019/11/28 17:43

    KOZ6.0様

    TNS_ADMIN環境変数に
    "%ORACLE_HOME%\client_1\network\admin"
    を設定することで、app.configの<oracle.manageddataaccess.client>の項目を削除しても、
    プログラムが正しく動作しました。

    有用な情報をご教授頂き、誠にありがとうございます。

    キャンセル

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

  • ただいまの回答率 87.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る