【问题标题】:Insert data into MySQL database using parameters使用参数将数据插入 MySQL 数据库
【发布时间】:2017-05-13 11:48:17
【问题描述】:

最近我开发了一些将数据插入 MySQL 的软件,但有人告诉我应该使用参数。我用谷歌搜索了它们,但没有找到任何数据。

这是我的代码:

Dim Query As String
Query = "insert into baza.artikli(kod,naziv,nabavna,prodazna,ddv,kolicina,opis,opis2,mkproizvod,profit,proizvoditel) values ('" & TextBoxBarkod.Text & "','" & TextBoxNaziv.Text & "','" & kupovnacena & "','" & prodaznacena & "','" & ddv & "','" & kolicina & "','" & TextBoxOpis.Text & "','" & TextBoxOpis2.Text & "','" & mkpr & "','" & profit & "','" & TextBoxProizvoditel.Text & "')"
COMMAND = New MySqlCommand(Query, konekcija)
READER = COMMAND.ExecuteReader

【问题讨论】:

    标签: mysql vb.net


    【解决方案1】:

    防止注射

    这是一个例子

    Dim query As String
    
    query = "INSERT INTO Users (user_name) VALUES(?);"
    cmd = New MySqlCommand(query, con)
    cmd.Parameters.AddWithValue("?", Me.User_nameTextBox.Text)
    //Execute your command......
    

    【讨论】:

      【解决方案2】:
      【解决方案3】:

      我强烈建议您使用 SQL 参数。这是为了减少语法问题,但更重要的是停止 SQL 注入。请参阅Bobby Tables 了解更多详情。

      我还注意到您使用的是ExecuteReader。这通常用于选择语句。对于插入和更新,您应该使用ExecuteNonQuery。请查看documentation 了解更多信息。

      如果你还没有,我也建议你实现Using

      有时您的代码需要非托管资源,例如文件句柄、COM 包装器或 SQL 连接。 Using 块保证在您的代码完成后处理一个或多个此类资源。这使得它们可供其他代码使用。

      通过这些更改,您的代码将如下所示:

      Using con As New MySqlConnection(yourConnectionString),
            cmd As New MySqlCommand("INSERT INTO baza.artikli (kod, naziv, nabavna, prodazna, ddv, kolicina, opis, opis2, mkproizvod, profit, proizvoditel) VALUES (@kod, @naziv, @nabavna, @prodazna, @ddv, @kolicina, @opis, @opis2, @mkproizvod, @profit, @proizvoditel)", con)
      
          con.Open()
      
          cmd.Parameters.Add("@kod", MySqlDbType.[Type]).Value = TextBoxBarkod.Text
          cmd.Parameters.Add("@naziv", MySqlDbType.[Type]).Value = TextBoxNaziv.Text
          cmd.Parameters.Add("@nabavna", MySqlDbType.[Type]).Value = kupovnacena
          cmd.Parameters.Add("@prodazna", MySqlDbType.[Type]).Value = prodaznacena
          cmd.Parameters.Add("@ddv", MySqlDbType.[Type]).Value = ddv
          cmd.Parameters.Add("@kolicina", MySqlDbType.[Type]).Value = kolicina
          cmd.Parameters.Add("@opis", MySqlDbType.[Type]).Value = TextBoxOpis.Text
          cmd.Parameters.Add("@opis2", MySqlDbType.[Type]).Value = TextBoxOpis2.Text
          cmd.Parameters.Add("@mkproizvod", MySqlDbType.[Type]).Value = mkpr
          cmd.Parameters.Add("@profit", MySqlDbType.[Type]).Value = profit
          cmd.Parameters.Add("@proizvoditel", MySqlDbType.[Type]).Value = TextBoxProizvoditel.Text
      
          cmd.ExecuteNonQuery()
      
      End Using
      

      请注意,我使用了MySqlDbType.[Type]。您需要将 [Type] 替换为您在数据库中使用的数据类型。

      【讨论】:

        【解决方案4】:

        回答你的第一个问题: 设置

        TextBoxBarkod.Text = "(select password from mysql.user where user=’root’)"
        

        或者换句话说:在网上搜索SQL-injection

        有关如何使用参数的示例,请参见例如this post.

        【讨论】:

        • 这不起作用,没有提供所有字段...插入会失败,选择不会发生。如果插入只有一列,那么它会起作用......
        • 好点,至少它会产生错误;-)。做了一些改动。
        猜你喜欢
        • 1970-01-01
        • 2014-04-17
        • 2015-08-23
        • 1970-01-01
        • 1970-01-01
        • 2023-04-10
        • 2013-05-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多