更新 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# 更新表时关闭 Access 来缩小可能性。
更新仍未执行。我怀疑这是一个语法问题(也可能是权限问题?),但如果没有任何错误消息,它很难调试!
最佳答案
刚刚解决了问题 - 这是参数的命名问题 - 似乎您不能将查询中的参数命名为与任何字段相同的名称。
更改查询自:
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 的人。
关于c# - 为什么通过 OleDb 在 Access 数据库中调用我的更新查询不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/645063/