c# - 为什么 OdbcCommand.ExecuteScalar() 抛出 AccessViolationException?

标签 c# .net exception ado.net odbc

我有一段代码旨在从数据库表中提取文本描述并将它们保存到文本文件中。它看起来像这样 (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();

异常文本是“试图读取或写入 protected 内存。这通常表示其他内存已损坏”。

程序通常会在表的相同行上抛出异常,但看起来并不是 100% 一致。有时过去抛出异常的数据会突然工作。

毫无疑问,有些人想知道为什么我不只是在 getItemsCommand 中从 ITEMS 中选择 ID、ITEMDESCRIPTION 并跳过第二个查询。实际上,我最初就是这样做的,我遇到了与 getItemsCommand.GetString() 相同的错误。我担心数据集可能占用了太多内存,这可能导致了错误。所以我决定试试这个方法,看看它是否有帮助。它没有。有谁知道为什么会发生这种情况?

顺便说一句,ID 是一个 INT,ITEMDESCRIPTION 是一个 VARCHAR(32000) 列。如果有任何区别,数据库是 Borland Interbase 6.0(Ick!)

编辑:我在描述抛出异常的位置时给出了错误的行!!啊!!现在修好了。另外,到目前为止,我已经尝试了建议的方法,但没有帮助。但是,我发现只有数据库中非常旧的记录导致了这个错误,这很奇怪。如果我将查询更改为仅提取最近 5 年插入的记录,则没有问题。有人向我建议这可能是编码转换问题或类似问题?

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

最佳答案

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

关于c# - 为什么 OdbcCommand.ExecuteScalar() 抛出 AccessViolationException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/228274/

相关文章:

c# - Restful Web 服务中的 URL

c# - 二维数组不会转置 c#

c# - 如何正确配置 foreach 循环以避免索引超出范围错误?

c# - List.ConvertAll 和异常

javascript - 如何在 ASP.NET C# 中使用 Sweet Alert

c# - 面板上的 Visual C# 鼠标事件未触发

.net - 如何在我的项目中使用 GAC 中安装的 .net 程序集

c# - 覆盖身份验证属性的用途是什么?

swift - “ fatal error :在展开可选值时意外发现nil”是什么意思?

python - 对于 SalesForce API,这两个异常是什么意思?