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

Posted

技术标签:

【中文标题】使用 dotnet String.Format 将数据保存到数据库,失败【英文标题】:Using dotnet String.Format to save data to database, fails 【发布时间】:2019-07-01 11:35:08 【问题描述】:

我来自脚本世界,所以 .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 语句很好。我可以根据回显的内容手动重新创建插入语句并保存数据。

有人可以帮我解释一下吗?

【问题讨论】:

您需要做的就是使用SQL参数进行查询,然后它就会正常工作。 “抱怨” ...具体是什么方式?请告诉我们您的确切错误信息。并给我们一个str 的最终值样本,以配合它。但是,是的,您应该使用参数化查询……这可能对 SQL 注入攻击开放。有关示例,请参见 dev.mysql.com/doc/connector-net/en/…(假设您使用的是 mysql 连接器,而不是实体框架等其他东西) 在我的上一个答案error in my vb program of cmd.executenonquery 中有一个使用带有INSERT 语句的SQL 参数的示例。 由于日期导致问题,您是否为 MySQL 提供了正确格式的日期?如果“Stamp”的列名表明您只是存储“now”(如时间戳),那么将该列排除在查询之外并将列默认设置为当前日期/时间? 他已经给你举了一个例子……你看过链接了吗?就此而言,我也是。或者您是否想要一个演示其他内容的示例?附言您也没有根据我的要求编辑您的问题,以显示失败的已完成查询的示例以及确切的错误消息。也许这会更清楚地说明您需要更改的内容。也许您需要以不同的格式发送日期,或者按照 droopsnoot 的建议,让它设置默认值。这些是您对问题的描述中缺少的详细信息。 【参考方案1】:

首先,始终使用参数来避免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

【讨论】:

以上是关于使用 dotnet String.Format 将数据保存到数据库,失败的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 String.Format 将布尔类型转换为“ON”“OFF”

我将如何编写 String.Format 扩展方法?

C#中String.Format()方法的使用

String.Format将人民币符号改成美元符号{0:C}

.net(C#)中String.Format如何使用

C# string.format用法详解