【问题标题】:How to insert a record into a access table using oledb?如何使用 oledb 将记录插入到访问表中?
【发布时间】:2012-06-12 01:35:56
【问题描述】:

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

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

【问题讨论】:

  • 删除 Convert.ToDouble(itemPriceTBox.Text) 周围的单引号后是否会遇到同样的问题?

标签: c# winforms ms-access


【解决方案1】:

您的 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 problems can be found here

【讨论】:

  • 现在的一个问题是记录被插入并且可以在运行时从gridview查看但是当我停止项目执行并在表中预览数据时没有数据,当我再次运行项目时没有网格视图中的数据。
  • 很难说,检查你的连接字符串。上面的代码应该可以工作。在表格中添加一些带有 Access 的记录,并检查它们是否在您的网格中可见。
  • 将数据插入访问表后,gridview 将显示记录。但新记录没有插入到表中。
  • 尝试将您的更改提交到数据库。您可能没有启用自动提交。
  • 如果您在保存数据时仍然遇到问题,那么您可以查看有关连接字符串Why saving changes to database fails?中的 DataDirectory 替换字符串问题的答案
猜你喜欢
  • 1970-01-01
  • 2016-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多