【发布时间】:2021-09-21 17:28:47
【问题描述】:
我在将 INSERT INTO 与另一个表中的值和变量中的一个值一起使用时遇到问题。
仅使用 MySQL,此查询完美运行:
INSERT INTO insumos_da_venda (vendacod, insumocod, nome, quantidade, unidmedida, preco) `
SELECT '11' AS vendacod
, cod
, nome
, quantidade
, unidmedida
, preco
FROM insumos_da_venda_temp
但是当我尝试在 c# 代码中使用它时,它会将我放置在 '11' 的任何内容转换为 '1'。
不管它是变量、随机值还是空白,当我执行命令时它总是'1'
这是 c# 代码:
string insertInsumosVenda = "INSERT INTO insumos_da_venda (vendacod, insumocod, nome, quantidade, unidmedida, preco)
SELECT '" + vendacod + "' AS vendacod
, cod
, nome
, quantidade
, unidmedida
, preco
FROM insumos_da_venda_temp;";
MySqlCommand insertInsumosVendaCmd = new MySqlCommand(insertInsumosVenda, BDconnection);
reader = insertInsumosVendaCmd.ExecuteReader();
while (reader.Read()) { }
reader.Close();
这里,变量 'vendacod' 可以是 0 到 99999 之间的任何值
vendacod 列是 int(5),但我也尝试将其更改为 varchar,但仍然无效。
我见过一些类似的问题,但没有一个对我有用,我不知道为什么。
编辑1:
您应该使用参数化查询。您的代码容易受到 SQL 注入
我知道它的代码写得很糟糕,我制作这个程序只是为了学习目的,现在我只学习c#,之后我会升级我的MySQL技能,谢谢你的提示
vendacod 列是 int(5) 但我也尝试将其更改为 varchar 并且仍然没有工作 - 不能完全相信 C# 不能处理 显示格式化程序,我不敢相信使它成为 varchar 失败(除非它是一个 varchar(1) 并且你不知何故没有得到 截断错误?) - 你能展示一些“不工作”的截图吗? 作为varchar?
在截屏时,我刚刚意识到:它并不总是“1”,它获取的“insumos_da_venda_temp”第一列的值甚至不在代码中,所以我不知道发生了什么
这里有一些截图: https://imgur.com/a/1iaHrj2
编辑2:
解决了 3 天,我终于成功了。
我信任 @CaiusJard,他说它应该可以工作,然后我决定找出任何其他原因导致它不工作。
事实是,100% 是我的错误,我所做的是:将所有内容从“insumos_da_venda_temp”选项卡中转移出来,然后尝试从那里插入“insumos_da_venda”选项卡,因为它什么都没有,我认为有些东西发疯了正在插入甚至不存在的数据。
谢谢大家的回复,你们每一个人都帮了我很多,不仅在这个问题上,还教我一些mysql
【问题讨论】:
-
使用 ExecuteScalar 而不是 Executereader
-
您应该使用参数化查询。您的代码易受 SQL 注入攻击。 c-sharpcorner.com/UploadFile/a20beb/…
-
1) 不要这样写 SQL,它会导致this。 2)如果列是一个int,你为什么把值放在字符串分隔符
'? -
@nabuchodonossor 没有; DML 是 ExecuteNonQuery,而不是 ExecuteScalar(用于检索大小为 1x1 的结果集)
-
vendacod 列是 int(5) 但我也尝试将其更改为 varchar 但仍然无法正常工作 - 不太相信 C# 无法处理显示格式化程序,我不太相信将其设置为 varchar 失败(除非它是 varchar(1) 并且您以某种方式没有收到截断错误?)-您能否显示一些“不工作”的屏幕截图作为 varchar?