2011-03-01 60 views
2

運行我的.NET CF 3.5的應用程序,讀取MS SQL CE的一些數據,有時我得到以下信息的機異常:SQL CE機異常0000005

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) 

正如你可以看到在p revious研究,我有人指出,這可能是線程之間的同步問題,所以我用鎖語句的

private static object lockObj=new object(); 

但問題是,當它調用GetDadosAEnviar。我能做些什麼來糾正這種行爲?

UPDATE

更廣泛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; 

回答

2

解決它

錯誤是由SQLCE機DLL的損壞引起的。通過卸載並重新安裝sqlce一切正常。更好的是,它更快,因爲花在優化代碼流上的時間,而不是使用股票VS樣板代碼

1

是對的SqlCeConnection在使用同時在另一個線程?

如果是這樣,您可能還需要一個鎖。要測試,建立一個新的連接(暫時),看看它是否修復它。

+0

它不起作用。當它嘗試調用dataAdapter.fill方法時,該錯誤出現在vs2008自動生成的代碼中。看到更新後的帖子,代碼「barfs」異常 – Sorcerer86pt 2011-03-02 15:56:15

+0

您是否嘗試在每個使用DataTable的地方放置一個鎖,或者您是否嘗試在每個地方打開一個新的連接? – jonathanpeppers 2011-03-02 19:16:20

+0

創建新的連接,做東西,關閉連接。但我能通過刪除sqlce安裝並再次安裝它來解決它 – Sorcerer86pt 2011-03-03 16:10:34

1

我有完全相同的錯誤,並把我的頭髮與挫折,沒有得到任何地方。我直接引用SQL CE dll並在部署過程中將它們全部複製到設備中,因此在閱讀上述解決方案後,我嘗試刪除所有文件並從頭開始重新部署。這也沒有奏效。最後,我直接就安裝了SQL Server CE 3.5 SP2與CAB文件的設備在

Ç發現:\程序文件(x86)\ Microsoft SQL Server壓縮 版\ V3.5 \設備\ wce500 \ armv4i \ sqlce.wce5.armv4i.cab

(ARMv4在我的情況下,您的可能會有所不同)。安裝到設備後,一切運行良好。