2017-07-10 66 views
-1

搜索大约一个小时后,看来这是使用OLEDB libary插入一条记录到Access数据库的正确方法但它不工作对我来说,帮助...添加到数据库OLEDB C#

 InitializeComponent(); 
     System.Data.OleDb.OleDbConnection conn = new 
     System.Data.OleDb.OleDbConnection(); 
     // TODO: Modify the connection string and include any 
     // additional required properties for your database. 
     conn.ConnectionString = @"Provider = Microsoft.ACE.OLEDB.12.0; Data Source = \\crd-a555-015.occ.local\c$\Users\james.piper\Documents\Visual Studio 2015\Projects\Project V1\Project Database.accdb"; 
     try 
     { 
      OleDbCommand cmd = new OleDbCommand(); 
      cmd.CommandType = CommandType.Text; 
      cmd.CommandText = "INSERT INTO Work_Done (employee,client,project,task,hours)" + " VALUES (@employee,@client,@project,@task,@hours)"; 
      cmd.Parameters.AddWithValue("@employee", user.employee); 
      cmd.Parameters.AddWithValue("@client", listBox1.SelectedItem.ToString()); 
      cmd.Parameters.AddWithValue("@project", listBox2.SelectedItem.ToString()); 
      cmd.Parameters.AddWithValue("@task", listBox3.SelectedItem.ToString()); 
      cmd.Parameters.AddWithValue("@hours", listBox4.SelectedItem.ToString()); 



      conn.Open(); 
      cmd.ExecuteNonQuery(); 
      conn.Close(); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show("sql insert fail"); 
     } 
+1

您将需要定义“无效”。你得到一个错误?意外的行为?有些事情没有按照你的想法执行?我们需要一些更详细的信息。 – ADyson

+1

你收到了什么错误信息? – craigster

+0

据我记得,OleDb不支持命名参数,只有序号参数。因此,您应该更改查询以使用问号('?')而不是参数名称。另外,你应该习惯在'using'语句中使用所有的IDisposables - OleDbConnection和OleDbCommand是IDisposable。 –

回答

0

我会写这段代码是这样的:

var connectionString = @"Provider = Microsoft.ACE.OLEDB.12.0; Data Source = \\crd-a555-015.occ.local\c$\Users\james.piper\Documents\Visual Studio 2015\Projects\Project V1\Project Database.accdb"; 
var query = "INSERT INTO Work_Done (employee,client,project,task,hours) VALUES (@employee,@client,@project,@task,@hours)"; 
using (var conn = new OleDbConnection(connectionString)) 
{    
    using(var cmd = new OleDbCommand(query, conn)) 
    { 
     // No need to specifiy command type, since CommandType.Text is the default 

     // I'm assuming, of course, your parameter data types. You should change them if my assumptions are wrong. 
     cmd.Parameters.Add("@employee", OleDbType.Integer).Value = user.employee; 
     cmd.Parameters.Add("@client", OleDbType.Integer).Value = Convert.ToInt32(listBox1.SelectedItem); 
     cmd.Parameters.Add("@project", OleDbType.Integer).Value = Convert.ToInt32(listBox2.SelectedItem); 
     cmd.Parameters.Add("@task", OleDbType.Integer).Value = Convert.ToInt32(listBox3.SelectedItem); 
     cmd.Parameters.Add("@hours", OleDbType.Integer).Value = Convert.ToInt32(listBox4.SelectedItem); 

     try 
     { 
      conn.Open(); 
      cmd.ExecuteNonQuery(); 
      conn.Close(); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show($"sql insert fail: {ex}"); 
     } 
    }     
} 

的主要变化是这些:

  1. 使用Using小号对于实现IDisposable接口的类的每个实例的声明。
  2. 使用带参数的构造函数来缩短代码(并且更具可读性,恕我直言)。
  3. 请注意,OleDbCommand的构造函数也具有OleDbConnection对象。在你的代码中,你没有指定到命令的活动连接。
  4. 添加参数Add而不是AddWithValue。阅读this blog post找出原因。
+0

sql插入失败:System.Data.OleDb.OleDbException(0x80040E10):参数@client没有默认值。 –

+0

检查您发送的值。 P –

+0

我做了一个console.writeline的listbox1.selecteditem.tostring,它打印出正确的值,我不明白它是如何是一个'空'价值后 –