C# 如何使用oledb将记录插入access表?
我在ms 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
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替换字符串的问题