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 查询,甚至删除行和表。
首先感谢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。抱歉所有的评论,我只是喜欢一眼就知道什么是什么。
是的,“为了所有神圣的爱,请使用准备好的语句”。
我有以下代码
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 查询,甚至删除行和表。
首先感谢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。抱歉所有的评论,我只是喜欢一眼就知道什么是什么。
是的,“为了所有神圣的爱,请使用准备好的语句”。