动态SQL查询中MySqlConnector参数无法赋值问题排查
动态SQL中参数未赋值问题
在C#代码中通过以下方式设置@pName参数:
using (MySqlCommand dynamicQueryCommand = new MySqlCommand(dynamicQueryWithParameter, conn)) { dynamicQueryCommand.Parameters.Add("@pName", MySqlDbType.String); dynamicQueryCommand.Parameters["@pName"].Value = "John"; using (MySqlDataReader dynamicQueryReader = dynamicQueryCommand.ExecuteReader()) { string output = ""; object[] values = new object[dynamicQueryReader.FieldCount]; while (dynamicQueryReader.Read()) { dynamicQueryReader.GetValues(values); output += values[0] + "\n"; } } }
dynamicQueryWithParameter中的SQL语句如下:
SET @sql = 'select name from person'; SET @sql = Concat(@sql, ' WHERE name = @pName '); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
但@pName参数似乎未被赋值,输出结果始终如同该参数为null。预期生成的查询语句应为:
select name from person where name = 'John'
尝试过多种写法,例如:
SET @sql = Concat(@sql, ' WHERE name = '@pName' ');
或
SET @sql = Concat(@sql, ' WHERE name = ''@pName'' ');
均未解决问题。请问这是MySqlConnector的Bug、我的语法错误还是其他问题?
更新:临时解决方法
存在一些临时解决方法,例如Marc Gravell建议的使用USING,但当查询较长且需修改时,统计查询中的?数量来添加新参数容易出错,且USING后的参数顺序至关重要。
另一种方法是创建临时用户变量并在字符串查询中使用:
SET @pName_var = @pName; SET @sql = 'select name from person'; SET @sql = Concat(@sql, ' WHERE name = @pName_var '); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
此方法可得到预期结果,那么这是否是MySqlConnector的Bug或未支持的特性?还是我在其他地方存在错误?
内容的提问来源于stack exchange,提问作者mitdm
相关产品推荐
相关产品推荐

