我正在使用OleDb从C#调用Microsoft Access数据库中的查询,但是我无法使更新查询正常工作。
没有引发任何错误,但更新未持久存储在数据库中。
任何人都可以阐明这一点吗?
数据库中的SQL查询:
UPDATE tableName SET tableName.LastPolledDtg = LastPolledDtg WHERE tableName.key = ID;
C#:
OleDbCommand command = new OleDbCommand(); SetCommandType(command, CommandType.StoredProcedure, "NameOfQueryInAccessDatabase"); AddParamToSQLCmd(command, "@ID", OleDbType.Integer, 4, ParameterDirection.Input, id); AddParamToSQLCmd(command, "@LastPolledDtg", OleDbType.Date, 4, ParameterDirection.Input, DateTime.Now); using (OleDbConnection connection = new OleDbConnection("connectionString")) { command.Connection = connection; connection.Open(); result = command.ExecuteNonQuery(); }
连接字符串:
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\Documents and Settings\\Administrator\\Desktop\\dev\\src\\Website\\App_Data\\tracking.mdb"
更新1:
我试图通过创建一个包含单个表和单个查询的新数据库并确保在运行C#更新表时关闭访问权限来缩小可能性。
仍然不执行更新。我怀疑这是一个语法问题(也可能是权限问题?),但是没有任何错误消息,这很难调试!
刚刚解决了这个问题-它是参数的命名-看来您无法在查询中为任何字段命名相同的参数。
将查询从以下位置更改:
到:
UPDATE tableName SET tableName.LastPolledDtg = LastPolledDtgArg WHERE tableName.key = ID;
…并通过更改参数名称来更新调用C#,从而将其写入数据库。
但是,还有一点麻烦: 将参数顺序保留在C#中,将导致数据库中的LastPolledDtg字段以最小日期(1899左右)进行更新。重新排序参数到OleDbCommand的添加,以匹配它们在SQL中的出现,从而解决了此问题。
因此,C#应该如下所示:
OleDbCommand command = new OleDbCommand(); SetCommandType(command, CommandType.StoredProcedure, "NameOfQueryInAccessDatabase"); AddParamToSQLCmd(command, "@LastPolledDtgArg", OleDbType.Date, 4, ParameterDirection.Input, DateTime.Now); AddParamToSQLCmd(command, "@ID", OleDbType.Integer, 4, ParameterDirection.Input, id); using (OleDbConnection connection = new OleDbConnection("connectionString")) { command.Connection = connection; connection.Open(); result = command.ExecuteNonQuery(); }
男人,我喜欢Access。