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

标签 c# python clr python.net pythonnet

enter image description here 我正在 python 2.7.13 上使用 pythonnet(使用其他 dll 文件和 .mdb 数据库文件)使用 C# dll 进行一些技术计算。该 dll 文件没有良好的文档(只有命名空间、类和方法名称)。大多数 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;
    }
}

最佳答案

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

关于c# - 使用 C# dll 的 Pythonnet 运行时错误(数据库不兼容),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50255983/

相关文章:

c# - 捕获击键

c# - 使用按位枚举的优点/缺点?

c# - float 与双重性能

python - 在 pybind11 (C++) 中使用内置的 "open"python 方法?

.net - .NET CLR JIT 是否每次都编译每个方法?

c# - CLR 如何知道装箱对象的类型?

c# - 在 MVC Web API 中将对象作为泛型类型( IEnumerable<object> Get(string ViewName) )传递是一个好习惯吗?

c# - linq to excel 异常 IErrorInfo.GetDescription

python - 在 while 循环内使用 try finally 时 PyCharm IDE 无法访问代码

python - 提高包含 3000 多个条目的字典的性能