0

文字列配列「internalDives」に項目を追加すると、メソッドが終了し、デバッグ エラーが表示されない理由を理解するのに苦労しています。

ここで何が間違っていたのですか?

private void GridDataConnection()
{
    using (SqlCeConnection conn = new SqlCeConnection(ConnectionString))
    {
        conn.Open();

        using (SqlCeCommand command = new SqlCeCommand("SELECT id,divelocation,divedate,diveduration FROM loggeddives", conn))
        {
            SqlCeDataReader readDiveResult = command.ExecuteReader();

            var diveList = new List<string[]>();

            while (readDiveResult.Read())
            {
                string[] internalDives = new string[4];

                internalDives[0] = readDiveResult.GetString(0);
                internalDives[1] = readDiveResult.GetString(1);
                internalDives[2] = readDiveResult.GetString(2);
                internalDives[3] = readDiveResult.GetString(3);

                diveList.Add(internalDives);

                i++;
            }
        }

        conn.Close();
    }
}
4

4 に答える 4

2

すべての列タイプが文字列であることを確認しますか?GetStringは変換を行わず、すべての列が文字列型であると想定します。をキャッチするには、trycatchステートメントを使用することをお勧めします InvalidCastException

すべての値がインスタンス化されていることも確認してください。IsDBNullメソッドでそれを行うことができます。

于 2012-07-24T19:46:08.477 に答える
0

データベースにnull値があると思うので、列の1つを読み込もうとすると、「データはnullです。このメソッドまたはプロパティはnull値で呼び出すことはできません」というエラーが表示されます。IsDBNull メソッドを呼び出して、値が null かどうかを確認してから、値を読み取る必要があります。

このコードを試してください

private void GridDataConnection()
{
    using (SqlCeConnection conn = new SqlCeConnection(ConnectionString))
    {
        conn.Open();

        using (SqlCeCommand command = new SqlCeCommand("SELECT id,divelocation,divedate,diveduration FROM loggeddives", conn))
        {
            SqlCeDataReader readDiveResult = command.ExecuteReader();

            var diveList = new List<string[]>();

            while (readDiveResult.Read())
            {
                string[] internalDives = new string[4];

                internalDives[0] = readDiveResult.IsDBNull(0) ? "": readDiveResult.GetString(0);
                internalDives[1] = readDiveResult.IsDBNull(1) ? "": readDiveResult.GetString(1);
                internalDives[2] = readDiveResult.IsDBNull(2) ? "": readDiveResult.GetString(2);
                internalDives[3] = readDiveResult.IsDBNull(3) ? "": readDiveResult.GetString(3);

                diveList.Add(internalDives);

                i++;
            }
        }

        conn.Close();
    }
}
于 2012-07-24T19:42:59.670 に答える
0

私は通常、配列またはリストに追加する前に、クエリから返される情報を検証します。すべての値が文字列であることを確認するための簡単なチェックを行い、おそらくカウントを取得して 4 つの値があることを確認します。他の人が言及しているように、try catch は非常に役に立ちます。クイック エラー ログを作成して、例外を一時ファイルにダンプすることもできます。

最初の答えは優しく!

于 2012-07-24T19:50:51.657 に答える
0

最初にすべきことは、コメントで mservidio が述べたように、スローされている例外を確実にキャッチすることです。

おそらく、GetString への呼び出しの 1 つが IndexOutOfBoundsException をスローしていることがわかります。そのため、コードを慎重にステップ実行し、読み取りパイプラインを下っていくものを確認する準備をしてください。あなたが思っているようなものではないかもしれません。

于 2012-07-24T19:42:16.300 に答える