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

时间:2018-05-09 14:33:41

标签: c# python clr python.net pythonnet

enter image description here我在python 2.7.13上使用pythonnet使用C#dll(使用其他dll文件和.mdb数据库文件)进行一些技术计算。这个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;
    }
}

1 个答案:

答案 0 :(得分:1)

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