sql ce native exception 0xc0000005

当我运行我的.net 3.5 cf应用程序从ms sql ce读取一些数据时,有时我会得到一个带有以下信息的本机exception:

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

经过更广泛的重新布局后,我构建了导致exception的代码,它是在自动生成的代码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; 

解决了它

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

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

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

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

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

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