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