【问题标题】:sql ce native exception 0xc0000005sql ce本机异常0xc0000005
【发布时间】:2011-03-01 12:26:05
【问题描述】:

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

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)

正如你在之前的研究中看到的那样,我被指出这可能是线程之间的同步问题,所以我使用 lock 语句和

private static object lockObj=new object();

但问题是当它调用 GetDadosAEnviar 时。我可以做些什么来纠正这种行为?

更新

经过更广泛的调试后,我构建了导致异常的代码,它位于自动生成的代码 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;

【问题讨论】:

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


    【解决方案1】:

    解决了

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 它不起作用。错误出现在 vs2008 自动生成的代码中,当它尝试调用 dataAdapter.fill 方法时。请参阅更新后的帖子,其中包含“禁止”异常的代码
      • 您是否尝试在使用 DataTable 的每个地方都加锁,或者您是否尝试在每个地方都打开新连接?
      • 创建新连接,做事,关闭连接。但我能够通过删除 sqlce 安装并重新安装来解决它
      【解决方案3】:

      我遇到了完全相同的错误,沮丧地拔掉头发,却一无所获。我直接引用 SQL CE dll 并在部署期间将它们全部复制到设备中,因此在阅读上述解决方案后,我尝试删除所有文件并从头开始重新部署。那也没有用。最后,我将 SQL Server CE 3.5 SP2 直接安装到设备上,其中 CAB 文件位于

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

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

      【讨论】:

        猜你喜欢
        • 2013-02-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-14
        • 2013-06-23
        相关资源
        最近更新 更多