1

我正在编写一个需要从 MAS-90 数据库中查询 2 个字段的 Windows 窗体应用程序。为此,我们使用了称为 SOTAMAS90 的 ProvideX 的 MAS 90 32 位 ODBC 驱动程序。这是我用来从 MAS-90 数据库中检索 DataTable 的代码。

public static DataTable getDatatable(string qry)
{
    DataTable dt = new DataTable();            

     using (OdbcConnection conn = new OdbcConnection(GetSQLConnection()))
     {
         try
         {
             OdbcCommand cmd = new OdbcCommand(qry, conn);
             cmd.CommandType = CommandType.Text;
             conn.Open();
             OdbcDataAdapter adpt = new OdbcDataAdapter(cmd);

             adpt.Fill(dt);

             cmd.Dispose();
             conn.Close();
             conn.Dispose();
        }
        catch (OdbcException e) { conn.Close(); }
        catch (AccessViolationException ae) { conn.Close(); }
        catch (UnauthorizedAccessException ue) { conn.Close(); }                    
    }

    return dt;
}

在线adpt.Fill(dt)我得到以下异常: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.

这昨天工作得很好。今天 Visual Studio 告诉我这是一个 Unhandled AccessViolationException,即使您可以清楚地看到 try/catch。我必须将<legacyCorruptedStateExceptionsPolicy enabled="true"/>异常添加到我的配置文件中,以便在 try/catch 中捕获异常。

另一个奇怪的事情是我能够使用 Jaime De Los Hoyos M 的 ODBC 查询工具连接到数据库并运行相同的精确查询(只是从表中选择 2 个字段)。(可在此处获得)

非常感谢解决此问题的任何帮助。如果您需要更多信息,请告诉我。

我还想补充一点,我已经尝试过:

  • 在我的应用程序中以 x86 为目标,因为驱动程序是 32 位的
  • 授予对存储数据库的目录的权限
  • 重启电脑
  • 更改查询以添加参数cmd.Parameters.AddWithValue("@PARAM", "Value")
4

1 回答 1

1

我能够解决我的问题。该数据库存储在我的 PC 有一个映射驱动器的服务器上。无论出于何种原因,MAS 90 32 位 ODBC 驱动程序的映射中断。这很奇怪,因为我仍然能够通过文件资源管理器访问网络驱动器的文件,而且我还能够通过我提到的 ODBC 查询工具(它使用相同的 ODBC 驱动程序)来查询表。当我想更改数据库目录字段(见下文)时,我发现了这一点,它一直告诉我路径无效或不可访问(即使它正在为 ODBC 查询工具访问它)。

无论如何,我重新映射了网络驱动器,然后删除并重新创建了 SOTAMAS90 DSN,它再次工作。

ODBC 驱动程序配置

于 2019-07-18T14:06:59.707 回答