使用 C# dll 的 Pythonnet 运行时错误(数据库不兼容)

Pythonnet Runtime Error using C# dll (Database Incompatibility)

enter image description here我在 python2.7.13 上使用 pythonnet 使用 C# dll(它使用其他 dll 文件和 .mdb 数据库文件)进行一些技术计算。这个 dll 文件没有很好的文档(只有命名空间、class 和方法名称)。大多数 PC 中的程序运行良好,但在所有办公室计算机中,它会从 Dll 文件中抛出运行时错误(我怀疑是与数据库的连接)。此 dll 文件被编译为目标 .NET 4.0(在办公室计算机中安装了 .NET 4.7.1 或比 4.0 更新的其他版本)并且 EntityFramework 也被使用(程序目标 5.0,这是程序中的 dll 文件文件夹,但在办公电脑上安装了 EntityFramework 6.2 工具)。这些计算机中还安装了 Microsoft 数据库引擎 2010。

在我测试过的所有其他计算机上,该程序都能完美运行。在办公室计算机中,我找到了一组程序适用的输入数据,但无论如何这是不正确的,因为它应该也适用于默认数据。

为了在办公电脑上进行测试,我使用 PyInstaller 编译了 python 代码(我重复一遍,编译后的版本在其他 PC 上运行良好)。

我正在使用 .NET Reflector 反编译 dll 文件和程序异常以查找错误。抛出Exception的方法在下面的代码中

提前致谢!

public int LoadRanghiAmmessi(int[] vRanghi, string geometria)
{
    int index = 0;
    CrConnection connection = new CrConnection(this.PathDB);
    string query = "SELECT * FROM RanghiAmmessi WHERE (Geometria='" + geometria + "') ORDER BY NRanghi";
    OleDbDataReader recordset = connection.GetRecordset(query, @"\Coils.mdb;");
    if (!recordset.HasRows)
    {
        if (recordset != null)
        {
            recordset.Close();
        }
        query = "SELECT * FROM RanghiAmmessi WHERE (Geometria='*') ORDER BY NRanghi";
        recordset = connection.GetRecordset(query, @"\Coils.mdb;");
        while (recordset.Read())
        {
            vRanghi[index] = int.Parse(recordset["NRanghi"].ToString());
            index++;
        }
        if (recordset != null)
        {
            recordset.Close();
        }
    }
    return index;
}



public OleDbDataReader GetRecordset(string query, string NomeDB)
{
    string connectionString = "Provider=Microsoft.JET.OLEDB.4.0;Data Source=" + this.PathDB + NomeDB + "Jet OLEDB:Database Password=123456";
    this.ChiudiConnessioni();
    this.conn = new OleDbConnection(connectionString);
    OleDbCommand command = new OleDbCommand(query, this.conn);
    try
    {
        this.ApriConnessione();
        return command.ExecuteReader();
    }
    catch (Exception exception)
    {
        exception.Message.ToString();
        this.ChiudiConnessioni();
        return null;
    }
}

嗯...考虑到它在 "Other PC" 上运行良好的细节,我猜问题出在您所谓的数据库上。然而,我看不出任何人在解决问题之前如何确定问题所在。

经过多次测试,我发现该程序在声明了一些对象(如函数参数)并编译 运行 程序与 Windows 兼容之后也可以在其他 PC 上运行 7. 在对象之前像变量一样被创建并且这些变量被作为参数传递,(在这种情况下,合理的第一个想法是问题是 "pass by reference" 机制并且一些值没有以正确的模式插入,但事实并非如此因为: - 完全相同的代码在大多数 PC 上运行良好(兼容性 问题) - 使用完全相同的机制来指定对象属性和 进行计算 在这种情况下,我会说不清楚问题出在哪里。在第一个版本中,安装 SQL Server Express 使该程序即使没有最后修改也能正常运行。