sql ce native exception 0xc0000005

时间:2011-03-01 12:26:06

标签: c# compact-framework sql-server-ce

当我运行我的.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时。我能做些什么来纠正这种行为?

更新

经过更广泛的debbuging后,我构建了导致异常的代码,它在自动生成的代码vs创建:

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 个答案:

答案 0 :(得分:2)

已解决此问题

错误是由sqlce native dll的损坏引起的。通过卸载并重新安装sqlce一切正常。更好的是它更快,因为花在优化代码流上的时间,而不是使用库存VS样板代码

答案 1 :(得分:1)

SqlCeConnection是否在另一个线程上同时使用?

如果是这种情况,您可能也需要锁定。要进行测试,请(暂时)建立一个新连接并查看它是否已修复它。

答案 2 :(得分:1)

我有完全相同的错误,并且沮丧地拉扯我的头发,没有到达任何地方。我直接引用SQL CE dll并在部署期间将它们全部复制到设备,因此在我阅读上述解决方案后,我尝试删除所有文件并从头开始重新部署。这也行不通。最后,我使用

中的CAB文件将SQL Server CE 3.5 SP2直接安装到设备上
  

C:\ Program Files(x86)\ Microsoft SQL Server Compact   版\ V3.5 \设备\ wce500 \ ARMV4I \ sqlce.wce5.armv4i.cab

(在我的情况下,ARMv4,你的可能会有所不同)。安装到设备后,一切运行正常。