C# Textbox.Text 变成 SQL SmallMoney

C# Textbox.Text into SQL SmallMoney

我有以下代码

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 时遇到了问题。我试过解析为 float、double、Decimal 和 decimal。所有情况都一样。

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

试试这个:

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

首先感谢E.J。 Brennan 和 Ian Kemp 让我走上了正确的道路。我不知道如何添加表彰或在 Whosebug 上调用的任何内容,但谢谢。

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

新方法如下所示:

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。抱歉所有的评论,我只是喜欢一眼就知道什么是什么。

是的,“为了所有神圣的爱,请使用准备好的语句”。