为什么通过OleDb在Access数据库中调用我的UPDATE查询不起作用?
更新2:我解决了这个,看到我的答案。
我使用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 = LastPolledDtg WHERE tableName.key = ID;
至:
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。
您的更新查询有点令人困惑(您使用LastPolledDtg
作为字段及其值)。 如果您的意思是定义列的参数,那么它将不起作用。
否则,尝试使用PARAMETER
语法在Access中重写查询,例如:
PARAMETERS LastPolledDtgArg Text ( 255 ), ID Long; UPDATE tableName SET tableName.LastPolledDtg = [LastPolledDtgArg] WHERE tableName.key = [ID];
如果这不起作用,请尝试直接从C#使用SQL查询,而不是尝试执行存储的查询。
还有别的
重新排序参数,使它们按照查询中定义的顺序传递,以便在ID
之前传递LastPolledDtArg
的值。
在ms-access中, 参数必须与SQL语句的顺序相同 。
我不是Access编码器,但听起来可能正在使用隐式事务。 这意味着当您执行数据修改命令时,会自动打开一个事务,该事务必须在代码中显式提交/回滚。
由于某种原因,您的更新不会影响任何行。