2009-02-03 45 views
5

Tôi có một vấn đề kết nối với MS Access DB 2007. Mã của tôi:C# Làm thế nào để kết nối với MS Access 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(); 
     } 
    } 

Khi tôi chạy mã này, các bảng thông báo xuất hiện. Điều này có nghĩa là dữ liệu của tôi được chèn vào. Nhưng khi tôi mở tập tin accdb không có dữ liệu được chèn vào. Tôi đang làm gì sai?

Thnx

Edit: Giá trị trả về của ExecuteNonQuery() là 1 (để tôi chỉnh sửa bài viết của tôi, vì tôi không thể thêm bất kỳ ý kiến, khi tôi nhấp thêm lời bình, hộp không hiển thị ..)

Chỉnh sửa 2: Tôi đã tạo một lớp có thuộc tính Tiêu đề và Vị trí. Mã số: riêng void btnSave_Click (đối tượng người gửi, 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(); 
} 

}

Kể từ khi tôi vẫn không thể nhấn vào nút bình luận thêm, đây là mã mới của tôi với các thông số sql không tên:

// 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 
+0

Thay đổi tham số không tên có hữu ích không? –

+0

Không, nó không .. – Martijn

Trả lời

1

ExecuteNonQuery sẽ trả về một int cho biết số hàng bị ảnh hưởng . Điều đầu tiên tôi sẽ làm là kiểm tra sự trở lại. ExecuteNonQuery có thể thực thi và không ảnh hưởng đến bất kỳ hàng nào, điều đó sẽ không kích hoạt việc bắt.

+0

Giá trị trả về là 1 – Martijn

+0

Cảm ơn bạn. Điều này đã cứu tôi rất nhiều rắc rối! Lệnh cập nhật của tôi không ảnh hưởng đến bất kỳ thứ gì và giá trị trả lại là 0. – Achilles

1

Theo hiểu biết của tôi, bạn không thể sử dụng thông số được đặt tên với OleDbParameter.

chèn của bạn sẽ giống như thế:

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

Và sau đó bạn phải thêm OleDbParameters theo đúng thứ tự. Tên không được sử dụng.

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

Edit:

đang chưa được kiểm tra dưới đây nhưng đây là một ví dụ về làm thế nào tôi sẽ làm điều đó.

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(); 
    } 
} 
+0

chỉnh sửa: connection.ExecuteNonQuery(); ==> command..ExecuteNonQuery(); – Davorin

0

Khi tôi viết mã, tôi muốn đơn giản hóa công việc của mình và không làm lại bao giờ tôi có phương pháp. Tôi sẽ đơn giản tạo phương thức cho các thông số như:

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

Đây là cách đơn giản. Tôi chèn và tiếp tục sử dụng phương pháp tham số này trong bản cập nhật của tôi và chèn vv .... Hy vọng điều này sẽ giúp.

Các vấn đề liên quan