【问题标题】:OleDb Update Query is not updating the database [duplicate]OleDb 更新查询未更新数据库 [重复]
【发布时间】:2019-11-12 22:19:06
【问题描述】:

我正在尝试更新我的数据库中 UID 匹配的 4 列,查询运行良好,没有错误输出,但数据库保持不变。数据库完全关闭,除了代码之外没有其他任何东西可以打开。我对在代码中使用数据库很陌生,所以我完全无法尝试在这里找到错误。

更新查询代码如下:

conn.Open();
OleDbCommand UpdateUserCMD = new OleDbCommand("Update Accounts_Info Set Unique_ID=@Unique_ID, Last_Login_Date=@Last_Login_Date, Last_IP=@Last_IP, Last_MAC=@Last_MAC" + " Where Unique_ID=@Unique_ID", conn);
UpdateUserCMD.Parameters.AddWithValue("@Last_Login_Date", DateTime.Now.ToString("yyyy.MM.dd_hh:mm:ss"));
UpdateUserCMD.Parameters.AddWithValue("@Last_IP", GetIPAddress(Dns.GetHostName()).ToString());
UpdateUserCMD.Parameters.AddWithValue("@Last_MAC", GetMACAddress());
UpdateUserCMD.Parameters.AddWithValue("@Unique_ID", TempGUIDHolder);
UpdateUserCMD.ExecuteNonQuery();
conn.Close();

连接字符串如下:

OleDbConnection conn = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=E:/A-Level/Development/A_Level_AI_Project/A_Level_AI_Project/resources/Accounts.accdb");

其他查询工作正常,所以我不认为它的连接字符串有问题。

【问题讨论】:

  • 只是再次检查,因为您使用的是基于文件的数据库:a) 您确定您正在查看您的代码正在更改的同一个数据库文件吗? b)你确定没有任何东西(比如构建过程)在你的程序正在更改的数据库的顶部复制早期的数据库
  • 相当肯定,我可以使用相同的表名将更新替换为插入或删除查询,它们都可以正常工作。所有其他打开到数据库的连接实例都在每次查询后关闭,在同一个表中此查询后的命令工作正常,所以我认为没有任何东西在复制早期的数据库。
  • 您要更改 Unique_ID 吗?因为如果您将其更改为新值,那么您就无法希望在 where 语句中找到正确的记录。并且您确定您没有围绕该代码块的空尝试/捕获。正如所写,你应该得到一个例外

标签: c# sql oledb oledbcommand


【解决方案1】:

我认为您应该删除更新查询中设置唯一 ID 的部分

Update Accounts_Info Set Unique_ID=@Unique_ID, Last_Login_Date ...
                         ^^^^^^^^^^^^^^^^
                         don't put this in

我之所以这么说是因为我几乎可以肯定 OLE 不支持命名参数,即使您已经编写了命名参数并且它“似乎对其他查询有效”。 OLE 仅支持位置参数,因此 AddWithValue 调用的顺序必须与查询中参数出现的顺序相匹配

因为您的查询包含一个额外的 Uniqueid 参数,即您调用 AddWithValue 的顺序,即您的登录日期分配给 uid,您的 ip 分配给登录日期,mac 分配给 ip。它实际上不应该运行,因为没有为第 5 个参数提供值。

如果您无法理解我的意思,请将查询中的所有 @parameter 名称更改为 ?

在你整理好参数后,从 ExecuteNonQuery 获取返回值,它会告诉你有多少条记录受到影响。如果它是 0,那么 where 子句不匹配;仔细检查 tempGuidHolder 中的值是否出现在表中

如果您正在捕获并吞下异常(我相信这段代码应该会导致异常,因为并非所有参数都已填充),请不要;)

【讨论】:

  • 据我所知,以正确的方式使用命名参数 - 你能指出任何说 OLEDB 不支持它的东西吗?我敢肯定,我过去自己用过很多次。但肯定没有理由更新唯一 ID,因为它首先用于选择行。
  • docs.microsoft.com/en-us/dotnet/framework/data/adonet/…当使用带有 OleDbCommand 或 OdbcCommand 的参数时,添加到 Parameters 集合中的参数的顺序必须与定义的参数的顺序相匹配...。 - 我相信您可以使用命名参数,但在内部它们将被视为您已全部制作它们?并且您可以将任何您喜欢的东西放在 Add -named 的名称中,否则顺序很重要,对于这个语句,有 4 个参数提供给包含 5 个占位符的语句
  • 另外docs.microsoft.com/en-us/dotnet/api/… 备注部分OLE 不支持命名...(其他链接讨论存储过程,虽然我不希望有任何区别..)
  • 嘿,谢谢@CaiusJard。我将不得不对其进行测试,但它看起来很清楚。我的大部分工作都是使用 sql 客户端,所以这不是问题。感谢您指向文档。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-22
  • 1970-01-01
  • 2020-11-20
  • 1970-01-01
  • 2017-05-06
  • 1970-01-01
相关资源
最近更新 更多