C#如何连接到MS Access 2007

我在连接到MS Access DB 2007时遇到问题。代码:

private void btnSave_Click(object sender, EventArgs e) { OleDbConnection Conn = new OleDbConnection(); try { string conn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="+ Directory.GetCurrentDirectory() +"\\dvd_manager.accdb;Persist Security Info=False;"; Conn.ConnectionString = conn; Conn.Open(); int i = cbbLocatie.SelectedIndex + 65; char c = (char)i; string sql = "INSERT INTO DVD (titel, locatie)VALUES(@titel, @locatie)"; OleDbCommand Com = new OleDbCommand(); Com.CommandText = sql; Com.Connection = Conn; OleDbParameter Param = new OleDbParameter("@titel", txtTitle.Text); Com.Parameters.Add(Param); Param = new OleDbParameter("@locatie", c); Com.Parameters.Add(Param); Com.ExecuteNonQuery(); Conn.Close(); MessageBox.Show("Data is opgeslagen " + sql); } catch (Exception ex) { MessageBox.Show("Fout opgetreden: " + ex.Message); } finally { Conn.Close(); } } 

当我运行此代码时,消息框出现。 这应该意味着我的数据被插入。 但是当我打开accdb文件时,没有插入数据。 我究竟做错了什么?

日Thnx

编辑:ExecuteNonQuery()的返回值是1(我编辑我的post,因为我无法添加任何评论,当我点击添加评论时,框没有显示..)

编辑2:我创建了一个具有Title和Location属性的类。 代码:private void btnSave_Click(object sender,EventArgs e){OleDbConnection Conn = new OleDbConnection();

 try { string conn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="+ Directory.GetCurrentDirectory() +"\\dvd_manager.accdb;Persist Security Info=False;"; Conn.ConnectionString = conn; // Create object Medium M = new Medium(); int i = cbbLocatie.SelectedIndex + 65; char c = (char)i; M.Location = c; M.Title = txtTitle.Text; Conn.Open(); string sql = "INSERT INTO DVD (titel, locatie)VALUES(@titel, @locatie)"; OleDbCommand Com = new OleDbCommand(); Com.CommandText = sql; Com.Connection = Conn; OleDbParameter Param1 = new OleDbParameter("@titel", M.Title); Com.Parameters.Add(Param1); OleDbParameter Param2 = new OleDbParameter("@locatie", M.Location); Com.Parameters.Add(Param2); int ret = Com.ExecuteNonQuery(); Conn.Close(); MessageBox.Show("Data is opgeslagen " + ret); } catch (OleDbException ex) { MessageBox.Show(ex.Message); } catch (Exception ex) { MessageBox.Show("Fout opgetreden: " + ex.Message); } finally { Conn.Close(); } 

}

由于我仍然无法点击添加评论按钮,这里是我的新代码,其中包含无名的sql参数:

 // some code Conn.Open(); string sql = "INSERT INTO DVD (titel, locatie)VALUES(?, ?)"; OleDbCommand Com = new OleDbCommand(); Com.CommandText = sql; Com.Connection = Conn; OleDbParameter Param1 = new OleDbParameter("@p1", OleDbType.VarChar, 1); Param1.Value = M.Title; Com.Parameters.Add(Param1); OleDbParameter Param2 = new OleDbParameter("@p2", OleDbType.VarChar, 255); Param2.Value = M.Location; Com.Parameters.Add(Param2); int ret = Com.ExecuteNonQuery(); Conn.Close(); // morde code 

ExecuteNonQuery将返回一个int,表示受影响的行数。 我要做的第一件事就是检查回报。 ExecuteNonQuery可以执行而不会影响任何不会触发catch的行。

据我所知,您不能在OleDbParameter中使用命名参数。

您的插入应如下所示:

 string sql = "INSERT INTO DVD (titel, locatie)VALUES(?, ?)"; 

然后你必须以正确的顺序添加OleDbParameters。 名称未使用。

http://msdn.microsoft.com/en-us/library/system.data.oledb.oledbparameter.aspx

编辑:

下面未经测试的代码,但这里是我将如何做的一个例子。

 using(OleDbConnection connection = new OleDbConnection(CONNECTION_STRING)) { using(OleDbCommand command = connection.CreateCommand()) { command.CommandType = CommandType.Text; command.CommandText = "INSERT INTO DVD(title,locatie)VALUES(?,?)"; command.Parameters.Add("@p1", OleDbType.VarChar, 1).Value = M.Title; command.Parameters.Add("@p2", OleDbType.VarChar, 255).Value = M.Location; connection.Open(); int ret = command.ExecuteNonQuery(); } } 

当我编码时,我喜欢简化我的工作,而不是重做我有时间的方法。 我会简单地为参数创建一个方法,例如:

 public void setParameter(String paramAT, String paramTxt) { OleDbCommand myCommand; DbParameter parameter = myCommand.CreateParameter(); parameter.ParameterName = paramAT; parameter.Value = paramTxt; myCommand.Parameters.Add(parameter); } public int CreateDVD() { try { string strSqldvd = "INSERT INTO DVD(title,locatie)VALUES(@title,@locate?)"; myCommand = (OleDbCommand)dbconn.MyProvider.CreateCommand(); dbconn.MyConnection.Open(); myCommand.Connection = dbconn.MyConnection; myCommand.CommandText = strSqldvd; setParameter("@title",M.Title ); setParameter("@locate", M.Location); } catch (Exception) { throw new ArgumentException(); } int count = myCommand.ExecuteNonQuery(); dbconn.MyConnection.Close(); return count; } 

这简直就是这样。 我插入并继续使用此参数方法在我的更新和插入等….希望这将有所帮助。