【问题标题】:Getting System.InvalidCastException when using OleDbDataReader.GetInt64() after fetching Long from MS Access database在从 MS Access 数据库获取 Long 后使用 OleDbDataReader.GetInt64() 时出现 System.InvalidCastException
【发布时间】:2015-03-25 19:40:21
【问题描述】:

我一直在从事一个项目(使用 Visual Studio 2013),我需要从本地存储的 MS Access 2007 数据库中检索信息。我目前正在使用 OleDb 处理连接。数据库有一个表,有几个字段。我正在尝试从 SID 中检索值 - 这是主键,在 Access 中设置为 Auto-Number as a Long Integer。

这是我的问题:当 OleDbDataReader 完成执行并尝试检索结果(使用 GetInt64 方法)时,我收到此错误:

System.Data.dll 中出现“System.InvalidCastException”类型的未处理异常

附加信息:指定的演员表无效。

无论我是否将结果分配给一个值,都会发生这种情况。 更改对 GetInt32 的调用使其工作,但我不知道为什么!

谁能解释为什么会这样?

我在这里和其他地方进行了广泛的搜索,大多数情况下他们建议字段类型在 Access 中没有设置为长整数,但我的已经设置了,所以我认为这不是问题所在。其他解决方案似乎都不适用或工作。

我已经从我的主应用程序中提取了问题代码,并剥离了所有非必要的代码,仍然得到错误,这里是简单的版本:

        // Set up connection and test query
        OleDbConnection connection = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Users\\Combobulator\\Desktop\\Testing Databases\\Reagents Database\\Reagents.mdb");
        string query = "SELECT SID FROM MolTable WHERE [Chemical Name] = 'Acetyl Chloride'";
        
        OleDbCommand command = new OleDbCommand(query, connection);

        try {
            connection.Open();
            OleDbDataReader reader = command.ExecuteReader();

            if (!reader.HasRows) {
                System.Console.WriteLine("Returned no rows.");
                Environment.Exit(-1);
            }

            // Find all matching entries
            while (reader.Read()) {
               reader.GetInt64(0);   // This is where the error is thrown
            }

            // Close the reader and connection
            reader.Close();
        } catch (OleDbException e) {
            System.Console.WriteLine("Error: " + e.Errors[0].Message);
        } finally {
            connection.Close();
        }

我完全被难住了,这是我第一次不得不在网上寻求帮助。

感谢您抽出宝贵时间阅读!

编辑:我忘了提,这不仅仅是我混淆了 Access 中 Long Integer 的长度,是吗?我假设它是 64 位的,如果我错了,请纠正我。

【问题讨论】:

  • 尝试调用GetValue,看看返回什么...
  • 如果您尝试使用实际字段名称 (Int64)reader["SID"]; 调用它,假设您正在使用调试器,那么当您单步执行代码时,您调用 ExecuteReader 后读取器对象的值是多少() 方法..你确定它甚至返回数据..?你确定数据类型是 Int64 还是数据类型的字符串..?如果您尝试使用GetInt32() 方法或尝试@JonSkeet 的建议会怎样
  • @Jon 它返回与 GetInt32 相同的值 - 我正在寻找的值,在本例中仅为 13。将其转换为 long 不起作用,转换为 Int 可以。如果必须,我可以使用 32 位,但我真的很想弄清楚这里发生了什么!感谢您的快速回复:)
  • 啊,我误读了这个问题。我认为GetInt32 没有 工作。
  • @MethodMan 使用字段名称调用会产生与上述相同的错误。执行调用后读取器对象值为 System.Data.OleDb.OleDbDataReader - gyazo.com/431e25a6ee3e08426b76d4d2980a5168 这是执行调用后立即调试器的图片。 GetInt32 仍然可以正常工作。

标签: c# exception ms-access-2007 oledb


【解决方案1】:

我忘了说,这不仅仅是我混淆了 Access 中 Long Integer 的长度,是吗?我假设它是 64 位的,如果我错了,请纠正我。

是的,我认为这正是的问题。比如来自"Field types in MS Access"

Access 中的整数有 1、2 和 4 字节类型。单字节数命名为 Byte(范围 0-255),双字节数命名为 Integer(-32768 到 32767),然后是 Long Integer(-20 亿到 20 亿)。

This site 同意。)

MS 文档很少,但 HansUp 发现了这个 "Introduction to data types and field properties",其中包括:

字段大小

  • ...
  • Lo​​ng Integer - 用于范围从 -2,147,483,648 到 2,147,483,647 的整数。存储要求为 4 个字节。

【讨论】:

  • 啊哈!不敢相信我错过了,看来我需要学会爱 Int32!非常感谢,谢谢!
  • 如果你还想要微软链接,here is one
猜你喜欢
  • 1970-01-01
  • 2020-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多