为什么OdbcCommand.ExecuteScalar()抛出AccessViolationException?
我有一块代码旨在从数据库表中提取文本描述并将它们保存到文本文件中。它看起来像这样(C#.NET):为什么OdbcCommand.ExecuteScalar()抛出AccessViolationException?
OdbcCommand getItemsCommand = new OdbcCommand("SELECT ID FROM ITEMS", databaseConnection);
OdbcDataReader getItemsReader = getItemsCommand.ExecuteReader();
OdbcCommand getDescriptionCommand = new OdbcCommand("SELECT ITEMDESCRIPTION FROM ITEMS WHERE ID = ?", databaseConnection);
getDescriptionCommand.Prepare();
while (getItemsReader.Read())
{
long id = getItemsReader.GetInt64(0);
String outputPath = "c:\\text\\" + id + ".txt";
if (!File.Exists(outputPath))
{
getDescriptionCommand.Parameters.Clear();
getDescriptionCommand.Parameters.AddWithValue("id", id);
String description = (String)getDescriptionCommand.ExecuteScalar();
StreamWriter outputWriter = new StreamWriter(outputPath);
outputWriter.Write(description);
outputWriter.Close();
}
}
getItemsReader.Close();
该代码已成功保存了数据的一部分为.txt文件,但对于许多行,一个AccessViolationException被套上以下行:
String description = (String)getDescriptionCommand.ExecuteScalar();
异常文本是“试图读取或写入受保护的内存,这通常表示其他内存已损坏”。
程序通常会在表的相同行上抛出异常,但看起来并不是100%一致的。有时候过去抛出异常的数据会突然出现。
有些人无疑想知道为什么我没有在getItemsCommand中选择ID,ITEMDESCRIPTION FROM ITEMS并跳过第二个查询。实际上,我最初是这么做的,而且我遇到了与getItemsCommand.GetString()相同的错误。我担心这个数据集可能占用了太多内存,也许这是导致错误的原因。所以我决定尝试这种方法,看看它是否会有所帮助。它没有。有谁知道为什么会发生这种情况?
顺便提一下,ID是一个INT,而ITEMDESCRIPTION是一个VARCHAR(32000)列。如果它有什么区别,数据库是Borland Interbase 6.0(Ick!)
编辑:当描述异常被抛出的地方时,我给出了错误的行!哎呀!现在修复。此外,我已经尝试了迄今为止提出的建议,但他们没有帮助。但是,我发现数据库中只有非常旧的记录导致了这个错误,这很奇怪。如果我将查询更改为仅提取最近5年插入的记录,则不存在任何问题。有人向我建议这可能是一个编码转换问题或类似的东西?
更新:解决了它。问题原来是我们的非常可靠的数据库软件的ODBC驱动程序中的一个错误。与其他驱动程序的解决方法解决了问题。
这可能是你使用的ODBC驱动程序中的一个错误。它是什么驱动程序?你的连接字符串是什么?
在这里瞎猜?
尝试执行你的读者,节省您的结果(也许在一个数组或列表),并确保读者正在执行或准备下一个命令前关闭。你甚至可能想要变得极端,并将你的getItemsCommand构造放在一个使用块中,这样你就知道在执行你的下一个命令之前没有任何资源可以打开......
试过了,它没有帮助。 – 2008-10-24 14:33:20
是啊...听到关闭读者没有帮助,我一定会尝试从这个供应商得到一些支持... – 2008-10-25 18:29:04