C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

C#でOracleDBに接続時にNullRefエラーが出る。

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■96725 / inTopicNo.1)  C#でOracleDBに接続時にNullRefエラーが出る。
  
□投稿者/ 鈴木次郎 (1回)-(2021/01/16(Sat) 15:39:10)

分類:[C#] 

開発環境
Winddows10 64bitOS
Visial Studio 2019 Community版
C#
※C#のバージョンというものがよくわかっていませんが、 .net framework 4.5のことでよろしいでしょうか。

C#でOracleDBからSelectしてデータを取り出す処理を作成しようとしています。
しかしSelectどころかOpenの段階でNullReferenceExceptionエラーが出てしまい処理を進めることができません。

下のコードを走らせるて作られるボタンをクリックすると、ポップアップで「接続文字列作成」が表示され、OKを押すと、NullReferenceExceptionエラーを吐きます。
エラーの詳細を見る限りoracleConnection.Open()の箇所なので何かしら接続にいたる部分でエラーを吐いているのだとは思いますが・・・。
NullReferenceExceptionエラーが出るのが接続文字列が間違っている(存在しないIPに接続しようとしているとか)なのか、そもそもの接続に関する根本的な間違いなのかもわかっていません。
具体的に何が悪いのか、あるいは間違っている可能性として接続文字列なのか、コードそのものがおかしいのかご教授いただけますか。


接続文字列は下記方法以外に、tnsnames.oraを使う方法もあるようでしたが、最終的にOracleクライアントをインストールしていない端末で使用したいためtnsnames.oraは使っていません。
(コンフィグをあれこれすればできそうだとは思ったのですが、ちょっとわからないことが多くて諦めました)
Usingの一部を省略しています。またIPアドレス、フィールド名等は変更していますが'",;あたりは変わらないようにしたつもりです。


using Oracle.ManagedDataAccess;
    public partial class Form_Test : Form
    {
        private void Button_Test_Click(object sender, EventArgs e)

            MessageBox.Show("開始");
            string sqlText = "SELECT F1,F2 FROM T1 WHERE F1='0000001'";
            try
            {
                using (Oracle.ManagedDataAccess.Client.OracleConnection oracleConnection = new Oracle.ManagedDataAccess.Client.OracleConnection())
                {
                    MessageBox.Show("接続準備");
                    oracleConnection.ConnectionString = 
                        "User ID = AA; Password = BB; Data Source=" +
                        "(DESCRIPTION=" +
                          "(ADDRESSLIST=" +
                            "(ADDRESS=" +
                                "(PROTOCOL=TCP)" +
                                "(HOST=100.100.10.100)" +
                                "(PORT=1521)" +
                            ")" +
                          ")" +
                          "(CONNECT_DATA=" +
                            "(SERVICE_NAME=CC)" +
                          ")" +
                        ")";
                    MessageBox.Show("接続文字列作成");
                    oracleConnection.Open();
                    MessageBox.Show("接続");
                    using (Oracle.ManagedDataAccess.Client.OracleCommand oracleCommand = new Oracle.ManagedDataAccess.Client.OracleCommand(sqlText))
                    {
                        oracleCommand.Connection = oracleConnection;
                        oracleCommand.CommandType = CommandType.Text;
                        using (Oracle.ManagedDataAccess.Client.OracleDataReader oracleDataReader = oracleCommand.ExecuteReader())
                        {
                            while (oracleDataReader.Read())
                            {
                                MessageBox.Show(oracleDataReader["F1"] + "_" + oracleDataReader["F2"]);
                            }
                        }
                    }
                }
            }
            catch(Exception error)
            {
                MessageBox.Show(error.ToString());
            }
        }

引用返信 編集キー/
■96726 / inTopicNo.2)  Re[1]: C#でOracleDBに接続時にNullRefエラーが出る。
□投稿者/ WebSurfer (2183回)-(2021/01/16(Sat) 17:28:13)
No96725 (鈴木次郎 さん) に返信

> しかしSelectどころかOpenの段階でNullReferenceExceptionエラーが出てしまい処理を進めることができません。

デバッガを使えるのは質問者さんだけなのですから、デバッガ鵜を使って何が null になるのか
調べてください。
引用返信 編集キー/
■96730 / inTopicNo.3)  Re[1]: C#でOracleDBに接続時にNullRefエラーが出る。
□投稿者/ KOZ (159回)-(2021/01/17(Sun) 03:22:49)
No96725 (鈴木次郎 さん) に返信
> NullReferenceExceptionエラーが出るのが接続文字列が間違っている(存在しないIPに接続しようとしているとか)なのか、そもそもの接続に関する根本的な間違いなのかもわかっていません。

接続文字列が間違っています。
ADDRESSLIST でなくて ADDRESS_LIST です。
引用返信 編集キー/
■96756 / inTopicNo.4)  Re[2]: C#でOracleDBに接続時にNullRefエラーが出る。
□投稿者/ 鈴木次郎 (2回)-(2021/01/23(Sat) 22:09:54)
2021/01/23(Sat) 22:10:22 編集(投稿者)
2021/01/23(Sat) 22:10:19 編集(投稿者)

No96725 (鈴木次郎 さん) に返信

> しかしSelectどころかOpenの段階でNullReferenceExceptionエラーが出てしまい処理を進めることができません。

デバッガを使えるのは質問者さんだけなのですから、デバッガ鵜を使って何が null になるのか
調べてください。

NullReferenceExceptionエラーはNullが入りえない変数にNullを入れようとして、入れる前に吐くエラーだと思っていましたがウォッチ式で見つけられるのでしょうか


No96730 (KOZ さん) に返信
> ■No96725 (鈴木次郎 さん) に返信
>>NullReferenceExceptionエラーが出るのが接続文字列が間違っている(存在しないIPに接続しようとしているとか)なのか、そもそもの接続に関する根本的な間違いなのかもわかっていません。
>
> 接続文字列が間違っています。
> ADDRESSLIST でなくて ADDRESS_LIST です。

ありがとうございます。
無事解決しました。


お二方回答ありがとうございます。
無事DBに接続できるようになりました。
(SQL文もどこか間違っていたようでそっちのエラーを返しましたが、サンプルで適当に書いただけなのでゆっくり考えます。)
解決済み
引用返信 編集キー/
■96760 / inTopicNo.5)  Re[3]: C#でOracleDBに接続時にNullRefエラーが出る。
□投稿者/ 魔界の仮面弁士 (2959回)-(2021/01/25(Mon) 11:25:27)
補足事項を追記。
解決済みチェックは付けたままにしておきます。

No96756 (鈴木次郎 さん) に返信
>>接続文字列が間違っています。
> 無事解決しました。

EZCONNECT (簡易接続ネーミング メソッド) 表記でも通るかと思います。

oracleConnection.ConnectionString = "User ID=AA;Password=BB;Data Source=100.100.10.100:1521/CC";


> NullReferenceExceptionエラーはNullが入りえない変数にNullを入れようとして、入れる前に吐くエラーだと思っていましたが

いえ、むしろ逆です。
NullReferenceException は基本的に、「null が入りえる変数」でしか発生しない例外です。

もしも null を許容していない変数への代入時にエラーになったというのであれば、
null 非許容のコンパイルエラーか、あるいは型変換例外などになっていたことでしょう。


NullReferenceException とは、
「null (≠Null) を格納可能な変数」に「null が格納されている状態」の時に、
その変数の「インスタンス メンバー」を呼び出した時に発生する例外です。

喩えていえば、「上司から『この名刺の社長さんに年賀の挨拶をしにいくぞ』と言われたけれど、
この名刺、空白で何も書かれてないよ。どこに行くというのだろう?」的なエラー。


具体的なコードで言えば、
 OracleConnection oracleConnection = null;
 oracleConnection.ConnectionString = "User ID=AA";
のようなケースや、
 string st = null;
 MessageBox.Show(st.Trim());
のようなエラーです。


> ウォッチ式で見つけられるのでしょうか
エラーが発生した時に、どのプロパティやメソッドの呼び出しで失敗しているのかを調べ、
そのメソッドの参照先の変数が null になっていないかをウォッチ式で確認してみてください。

もしもエラーがトラップされている場合は、例外を捕らえた場所を特定する必要があるため、
StackTrace や呼び出し履歴を辿って、実際のエラー発生元を調査するようにします。


しかし今回のケースのように、クラスの内部例外で発生したものについては、
ウォッチ式等では原因を判断できないでしょう。

今回のエラーの原因は KOZ さんが答えてくださったように、
ConnectionString に渡した接続文字列のスペルミスであったわけですが、
今回のケースは ODP.NET 自体の実装にも問題があるようです。

本来であれば、ConnectionString の問題に対して System.NullReferenceException が返されるべきではなく、
Oracle.ManagedDataAccess.Client.OracleException や
System.InvalidOperationException あたりとなるのが適切ですね。

試しに同種の指定ミスを Oracle.ManagedDataAccess.Client.OracleConnection 以外で試してみると、
System.Data.OracleClient.OracleException が使われていた場合には、
 System.Data.OracleClient.OracleException: ORA-12533: TNS: ADDRESSパラメータが無効です
という、もっと分かりやすい例外が出力されていました。


ちなみに ODP.NET の場合は、app.config で

<configuration>
<oracle.manageddataaccess.client>
<version number="*">
<settings>
<setting name="TraceLevel" value="7" />
<setting name="TraceOption" value="1" />
</settings>
</version>
</oracle.manageddataaccess.client>
</configuration>

を書いておくと、%TEMP% の ODP.NET\managed\trace\ フォルダー内に
詳細なエラートレースログ(.trc)が出力される仕様になっています。
https://docs.oracle.com/cd/E77579_01/win.121/e72575/InstallManagedConfig.htm#ODPNT8162

まぁそのトレースが今回の問題の解決に役立つ内容であるかというと、正直微妙なところですが…。
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ