更新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#以更新表时关闭访问权限。
仍未执行更新。我怀疑这是一个语法问题(也可能是权限问题?),但没有任何错误消息,它很难调试!
答案 0 :(得分:5)
刚刚解决了问题 - 这是参数的命名 - 似乎你不能在查询中将参数命名为与任何字段相同。
更改查询:
UPDATE tableName SET tableName.LastPolledDtg = LastPolledDtg
WHERE tableName.key = ID;
为:
UPDATE tableName SET tableName.LastPolledDtg = LastPolledDtgArg
WHERE tableName.key = ID;
...并且使用参数名称change更新调用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。
答案 1 :(得分:3)
您的更新查询有点令人困惑(您使用LastPolledDtg
作为字段和作为其值)。
如果您的意思是定义列的参数,那么它将不起作用。
否则,尝试使用PARAMETER
语法在Access中重写您的查询,例如:
PARAMETERS LastPolledDtgArg Text ( 255 ), ID Long;
UPDATE tableName SET tableName.LastPolledDtg = [LastPolledDtgArg]
WHERE tableName.key = [ID];
如果这不起作用,请尝试直接从C#使用SQL查询,而不是尝试执行存储的查询。
其他
重新排序参数,使其按照查询中定义的顺序传递,以便在LastPolledDtArg
之前传递ID
的值。
答案 2 :(得分:1)
在ms-access中,参数必须与SQL语句的顺序相同。
答案 3 :(得分:0)
我不是Access编码器,但听起来可能正在使用隐式事务。这意味着当您执行数据修改命令时,会自动打开一个事务,该事务必须在您的代码中显式提交/回滚。
由于某些原因,您的更新不会影响任何行。