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

时间:2017-09-26 04:55:20

标签: c# database ms-access save

我有一些代码使用访问文件来存储数据: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 个答案:

答案 0 :(得分:0)

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

我会检查一些事情。

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

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