【问题标题】:C# Textbox.Text into SQL SmallMoneyC# Textbox.Text 转换为 SQL SmallMoney
【发布时间】:2021-01-18 19:44:04
【问题描述】:

我有以下代码

String query = "INSERT INTO Product (ProductCode, Range, Type, Size, Description, Cost, Barcode) VALUE ('" + txbx_ProductCode.Text + "', '" + txbx_Range.Text + "','" +
                    txbx_Type.Text + "' , '" + txbx_Size.Text + "', '" + txbx_Description.Text + "' , '" + decimal.Parse(txbx_Cost.Text) + "' , '" + txbx_Barcode.Text + "')";

我在这一行得到以下 FormatException: FormatException Image

我怀疑我在解析 .text 时存在问题。我试过解析浮点数、双精度数、十进制和十进制。在所有情况下都是一样的。

输入的值介于 20000.00 和 100.00 之间,始终有 2 位小数,因此它们永远不会超过 smallmoney 值。

【问题讨论】:

  • 拜托,拜托,拜托,为了所有神圣的爱,使用准备好的陈述。
  • @IanKemp 感谢您提出这个问题。从来没有人告诉过我,但我会开始将其作为标准。
  • 小心 SQL 注入。使用准备好的语句。 cmd.Parameters.AddWithValue("@ProductCode", txbx_ProductCode.Text);

标签: c# sql sqldatatypes formatexception


【解决方案1】:

试试这个:

String query = "INSERT INTO Product (ProductCode, Range, Type, Size, Description, Cost, Barcode) VALUE ('" + txbx_ProductCode.Text + "', '" + txbx_Range.Text + "','" +
                    txbx_Type.Text + "' , '" + txbx_Size.Text + "', '" + txbx_Description.Text + "' , " + decimal.Parse(txbx_Cost.Text) + " , '" + txbx_Barcode.Text + "')";

在转换为十进制后,您不需要在成本周围添加单引号。

事实上,您甚至可能不需要 Decimal.Parse。也就是说,上面的代码应该可以工作吗,它确实不健壮,所以您可能需要考虑在构建 sql 字符串之前验证所有输入,并且应该花一些时间来学习如何防止 sql 注入;您的代码很容易受到影响,有人很容易在输入字段中输入值来执行任意 sql 查询,甚至删除行和表。

https://www.w3schools.com/sql/sql_injection.asp

【讨论】:

  • 我知道像这样直接使用用户输入不是好的做法,这只是一个技术演示。添加完所有 sql 功能后,我打算使用 validate 方法或类似方法将它们全部分解为自己的方法。
  • 我尝试删除单引号并删除 Decimal.Parse。同样的错误。我将尝试在今晚将所有内容发送到查询并提供更新之前将所有内容放入 validate 方法中。
  • 您应该使用 consol.writeline(query) 打印出生成的 sql 语句,然后将其复制/粘贴到 SSMS 之类的东西中并尝试执行它 - 这就是我将如何调试它。
  • 这也有助于向我们展示您的表格定义 - 我假设唯一的数字字段是“成本”,但如果还有其他字段,您也会遇到同样的问题。
  • cost 是唯一的数字字段。我将尝试 SSMS 调试并在此处发布更新。如果不是很明显,我是 C# 编码的新手,所以我只想说谢谢你的帮助。
【解决方案2】:

首先感谢 E.J. Brennan 和 Ian Kemp 让我走上了正确的道路。我不知道如何在 StackOverflow 上添加表扬或其他名称,但谢谢。

我最终将所有内容都添加到了准备好的语句中,并且出现了一些错误,但它们与我之前得到的不同并且更容易被压缩。

新方法如下所示:

using (SqlConnection sqlCon = new SqlConnection(connectionString))
        {
            //open database (closed below)
            sqlCon.Open();

            //sql query that inserts data into table using user inputs
            String query = "INSERT INTO Product(ProductCode, Range, Type, Size, Description, Cost, Barcode) VALUES(@ProductCode, @Range, @Type, @Size, " +
                "@Description, @Cost, @Barcode) ";

            //initialise sqlcommand using the query and connection
            using var command = new SqlCommand(query, sqlCon);

            //assign values and prepare them
            command.Parameters.Add("@ProductCode", SqlDbType.VarChar, 25).Value = txbx_ProductCode.Text;
            command.Parameters.Add("@Range", SqlDbType.VarChar, 20).Value = txbx_Range.Text;
            command.Parameters.Add("@Type", SqlDbType.VarChar, 50).Value = txbx_Type.Text;
            command.Parameters.Add("@Size", SqlDbType.VarChar, 15).Value = txbx_Size.Text;
            command.Parameters.Add("@Description", SqlDbType.VarChar, 100).Value = txbx_Description.Text;
            command.Parameters.Add("@Cost", SqlDbType.SmallMoney).Value = Decimal.Parse(txbx_Cost.Text);
            command.Parameters.Add("@Barcode", SqlDbType.VarChar, 13).Value = txbx_Barcode.Text;

            //prepare the added statements
            command.Prepare();
            //execute using nonquery (cause of no expected return data)
            command.ExecuteNonQuery();

            //close database connection (opened above)
            sqlCon.Close();
           
            //display succesfull insertion
            MessageBox.Show("Product succesfully added.");
        }

PS。抱歉所有评论,我只是想一眼就知道是什么。

是的,“为了所有神圣的事物的爱,请使用准备好的陈述”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-19
    • 1970-01-01
    • 1970-01-01
    • 2020-04-24
    • 2023-03-06
    • 2013-05-03
    • 1970-01-01
    相关资源
    最近更新 更多