0

次のようなコードがあります。

SqlDataReader sdr = null;
.
.
sdr = cmd.ExecuteReader();

while(sdr.Read()){
    string x = sdr["x"].ToString();
    Console.WriteLine(x);
    long? y = Int64.Parse(sdr["y"].ToString());
}

現在、y の値を解析する際の問題をデバッグしています。データベースでは、コンソールに書き込まれた値 x について、y は数値であると表示されます (そうでない場合は null になります)。

例外がスローされたら、sdr にカーソルを合わせて、保存されている実際のデータに移動します。要素 [0] の値は、画面に書き込まれたばかりの値 x に対応します。つまり、x の正しい値が表示されていることがわかるため、x は確実にアクセスされます。ただし、Visual Studio 2008 では、デバッグ時にオブジェクトのメモリを確認すると、最初の要素には、コンソールに表示されたものと同じ x 列の値がありません!

・アクセスした要素が見えないのはなぜ?-この問題は、数値が正しく解析されていないことに関連していますか?

もう 1 つ奇妙なことに気付きました。Visual Studio で sdr オブジェクトを初めて見たときに、要素が表示されます。マウスを画面の反対側に移動してから、オブジェクトにカーソルを合わせて、sdr リーダー オブジェクトの要素を反復処理しようとすると、要素がありません-あたかも空であるかのように?!?!

4

1 に答える 1

0

本当にそれは SqlDataReader を操作する方法ではありません...

@TimSchmelter によって述べられたコンパイルの問題を切り離すと、SqlDataReader の値にアクセスして変換する前に、DBNull.Value をチェックするコードを記述する必要があります。

string x = string.Empty;
int index = sdr.GetOrdinal("x");
if (!sdr.IsDBNull(index))
     x = sdr.GetString(index);

long? y;
index = sdr.GetOrdinal("y");
if (!sdr.IsDBNull(index))
    y = sdr.GetInt64(index);
于 2012-11-16T10:24:38.050 に答える