使用dotnet String.Format将数据保存到数据库失败

时间:2019-07-01 11:35:08

标签: mysql sql vb.net

我来自脚本世界,所以.NET对我来说是个新手。我具有以下用于将数据保存到数据库的字符串格式。我可能缺少一些非常简单的东西。

Dim str = String.Format("INSERT INTO invoice_labels(WOpre, WOsuf, ModelNumber, SupplierID, BoxNo, BoxQty, Stamp, MachineName) VALUES({0}, {1}, '{2}', {3}, {4}, {5}, '{6}', '{7}')", WoPre_TB.Text, WoSuf_TB.Text, ModelPN_TB.Text, SupplierID_TB.Text, BoxNumber_TB.Text, FullBoxQty_TB.Text, FormattedDate, MachineName)

列值3、7和8均为字符串,其余均为整数值。 MySQL抱怨日期列(FormattedDate),但是当我回显字符串时,SQL语句很好。我可以根据回显的内容手动重新创建insert语句,并保存数据。

请问有人可以帮我一下吗?

1 个答案:

答案 0 :(得分:0)

首先,始终使用参数来避免Sql注入。请勿使用String.Format。 您将需要检查数据库中每个字段的数据类型,并相应地更正MySqlDbType和TextBoxes的.Text属性的使用。 在设置参数的.Value属性之前,应验证用户的每次输入。

    Dim str = "INSERT INTO invoice_labels(WOpre, WOsuf, ModelNumber, SupplierID, BoxNo, BoxQty, Stamp, MachineName) VALUES(@WOpre, @WOsuf, @ModelNumber, @SupplierID, @BoxNo, @BoxQty, @Stamp, @MachineName);"
    Using cn As New MySqlConnection("Your connection string")
        Using cmd As New MySqlCommand(str, cn)
            cmd.Parameters.Add("@WOpre", MySqlDbType.Int32).Value = CInt(WoPre_TB.Text)
            cmd.Parameters.Add("@WOsuf", MySqlDbType.Int32).Value = CInt(WoSuf_TB.Text)
            cmd.Parameters.Add("@ModelNumber", MySqlDbType.String).Value = ModelPN_TB.Text
            cmd.Parameters.Add("@SupplierID", MySqlDbType.Int32).Value = CInt(SupplierID_TB.Text)
            cmd.Parameters.Add("@BoxNo", MySqlDbType.Int32).Value = CInt(BoxNumber_TB.Text)
            cmd.Parameters.Add("@BoxQty", MySqlDbType.Int32).Value = CInt(FullBoxQty_TB.Text)cmd.Parameters.Add("", MySqlDbType.Int32).Value =
            cmd.Parameters.Add("@Stamp", MySqlDbType.String).Value = FormattedDate
            cmd.Parameters.Add("@MachineName", MySqlDbType.String).Value = MachineName
            cn.Open()
            cmd.ExecuteNonQuery()
        End Using
    End Using