为什么通过OleDb在Access数据库中调用我的UPDATE查询不起作用?

Ben*_*Ben 3 c# sql oledb ms-access

更新2:我解决了这个,看到我的答案.


我正在使用OleDb从C#调用Microsoft Access数据库中的查询,但我无法让我的更新查询工作.

不会引发任何错误,但数据库中不会保留更新.

任何人都可以对此有所了解吗?


数据库中的SQL查询:

UPDATE tableName SET tableName.LastPolledDtg = LastPolledDtg
WHERE tableName.key = ID;
Run Code Online (Sandbox Code Playgroud)

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();
}
Run Code Online (Sandbox Code Playgroud)

连接字符串:

"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\Documents and Settings\\Administrator\\Desktop\\dev\\src\\Website\\App_Data\\tracking.mdb"
Run Code Online (Sandbox Code Playgroud)

更新1:

我试图通过创建一个包含单个表和单个查询的新数据库来缩小可能性,并确保在运行C#以更新表时关闭访问.

仍未执行更新.我怀疑这是一个语法问题(也可能是权限问题?),但没有任何错误消息,它很难调试!

Ben*_*Ben 5

刚刚解决了问题 - 它是参数的命名 - 似乎你不能在查询中命名参数与任何字段相同.

更改查询:

UPDATE tableName SET tableName.LastPolledDtg = LastPolledDtg
WHERE tableName.key = ID;
Run Code Online (Sandbox Code Playgroud)

至:

UPDATE tableName SET tableName.LastPolledDtg = LastPolledDtgArg
WHERE tableName.key = ID; 
Run Code Online (Sandbox Code Playgroud)

...并使用参数名称更改来更新调用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();
}
Run Code Online (Sandbox Code Playgroud)

男人我喜欢Access.