C# 如何使用oledb将记录插入access表?

C# 如何使用oledb将记录插入access表?,c#,winforms,ms-access,C#,Winforms,Ms Access,我在ms access中有一个此项目表 Items(Table) Item_Id(autonumber) Item_Name(text) Item_Price(currency) 我正试图用这个代码插入一条记录 OleDbConnection myCon = new OleDbConnection(ConfigurationManager.ConnectionStrings["DbConn"].ToString()); OleDbCommand cmd = new Ol

我在ms access中有一个此项目表

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

代码运行时没有出现错误,但在表中没有找到记录。我犯了什么错误?

您的sql插入文本没有使用参数。
这是错误和更糟的原因

以这种方式更改代码

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); 
}
当然,这假定price的文本框包含正确的数值。
请确保在调用上述代码之前添加此行

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

有关

的更多信息删除Convert.ToDouble(itemPriceTBox.Text)周围的单引号时是否会遇到同样的问题?现在的一个问题是,记录被插入,并且可以在运行时从gridview查看,但当我停止项目执行并预览表中的数据时,没有数据,当我再次运行项目时,gridview中没有数据。很难说,请检查连接字符串。上面的代码应该可以工作。在表中添加一些具有Access的记录,并检查它们是否在网格上可见。将数据插入Access表后,gridview将显示这些记录。但新记录未插入表中。请尝试将更改提交到数据库。您可能未启用自动提交。如果您在保存数据时仍有问题,则可以检查此答案,了解连接字符串中DataDirectory替换字符串的问题