预编译UPDATE语句ExecuteNonQuery返回1但仅首行更新成功
问题:复用预编译MySQL命令时UPDATE操作仅首次生效,后续返回成功但未修改行
背景
我们从AzureAD/AD收集数据存储到MySQL数据库,用于报表需求。开发了一个PowerShell模块操作该数据库,采用预编译语句和参数化查询以避免SQL注入。由于脚本可能连续执行3万次操作,为避免每次INSERT/UPDATE都重新预编译导致MySQL服务器内存耗尽,希望复用预编译命令。该问题仅出现在UPDATE操作,INSERT功能正常。
场景
PowerShell脚本从AzureAD收集数据,创建属性名与数据库列名对应的[PSCustomObject],遍历每个条目(如用户):若数据库无对应行则执行INSERT,否则执行UPDATE。
问题
执行UPDATE操作时,集合中第一个条目(用户)更新正常,但后续的UPDATE操作返回值为1(看似执行成功),但实际并未修改对应的数据行。
调试进展
怀疑问题源于$this.Command.Parameters.Clear()操作,但不清楚为何清除参数后首次运行正常、后续却失效。每次调用ExecuteNonQuery前重新预编译可以解决问题,但这违背了复用预编译命令的初衷。对ExecuteNonQuery和Prepare的工作原理存在认知盲区,不理解为什么明明没有修改行,却返回了1。过去4天多方搜索但收获甚微,核心疑问:针对一组参数预编译后,仅修改参数值(参数名保持不变)会导致操作失败吗?
代码说明
提供了PowerShell脚本的核心逻辑,以及基于MySQL Connector/NET实现的MySQLModule类代码,展示了命令复用、参数处理的具体方式。
内容的提问来源于stack exchange,提问作者Marc H
相关产品推荐
相关产品推荐

