C#,MAS-90,尝试在OdbcDataAdapter.Fill(dataTable)上读取或写入受保护的内存错误

时间:2019-07-17 15:17:29

标签: c# tsql odbc sage-erp

我正在编写一个Windows Forms应用程序,该应用程序需要从MAS-90数据库中查询2个字段。为此,我们使用ProvideX的称为SOTAMAS90的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 / catches。我必须将<legacyCorruptedStateExceptionsPolicy enabled="true"/>添加到配置文件中,只是为了在try / catch中捕获异常。

另一个奇怪的是,我能够使用Jaime De Los Hoyos M.的ODBC Query Tool连接到数据库并运行相同的精确查询(只需从表中选择2个字段)({{3} })

对于解决此问题的任何帮助,我们深表感谢。如果需要其他信息,请告诉我。

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

  • 在我的应用中将x86定位为32位驱动程序
  • 授予数据库存储目录的权限
  • 重新启动PC
  • 更改查询以添加带有cmd.Parameters.AddWithValue("@PARAM", "Value")的参数

1 个答案:

答案 0 :(得分:0)

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

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

ODBC Driver Configuration