Pythonnet Runtime Ошибка при использовании C # dll (несовместимость базы данных) - PullRequest
0 голосов
/ 09 мая 2018

введите описание изображения здесь Я использую C # dll, использующий pythonnet на python 2.7.13 (который использует другие dll-файлы и файлы базы данных .mdb) для выполнения некоторых технических расчетов.Эти файлы DLL не имеют хорошей документации (только пространства имен, имена классов и методов).Хорошо, программа на большинстве ПК работает нормально, но на всех офисных компьютерах выдает ошибку времени выполнения из файлов Dll (я сомневаюсь в связи с базой данных).Эти dll-файлы скомпилированы для целевой .NET 4.0 (на офисных компьютерах установлена ​​.NET 4.7.1 или другие версии, более новые, чем 4.0), и также используется EntityFramework (программы предназначены для 5.0, и это dll-файл в папке программы, но вна офисных компьютерах установлен инструмент EntityFramework 6.2).База данных Microsoft Engine 2010 также установлена ​​на этих компьютерах.

На любом другом компьютере, который я тестировал, программа работает отлично.В офисных компьютерах я нашел группу входных данных, для которой работает программа, но в любом случае это не правильно, потому что она должна работать и для данных по умолчанию.

Чтобы проводить тесты на офисных компьютерах, я скомпилировал код Python с использованием PyInstaller(Я повторяю, скомпилированная версия отлично работает на других ПК).

Я использую .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;
    }
}

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

После многих тестов я обнаружил, что программа работает и на другом ПК, после объявления некоторых объектов, таких как параметры функций, и после компиляции запуска программы как совместимой с Windows 7. До того, как объекты были созданы как переменные, эти переменные были переданы как параметры (в данном случае, разумно, что первая мысль заключается в том, что проблема заключается в механизме «передача по ссылке» и что некоторые значения не вставляются в правильный режим, но это не так, потому что: - точно такой же код работал очень хорошо на большинстве ПК (совместимость проблема) - точно такой же механизм используется для указания атрибутов объектов и производить расчеты В этих условиях я бы сказал, что не ясно, где была проблема. В первой версии установка SQL Server Express позволила программе работать хорошо даже без последних изменений.

0 голосов
/ 11 мая 2018

Умм ... учитывая детали, что он отлично работает на "другом ПК", я предполагаю, что проблема в вашей так называемой базе данных. Однако я не понимаю, как можно быть уверенным в том, в чем заключается проблема, пока она не будет решена.

...