3

更新 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# 更新表时关闭访问。

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

4

4 回答 4

5

刚刚解决了这个问题 - 它是参数的命名 - 似乎您不能将查询中的参数命名为与任何字段相同。

从以下位置更改查询:

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();
}

我爱访问。

于 2009-03-14T11:16:01.937 回答
3

您的更新查询有点令人困惑(您将LastPolledDtg其用作字段值)。如果您的意思是定义列的参数,那么它将不起作用。

否则,请尝试使用以下PARAMETER语法在 Access 中重写您的查询,例如:

PARAMETERS LastPolledDtgArg Text ( 255 ), ID Long;
UPDATE tableName SET tableName.LastPolledDtg = [LastPolledDtgArg]
WHERE tableName.key = [ID];

如果这不起作用,请尝试直接从 C# 使用 SQL 进行查询,而不是尝试执行存储的查询。

别的东西

重新排序您的参数,以便它们以与在 Query 中定义的顺序相同的顺序传递,以便您传递LastPolledDtArgbefore的值ID

于 2009-03-14T10:36:47.257 回答
1

在 ms-access 中,参数的顺序必须与 SQL 语句的顺序相同

于 2013-08-28T11:34:54.047 回答
0

我不是 Access 编码器,但听起来可能正在使用隐式事务。这意味着当您执行数据修改命令时,会自动打开一个事务,该事务必须在您的代码中显式提交/回滚。

无论是那个还是由于某种原因,您的更新都不会影响任何行。

于 2009-03-14T00:39:35.820 回答