【问题标题】:Using INSERT INTO SELECT & VALUES TOGETHER一起使用 INSERT INTO SELECT & VALUES
【发布时间】: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?

标签: c# mysql


【解决方案1】:

您正在尝试将 vendacod 作为字符串插入,但它是一个整数列 ( int(5) )。尝试将vendacod添加为整数参数

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;";

    var cmd = new MySqlCommand(insertInsumosVenda, BDconnection);
   cmd.CommandType = CommandType.Text;
     cmd.Parameters.Add("@vendacod", MySqlDbType.Int32).Value = vendacod;
    cmd.conection.Open();
   var result= cmd.ExecuteNonQuery();
    cmd.connection.Close();

【讨论】:

    【解决方案2】:

    我真的不知道你为什么会遇到这个问题,但你可以尝试使用 MySqlParameter, 你可以在这里阅读更多信息:https://dev.mysql.com/doc/dev/connector-net/8.0/html/P_MySql_Data_MySqlClient_MySqlCommand_Parameters.htm

    反正实现是这样的:

      MySqlParameter p1= new MySqlParameter("@vendacod",vendacod);
        
        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);
        
        insertInsumosVendaCmd.Parameters.Add(p1);
        
       InsertInsumosVendaCmd.ExecuteNonQuery();
    

    【讨论】:

    • 没用,在截屏时我才意识到:它并不总是'1',它得到的“insumos_da_venda_temp”第一列的值甚至不在代码中,所以我不知道发生了什么
    • 您已将此标记为答案,但尚不清楚它是如何成为答案的。如果您以其他方式解决了它,请发布您自己的答案,而不是标记现有答案。如果有的话,Serge's 是更好的答案,因为它仍然使用 ExecuteReader 来运行不返回任何结果的查询。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-16
    • 2010-10-26
    • 1970-01-01
    • 2012-07-06
    • 1970-01-01
    • 2014-09-01
    • 1970-01-01
    相关资源
    最近更新 更多