11

我在 ms 访问中有一个 this Items 表

Items(Table)    
Item_Id(autonumber)
Item_Name(text)
Item_Price(currency)

我正在尝试使用此代码插入记录。

OleDbConnection myCon = new OleDbConnection(ConfigurationManager.ConnectionStrings["DbConn"].ToString());
        OleDbCommand cmd = new OleDbCommand();
        cmd.CommandType = CommandType.Text;
        cmd.CommandText = "insert into Items ([Item_Name],[Item_Price]) values ('" + itemNameTBox.Text + "','" + Convert.ToDouble(itemPriceTBox.Text) + "')";
        cmd.Connection = myCon;
        myCon.Open();
        cmd.ExecuteNonQuery();
        System.Windows.Forms.MessageBox.Show("An Item has been successfully added", "Caption", MessageBoxButtons.OKCancel, MessageBoxIcon.Information);
        myCon.Close();

代码运行没有错误,但最后没有在表中找到记录我在做什么错误?

4

1 回答 1

17

您的 sql 插入文本不使用参数。
这是错误的原因,更糟糕的是(SqlInjection)

以这种方式更改您的代码;

using(OleDbConnection myCon = new OleDbConnection(ConfigurationManager.ConnectionStrings["DbConn"].ToString()))
{
   OleDbCommand cmd = new OleDbCommand(); 
   cmd.CommandType = CommandType.Text; 
   cmd.CommandText = "insert into Items ([Item_Name],[Item_Price]) values (?,?)";
   cmd.Parameters.AddWithValue("@item", itemNameTBox.Text);
   cmd.Parameters.AddWithValue("@price", Convert.ToDouble(itemPriceTBox.Text)); 
   cmd.Connection = myCon; 
   myCon.Open(); 
   cmd.ExecuteNonQuery(); 
   System.Windows.Forms.MessageBox.Show("An Item has been successfully added", "Caption", MessageBoxButtons.OKCancel, MessageBoxIcon.Information); 
}

当然,这假设价格文本框包含正确的数值。
确保在调用上面的代码之前添加这一行

double price;
if(double.TryParse(itemPriceTBox.Text, out price) == false)
{
    MessageBox.Show("Invalid price");
    return;
}

然后price用作参数的值@price

** 4 年后编辑 **

这个答案需要更新。在上面的代码中,我使用 AddWithValue 将参数添加到 Parameters 集合。它有效,但应告知每位读者 AddWithValue 有一些缺点。特别是当目标列需要十进制值或日期时,如果您喜欢只添加字符串的简单路径。在这种情况下,如果我只写

cmd.Parameters.AddWithValue("@price", itemPriceTBox.Text); 

结果可能是语法错误或某种奇怪的值转换,日期也可能发生同样的情况。AddWithValue 创建一个字符串参数,数据库引擎应将该值转换为预期的列类型。但是客户端和服务器之间的区域设置差异可能会导致对值的任何类型的误解。

我认为使用总是更好

cmd.Parameters.Add("@price", OleDbType.Decimal).Value = 
           Convert.ToDecimal(itemPriceTBox.Text); 

有关 AddWithValue 问题的更多信息可以在这里找到

于 2012-06-08T09:40:34.220 回答