C# 试图读取受写保护的内存。这通常表示其他内存已损坏

C# 试图读取受写保护的内存。这通常表示其他内存已损坏,c#,sql-server-ce,C#,Sql Server Ce,我使用C#和sql server compact 3.5开发了一个桌面应用程序 我已经导入了所有必要的dll System.Data.SqlServerCe.dll sqlceca35.dll sqlcecompact35.dll sqlceer35EN.dll sqlceme35.dll sqlceoledb35.dll sqlceqp35.dll sqlcese35.dll 当我在客户机上安装安装程序时,它将在database.sdf中准确插入,并检索数据以自动完成 当我想从中检索数据以

我使用C#和sql server compact 3.5开发了一个桌面应用程序

我已经导入了所有必要的dll

  • System.Data.SqlServerCe.dll
  • sqlceca35.dll
  • sqlcecompact35.dll
  • sqlceer35EN.dll
  • sqlceme35.dll
  • sqlceoledb35.dll
  • sqlceqp35.dll
  • sqlcese35.dll
当我在客户机上安装安装程序时,它将在database.sdf中准确插入,并检索数据以自动完成

当我想从中检索数据以填充组合框或网格时,它将生成错误

attempted to read write protected memory. 
this is often an indication that other memory is corrupt
注意:如果我在另一台装有VS 2008的电脑上安装此安装程序,它将正常工作,不会出现任何错误。我需要在客户端Pc上安装一些东西吗

我也尝试建立 在VS2008中:

 Tools->Options
 Debugging->General
 uncheck option "Suppress JIT optimization on module load"
但结果是一样的

下面是一个用于存储和检索数据库数据的类

class dataBase
{

    private SqlCeDataAdapter ad;
    private SqlCeCommand cmd;
    private string StringdbFileName=("Data Source=" + System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase) + "\\sp.sdf").Replace(@"file:\", "");
    private SqlCeConnection coon;

    public dataBase()
    {
        coon = new SqlCeConnection(StringdbFileName);
        coon.Close();
    }

    public int ExecuteSQL(string Query)
    {
        try
        {
            coon.Open();
            cmd = new SqlCeCommand();
            cmd.Connection = this.coon;
            cmd.CommandText = Query;
            return cmd.ExecuteNonQuery();
        }
        catch (Exception ex)
        {
            throw ex;
        }
        finally
        {
            coon.Close();

        }
    }

    public DataTable GetDataTable(string Query)
    {
        try
        {
            coon.Open();
            DataTable dt = new DataTable();
            cmd = new SqlCeCommand();
            cmd.CommandText = Query;
            ad = new SqlCeDataAdapter(Query,coon);
            ad.Fill(dt);

            return dt;
        }
        catch (Exception ex)
        {
            throw ex;
        }
        finally
        {
            coon.Close();
        }
    }

    public void FillComboBox(string Query, string DisplayMember,string ValueMember, ComboBox cmb)
    {
        try
        {
            coon.Open();

            DataTable dt = new DataTable();
            cmd = new SqlCeCommand();
            cmd.CommandText = Query;
            ad = new SqlCeDataAdapter(Query, coon);
            ad.Fill(dt);

            cmb.DataSource = dt;
            cmb.DisplayMember = DisplayMember;
            cmb.ValueMember = ValueMember;
        }
        catch (Exception ex)
        {
            throw ex;
        }
        finally
        {
            coon.Close();
        }
    }
}

根据我的经验,当您从不同的线程访问同一个SqlConnection时,就会发生这种情况


SQL CE对线程不是很友好。

根据我的经验,当您从不同线程访问同一个SqlConnection时,就会发生这种情况


SQL CE不是非常线程友好。

请显示引发此异常时调用的代码。还包括完整的调用堆栈信息。这是一个多线程应用程序吗?您会得到这个错误,因为您是通过一个坏指针访问受保护内存的。可能是因为指针已损坏。正如错误消息所说。将问题简化为一个小程序,该程序将重现问题并将其发布在此处。通过这样做,你要么自己找到bug,要么产生一些我们可以实际分析的东西。在这个类中,1)ExecuteSQL(字符串查询);此方法用于插入工作精细2)GetDataTable(字符串查询);此方法适用于Fill DatGrid和Auto complete,但仅适用于AutoComplete,不适用于DataGrid 3)FillComboBox(字符串查询、字符串显示成员、字符串值成员、ComboBox cmb)此方法适用于FillComboBox请显示引发此异常时调用的代码。还包括完整的调用堆栈信息。这是一个多线程应用程序吗?您会得到这个错误,因为您是通过一个坏指针访问受保护内存的。可能是因为指针已损坏。正如错误消息所说。将问题简化为一个小程序,该程序将重现问题并将其发布在此处。通过这样做,你要么自己找到bug,要么产生一些我们可以实际分析的东西。在这个类中,1)ExecuteSQL(字符串查询);此方法用于插入工作精细2)GetDataTable(字符串查询);此方法适用于Fill DatGrid和Auto complete,但仅适用于AutoComplete,不适用于DataGrid 3)Fill ComboBox(字符串查询、字符串显示成员、字符串值成员、ComboBox cmb)此方法适用于Fill ComboBox,因此如何处理此称呼我做了一些更改我的问题请审阅it@leppie:请指定如何处理此问题。谢谢。@Agent007:确保
SqlCeConnection
仅从一个线程使用。那么如何处理这个称呼呢?我已经做了一些更改,请审阅我的问题it@leppie:请指定如何处理此问题。谢谢。@Agent007:确保仅从一个线程使用
SqlCeConnection