在从 MS Access 数据库获取 Long 后使用 OleDbDataReader.GetInt64() 时出现 System.InvalidCastException

Posted

技术标签:

【中文标题】在从 MS Access 数据库获取 Long 后使用 OleDbDataReader.GetInt64() 时出现 System.InvalidCastException【英文标题】:Getting System.InvalidCastException when using OleDbDataReader.GetInt64() after fetching Long from MS Access database 【发布时间】: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 仍然可以正常工作。 【参考方案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

以上是关于在从 MS Access 数据库获取 Long 后使用 OleDbDataReader.GetInt64() 时出现 System.InvalidCastException的主要内容,如果未能解决你的问题,请参考以下文章

在从 JS 到 PyQt5 的鼠标点击时存储 lat long

完全停留在从访问数据库中获取数据,IIS 7 服务器 2008 PHP 5.4 Access 2010

从相邻单元格获取数据 - MS Access - Java [关闭]

从 Ms Access Mdb 文件获取数据到 sql server 2005 的最佳方法

SQL Server 数字数据类型在 MS Access 中变成 Short_Text

MS Access 未打开时 DMax 功能不起作用