尝试读取写保护的内存.这通常表示其他内存已损坏

本文关键字:内存 表示 已损坏 其他 常表示 读取 写保护 | 更新日期: 2023-09-27 18:29:41

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

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

  • System.Data.SqlServerCe.dll
  • sqlceca35.dll
  • sqlcecompact35.dll
  • sqlceer35EN.dll
  • sqlcem35.dll
  • sqlceoledb35.dll
  • sqlceqp35.dll
  • sqlcese35.dll

当它在这台电脑上运行时部署它,没有任何错误。当我在客户端机器上安装安装程序时,它将准确地插入数据库.sdf,并检索数据以自动完成。

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

attempted to read write protected memory. 
this is often an indication that other memory is corrupt

注意:如果我在另一台装有VS2008的电脑上安装这个安装程序,它会正常工作,没有任何错误。我必须在客户端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对线程不是很友好。