sql ce собственное исключение 0xc0000005 - PullRequest
2 голосов
/ 01 марта 2011

Когда я запускаю приложение .net 3.5 cf, которое читает некоторые данные из ms sql ce, иногда я получаю собственное исключение со следующей информацией:

ExceptionCode: 0xc0000005
ExceptionAddress : 0x44746e65 (variable)
Reading: 0x44746e64

at NativeMethods.GetKeyInfo(IntPtr pTx, String pwszBaseTable, IntPtr prgDbKeyInfo, Int32 cDbKeyInfo, IntPtr pError)

at SqlCeCommand.ExecuteReader(CommandBahavior behavior)

(... omitted for brevity)

at dadosGpsTableAdapter.GetDadosAEnviar()

Мой запрос GetDadosAEnviar очень прост:

SELECT        _id, Latitude, Longitude, Ignicao, Altitude, Velocidade,Direcao, Qualidade, Timestamp, Valido, Enviado, CondutorID
FROM            DadosGps
WHERE        (Enviado = 0)

и код, который вызывает этот запрос:

private bool SendRemainingData()
    {
        SetCurrentStatus("A Enviar historico");
        try
        {

            lock (lockObj)
            {
                DadosDataSet.DadosGpsDataTable dadosAEnviar = gpsAdapter.GetDadosEnviar();

                if (dadosAEnviar.Rows.Count > 0)
                {

                    foreach (DadosDataSet.DadosGpsRow amostra in dadosAEnviar.Rows)
                    {
                        bool resultado = webServicesGps.SendToServerGPSData(IMEI, amostra.Timestamp, amostra.Latitude, amostra.Longitude, Convert.ToDecimal(amostra.Altitude),
                            Convert.ToDecimal(amostra.Velocidade), Convert.ToDecimal(amostra.Direcao), new bool[] { amostra.Ignicao }, decimal.Zero, Convert.ToDecimal(amostra.Qualidade), "");

                        if (resultado)
                            gpsAdapter.RegistarEnvio(amostra._id);
                    }
                }
                dadosAEnviar.Dispose();
            }

(... omitted for brevity)

Как вы можете видеть из предыдущего исследования, мне было указано, что это может быть проблема синхронизации между потоками, поэтому я использую оператор блокировки с

private static object lockObj=new object();

Но проблема в том, что он вызывает GetDadosAEnviar. Что я могу сделать, чтобы исправить это поведение?

UPDATE

После более обширной отладки я создал код, который вызывает исключение, он находится в автоматически сгенерированном коде и создает:

this.Adapter.SelectCommand = this.CommandCollection[3];
        DadosDataSet.DadosGpsDataTable dataTable = new DadosDataSet.DadosGpsDataTable();
        //Next line "barfs" an native exception
        this.Adapter.Fill(dataTable);
        return dataTable;

Ответы [ 3 ]

2 голосов
/ 03 марта 2011

решено IT

Ошибка была вызвана повреждением sqlce native dll.Путем удаления и повторной установки sqlce все работало.А еще лучше, потому что время, затрачиваемое на оптимизацию потока кода, вместо использования стандартного стандартного кода VS

1 голос
/ 31 июля 2012

У меня была точно такая же ошибка, и я с разочарованием выдергивал свои волосы, никуда не деться.Я ссылаюсь на библиотеки SQL CE напрямую и копирую их все на устройство во время развертывания, поэтому после прочтения вышеупомянутого решения я попытался удалить все файлы и заново развернуть их с нуля.Это тоже не сработало.В конце концов я установил SQL Server CE 3.5 с пакетом обновления 2 (SP2) непосредственно на устройство с файлом CAB, найденным в

C: \ Program Files (x86) \ Microsoft SQL Server Compact Edition \ v3.5 \ Devices\ wce500 \ armv4i \ sqlce.wce5.armv4i.cab

(в моем случае ARMv4 может отличаться от вашего).После установки этого на устройство все заработало нормально.

1 голос
/ 01 марта 2011

Используется ли SqlCeConnection одновременно в другом потоке?

Если это так, вам также может понадобиться блокировка.Чтобы проверить, создайте новое соединение (временно) и посмотрите, исправляет ли оно это.

...