【问题标题】:Why does invoking my UPDATE query in an Access database via OleDb not work?为什么通过 OleDb 在 Access 数据库中调用我的 UPDATE 查询不起作用?
【发布时间】:2010-10-13 07:17:09
【问题描述】:

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

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

【问题讨论】:

  • +1 太棒了!坚持得到了回报,感谢您分享答案。

标签: c# sql ms-access oledb


【解决方案1】:

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

从以下位置更改查询:

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。

【讨论】:

  • 这根本不是 Access/Jet 问题,因为您实际传递给 Jet 的 SQL 中没有参数。
  • 呃,我为此花了至少一个小时。
  • 我认为的问题是您设置参数的顺序。它们必须与 SQL 语句的顺序相同。您首先添加了 ID 参数,然后在 SQL 语句中添加了它。
  • 请注意,OleDb CAN 使用命名参数:参见stackoverflow.com/questions/4857940/…
【解决方案2】:

您的更新查询有点混乱(您使用LastPolledDtg 作为字段 作为它的值)。 如果您的意思是定义列的参数,那么它将不起作用。

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

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

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

别的东西

重新排序您的参数,以便它们以与查询中定义的顺序相同的顺序传递,这样您就可以在ID 之前传递LastPolledDtArg 的值。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 2013-04-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-10
        • 1970-01-01
        • 2015-05-13
        • 1970-01-01
        • 2013-07-05
        相关资源
        最近更新 更多