如何使用 oledb 将记录插入到访问表中

本文关键字:访问表 插入 记录 何使用 oledb | 更新日期: 2023-09-27 18:36:42

>我在ms访问中有一个这个项目表

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();

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

如何使用 oledb 将记录插入到访问表中

你的 sql 插入文本不使用 parameters.
这是错误和更糟的原因(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 问题的更多信息,请参阅此处