C# 为什么OdbcCommand.ExecuteScalar()会引发AccessViolationException?

C# 为什么OdbcCommand.ExecuteScalar()会引发AccessViolationException?,c#,.net,exception,ado.net,odbc,C#,.net,Exception,Ado.net,Odbc,我有一段代码打算从数据库表中提取文本描述并将其保存到文本文件中。它看起来像是C.NET: OdbcCommand getItemsCommand = new OdbcCommand("SELECT ID FROM ITEMS", databaseConnection); OdbcDataReader getItemsReader = getItemsCommand.ExecuteReader(); OdbcCommand getDescriptio

我有一段代码打算从数据库表中提取文本描述并将其保存到文本文件中。它看起来像是C.NET:

        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中从ITEMS中选择ID、ITEMDESCRIPTION并跳过第二个查询。实际上,一开始我就是这样做的,我在getItemsCommand.GetString中遇到了相同的错误。我担心数据集可能占用了太多内存,这可能是导致错误的原因。所以我决定试试这个方法,看看它是否有用。没有。有人知道为什么会这样吗

顺便说一下,ID是一个INT,ITEMDESCRIPTION是一个VARCHAR32000列。如果有什么不同,数据库是Borland Interbase 6.0

编辑:在描述抛出异常的位置时,我给出了错误的行!!啊!!现在修好了。此外,我已经尝试了一些建议,但都没用。然而,我发现数据库中只有非常旧的记录导致了这个错误,这很奇怪。如果我将查询更改为仅提取过去5年中插入的记录,则不会出现问题。有人向我建议这可能是编码转换问题或类似的问题


更新:解决了。这个问题原来是我们不太可靠的数据库软件的ODBC驱动程序中的一个错误。与其他驱动程序的解决方案解决了此问题。

这里是黑暗中的一枪


尝试执行读卡器,将结果保存在数组或列表中,并确保在执行或准备下一个命令之前关闭读卡器。您甚至可能想走极端,将getItemsCommand构造放在using块中,这样您就可以在执行下一个命令之前知道它没有打开的资源…

这可能是您正在使用的ODBC驱动程序中的错误。是什么司机?您的连接字符串是什么?

是Easysoft Interbase ODBC驱动程序。它被设置为名为BVDATA2的系统DSN。NET中的连接字符串只是DSN=BVDATA2。实际上,它似乎是ODBC驱动程序的一个bug。是的。。。在听说关闭阅读器没有帮助后,我肯定会尝试从供应商那里获得一些支持。。。