【问题标题】:Why is OdbcCommand.ExecuteScalar() throwing an AccessViolationException?为什么 OdbcCommand.ExecuteScalar() 会抛出 AccessViolationException?
【发布时间】:2008-10-23 02:00:29
【问题描述】:

我有一段代码旨在从数据库表中提取文本描述并将它们保存到文本文件中。它看起来像这样(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 中选择 ID、ITEMDESCRIPTION FROM ITEMS 并跳过第二个查询。实际上,我最初是这样做的,并且在使用 getItemsCommand.GetString() 时遇到了同样的错误。我担心数据集可能占用了太多内存,这可能是导致错误的原因。所以我决定尝试这种方法,看看它是否有帮助。它没有。有谁知道为什么会发生这种情况?

顺便说一下,ID 是一个 INT,ITEMDESCRIPTION 是一个 VARCHAR(32000) 列。如果有什么不同,数据库是 Borland Interbase 6.0 (Ick!)

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

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

【问题讨论】:

    标签: c# .net exception ado.net odbc


    【解决方案1】:

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

    【讨论】:

    • 这是 Easysoft Interbase ODBC 驱动程序。它设置为名为“BVDATA2”的系统 DSN。 .NET 中的连接字符串就是“DSN=BVDATA2”。
    • 确实,这似乎是 ODBC 驱动程序的一个错误。
    【解决方案2】:

    这里在黑暗中拍摄......

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

    【讨论】:

    • 是的......在听说关闭阅读器没有帮助之后,我肯定会尝试从供应商那里获得一些支持......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 2021-03-05
    • 2021-03-19
    • 2023-03-14
    • 2021-04-09
    • 2014-12-18
    • 2013-12-08
    相关资源
    最近更新 更多