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()andClose()方法有效。我的查询或处理结果的方式有问题。谢谢。

4

2 回答 2

8

好的,reader.IsDBNull(1)返回 true 也是如此……这意味着该字段的特定行中没有数据。

你需要弄清楚这意味着什么,并适当地处理它。您可能希望修改查询以不包括此类行,或用于reader.IsDBNull检测此类行并采取适当措施,例如使用字段的默认值。

于 2011-11-04T17:54:35.800 回答
0

有时会因为 Cell 格式而发生。如果您的 Cell 格式设置为General您应该将其更改为Text

于 2014-08-12T08:43:16.333 回答