无法保存访问数据库的更改

Posted

技术标签:

【中文标题】无法保存访问数据库的更改【英文标题】:cant save changes on access database 【发布时间】:2017-09-26 04:55:19 【问题描述】:

我有一些代码使用访问文件来存储数据:P

我在没有代码的访问文件上写了一些数据,以便我可以读取它,并且读取的方法工作正常,比如这个:

class dbConection

private static OleDbConnection conection = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\teacher assistant.mdb");
private static OleDbCommand comand = new OleDbCommand();
private static OleDbDataAdapter adapter = new OleDbDataAdapter();

public static bool canConnect()
    
        try
        
            conection.Open();

            if (conection.State == ConnectionState.Open)
            
                Console.WriteLine("conexion exitosa");
                conection.Close();
                return true;
            
            else
            
                Console.WriteLine("conexion fallida");
                return false;
            
        
        catch (Exception ex)
        
            Console.WriteLine( "conexion fallida, error: "+ex.Message );
            return false;
        

    //more methods...

    

还有这个

    internal static Grupo[] GruposAsociadosCon(int idUsuario)
    
        conection.Open();
        comand.Connection = conection;
        comand.CommandText = "SELECT * FROM Salones WHERE maestro=" + idUsuario.ToString();
        OleDbDataReader reader = null;
        reader = comand.ExecuteReader();

        List<Grupo> lGrupos = new List<Grupo>();

        while (reader.Read())
        
            int id = Convert.ToInt16(reader["idSalon"].ToString());
            int grado = Convert.ToInt16(reader["grado"].ToString());
            char grupo = reader["grupo"].ToString().First();
            string escuela = reader["escuela"].ToString();
            Grupo g = new Grupo(id, grado, grupo, escuela);

            lGrupos.Add(g);
        

        reader.Close();
        conection.Close();

        return lGrupos.ToArray();

    

问题在于写入数据的方法,例如:

   internal static bool RegistrarUsuario(string usuario, string contra)
    
        conection.Open();
        comand.Connection = conection;
        comand.CommandText = "SELECT * FROM Usuarios WHERE usuario='" + usuario + "'" ;
        OleDbDataReader reader = comand.ExecuteReader();

        if (reader.HasRows)
        
            //MessageBox.Show( "EL usuario ya existe" );
            conection.Close();
            throw new Exception("Ya existe este usuario");
        

        reader.Close();
        comand = new OleDbCommand();
        comand.CommandText = "INSERT INTO Usuarios (usuario, contrasena) VALUES('"+usuario+"', '"+contra+"')";
        comand.Connection = conection;
        Console.WriteLine(comand.ExecuteNonQuery()+" lienas con cambios");
        conection.Close();
        return true;
    

当我将数据存储在文件上时,它没有出现在 accessFile 上,我没有收到异常,程序就像数据在那里一样工作,

comand.CommandText = "SELECT * FROM Usuarios WHERE usuario='" + usuario + "'" ;
OleDbDataReader reader = comand.ExecuteReader();
if (reader.HasRows)

reader.HasRows 返回 true

它的工作方式就像数据在我关闭程序之前一直存在,在我看来它正在创建一个临时文件或其他东西,并且在关闭时它不会保存更改。 如何使更改永久生效?

【问题讨论】:

【参考方案1】:

根据我在您发布的代码中看到的内容,更改应该是永久性的。我想指出的一件事是,创建 INSERT 语句的代码容易受到 SQL 注入攻击。您可以研究一下这是什么,并了解它是否适​​用于您(基本上这完全取决于 Access 是否支持 DROP TABLE 等 SQL 命令。

我会检查一些事情。

    在您的解决方案中找到 MDB 文件并检查其属性。其中一个属性将是“复制到输出目录”,这需要设置为“如果更新则复制”而不是“始终复制”。当您将值设置为 Copy Always 时,每次运行程序时,MDB 文件的空副本都会覆盖 DEBUG/RELEASE 文件夹中包含数据的 MDB。如果您更改了 MDB 的结构,则 Copy if Newer 只会替换数据文件,从而使其日期比调试文件夹中的日期新。

    如果不是上述问题,那么您的 MDB 可能已损坏,您需要在 Access 中打开它并对其进行修复。

【讨论】:

我在研究过程中发现的另一个问题是您的连接字符串。逐行调试您的代码,看看 .NET 正在转向 |DataDirectory|进入。我理论它应该是运行代码的目录(与EXE相同)。即使您启用了 ClickOnce 部署,在调试期间,它仍应解析为数据文件夹。如果这些都没有提供任何启示,我会有兴趣查看整个源代码包,看看我是否可以追踪错误,但是,可能存在隐私和代码所有权问题,可能会阻止这种帮助。 我在这里使用连接字符串的原因是因为您的代码显然是在保存数据,这很清楚.. 所以要回答的问题是.. 数据去哪儿了?如果您无法解析给出的位置(又名 .NET 不会告诉您),那么我建议使用不受 .NET 控制的 MDB 文件的完全限定路径(在调试文件夹之外)...例如 c :\temp\teacher assistant.mdb。我要做的最后一件事是创建一个文件名中没有空格的 MDB。我知道您应该能够使用空格等,但仅用于 shiggles 和 gits.... :-) 谢谢,就是这样,我将 MDB 更改为“Copy If Newer”,并将连接字符串更改为 DB “Provider=Microsoft.Jet.OLEDB.4.0;Data Source”的名称=教师助理.mdb"

以上是关于无法保存访问数据库的更改的主要内容,如果未能解决你的问题,请参考以下文章

无法使用实体框架保存数据库更改

无法保存对 Rundll32.exe 权限所作的更改!!!!

“无法保存对SAM权限所做的更改”对这样的限制怎么突破

无法保存对spoolsv.exe权限所作的更改

如何保存在框架中

SQL Serversql server更改了数据表的字段/新增数据表的字段 无法保存