1

私の C# (.NET 3.5) アプリケーションが MS Access 2007 データベースにアクセスしようとすると、OleDbReader.GetString()メソッドは例外をスローします。

指定されたキャストは無効です。

私は何を間違っていますか?

OleDbCommand cmd = null;
OleDbDataReader reader = null;
String queryString = "SELECT ids.ENUM_H, bas.[BAS BACnet Object Type/Instance] FROM [OV2 BAS] AS bas INNER JOIN [OV2 RefID] AS ids ON bas.[Ref ID] = ids.[Ref ID]";

this.Open();

try
{
    cmd = new OleDbCommand(queryString, this._conn);
    reader = cmd.ExecuteReader();

    if (!reader.HasRows)
    {
        Exception e = new Exception("Read of mapping table returned no results.");
        throw e;
    }
    else
    {
        while (reader.Read())
        {
            Int32 index;
            String classTypeString = null; // = reader.GetString(reader.GetOrdinal(MappingTable.OBJECT_IDENTIFIER_COLUMN_NAME)).Substring(0, 2);
            int it = reader.GetOrdinal(MappingTable.OBJECT_IDENTIFIER_COLUMN_NAME);
            string st = reader.GetString( it );  // <-- **Exception is thrown here** <--
            st = st.Substring(0,2);
            String classIdString = reader.GetString(reader.GetOrdinal(MappingTable.OBJECT_IDENTIFIER_COLUMN_NAME)).Substring(2);

            index = Convert.ToInt32(classIdString);
            ClassIds[index, 0] = reader.GetString(reader.GetOrdinal("ENUM_H"));
            ClassIds[index, 1] = classTypeString;
        }
    }
}
catch (Exception e)
{
    Console.WriteLine("ERROR: " + e.Message);
    Console.WriteLine(e.ToString());
    throw e;
}

this.Close();

Open()メソッドとメソッドが機能することはわかっていClose()ます。クエリ、または結果の処理方法に問題があります。ありがとう。

4

2 に答える 2

8

わかりました、そうreader.IsDBNull(1)です true を返します...これは、そのフィールドの特定の行にデータがないことを意味します。

それが何を意味するのかを理解し、適切に処理する必要があります。そのような行を含めないようにクエリを変更するか、フィールドのデフォルト値を使用するなど、そのような行reader.IsDBNull検出して適切に動作するように使用することができます。

于 2011-11-04T17:54:35.800 に答える
0

セル形式が原因で発生することがあります。Cell フォーマットがGeneralに設定されている場合は、 Textに変更する必要があります。

于 2014-08-12T08:43:16.333 に答える