gpt4 book ai didi

c# - 为什么 DELETE 语句在 MySql Workbench 和 PHP/PDO 中运行时会在 MySQL Connector/net 中默默失败?

转载 作者:行者123 更新时间:2023-11-29 07:27:03 25 4
gpt4 key购买 nike

我有一个 MariaDB 数据库,其中包含一个表,其中包含有关在 CentOS 7 服务器上运行的移动设备(android 和 ios)的信息,该服务器具有 Mono JIT 编译器版本 5.4.0.201 和 MySql Connector/NET(最新版本 8.0.13)。

一切都很好,除了我无法通过连接器/NET 从设备表中删除基于推送 token 的设备。表定义如下:

CREATE TABLE `Devices` (
`idDevices` int(11) NOT NULL AUTO_INCREMENT,
`notificationId` varchar(160) DEFAULT NULL,
`deviceId` varchar(64) NOT NULL,
`isAndroid` tinyint(1) NOT NULL,
`deviceModel` varchar(64) DEFAULT NULL,
`appMajor` tinyint(4) DEFAULT NULL,
`appMinor` tinyint(4) DEFAULT NULL,
PRIMARY KEY (`idDevices`),
UNIQUE KEY `isAndroid` (`isAndroid`,`deviceId`),
UNIQUE KEY `notificationId_UNIQUE` (`isAndroid`,`notificationId`),
KEY `appVersion` (`appMajor`,`appMinor`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

当我从我的 Mono 应用程序运行 DELETE 语句时,没有发生异常,但是从 ExecuteNonQuery() 返回的 int 值始终为 0,并且没有从表中删除任何行。 mariadb.log 中没有记录任何错误或警告 (log_warning=4)。如果我将完全相同的 SQL 语句复制到 MySql Workbench 并在那里执行该语句,则行将按预期删除。如果我创建一个 PHP 脚本并使用 PDO 连接到同一个数据库,它也会按预期工作。所有三个测试用例都使用相同的用户 (root)。所以这似乎是 Connector/NET 特有的问题

            var tokenCount = 0;
var sql = new StringBuilder ("DELETE FROM Devices WHERE isAndroid = 0 AND notificationId IN ('");

while (...) {
sql.Append (token);
sql.Append ("','");
tokenCount++;
}

sql.Length -= 2;
sql.Append (')');

using (var connection = new MySqlConnection (connectionString)) {
connection.Open ();
using (var command = new MySqlCommand (sql.ToString (), connection)) {
var affectedRows = command.ExecuteNonQuery ();
if (affectedRows != tokenCount) {
//Always logs affectedRows(0)
log.Warn ($"Remove tokenCount({tokenCount}) != affectedRows({affectedRows}). sql={sql}");
}
}
}

更新:我启用了 general_log,我看到正确的数据库已初始化并且语句已运行 - 但表未更改!日志输出:

        3 Init DB   mydb
3 Query DELETE FROM Devices WHERE isAndroid = 0 AND notificationId IN ('002B1C477DB4F20868D157A806DF70E05D61D3950562C03E092707CA9C5CCF23')

更新 #2: 我尝试使用相同的 WHERE 子句将 DELETE 语句更改为 SELECT 语句,结果您瞧,没有返回任何行。因此,由于某种原因,notificationId 上的匹配似乎不起作用。会不会是编码问题?为什么它适用于其他客户端,但不适用于我的连接器/NET 客户端?

最佳答案

好的,经过数小时的调试后我发现了问题。事实证明它与 Connector/NET 无关。问题在于我是如何构建 token 的,我不小心附加了一些不会在我的 log4net 日志中打印的字符,所以 SQL 在客户端似乎没问题——但发送到数据库服务器的实际 SQL 字符串包含无效代币!

关于c# - 为什么 DELETE 语句在 MySql Workbench 和 PHP/PDO 中运行时会在 MySQL Connector/net 中默默失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53224721/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com