在从 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",其中包括:
字段大小
... Long 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 的最佳方法