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