C# 为什么通过OleDb在Access数据库中调用我的更新查询不起作用?
更新2:我解决了这个问题,请参阅我的答案。C# 为什么通过OleDb在Access数据库中调用我的更新查询不起作用?,c#,sql,ms-access,oledb,C#,Sql,Ms Access,Oledb,更新2:我解决了这个问题,请参阅我的答案。 我正在使用OleDb从C#调用Microsoft Access数据库中的查询,但我无法使更新查询正常工作 不会引发任何错误,但不会在数据库中保留更新 有人能解释一下吗 数据库中的SQL查询: UPDATE tableName SET tableName.LastPolledDtg = LastPolledDtg WHERE tableName.key = ID; OleDbCommand command = new OleDbCommand();
我正在使用OleDb从C#调用Microsoft Access数据库中的查询,但我无法使更新查询正常工作 不会引发任何错误,但不会在数据库中保留更新 有人能解释一下吗
数据库中的SQL查询:
UPDATE tableName SET tableName.LastPolledDtg = LastPolledDtg
WHERE tableName.key = ID;
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"
C#:
UPDATE tableName SET tableName.LastPolledDtg = LastPolledDtg
WHERE tableName.key = ID;
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"
连接字符串:
UPDATE tableName SET tableName.LastPolledDtg = LastPolledDtg
WHERE tableName.key = ID;
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:
UPDATE tableName SET tableName.LastPolledDtg = LastPolledDtg
WHERE tableName.key = ID;
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"
我试图通过创建一个包含一个表和一个查询的新数据库来缩小可能性,并确保在运行C#更新表时关闭访问
更新仍然没有执行。我怀疑这是一个语法问题(也可能是权限问题?),但如果没有任何错误消息,则很难调试 我不是一个访问编码员,但听起来可能正在使用隐式事务。这意味着当您执行数据修改命令时,将自动打开一个事务,该事务必须在代码中显式提交/回滚
或者由于某种原因,没有任何行受到更新的影响。您的更新查询有点混乱(您将
lastpolledtg
用作字段和值)。
如果您指的是定义列的参数,那么它将不起作用
否则,请尝试使用参数
语法在Access中重写查询,例如:
PARAMETERS LastPolledDtgArg Text ( 255 ), ID Long;
UPDATE tableName SET tableName.LastPolledDtg = [LastPolledDtgArg]
WHERE tableName.key = [ID];
如果这不起作用,请尝试直接从C#使用SQL进行查询,而不是尝试执行存储的查询
其他东西
对参数重新排序,以便按照查询中定义的顺序传递参数,以便在
ID
之前传递LastPolledTarg
的值。刚刚解决了这个问题-这是参数的命名问题-在查询中,似乎无法将参数命名为与任何字段相同的名称
将查询更改为:
UPDATE tableName SET tableName.LastPolledDtg = LastPolledDtg
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。在ms Access中,参数的顺序必须与SQL语句的顺序相同+1太好了!持久性得到了回报,感谢您分享答案。这根本不是Access/Jet的问题,因为您实际传递给Jet的SQL中没有参数。呃,我至少花了一个小时来讨论这个问题。我认为问题在于您设置参数的顺序。它们的顺序必须与SQL语句的顺序相同。您首先添加了ID参数,在SQL语句中是最后添加的。请注意,OleDb可以使用命名参数:请参阅