2009-02-03 4 views
5

У меня есть проблемы с подключением к моему MS Access DB 2007. Код:C# Как подключиться к 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(); 
     } 
    } 

Когда я запускаю этот код, то MessageBox идет вверх. Это должно означать, что мои данные вставлены. Но когда я открываю файл accdb, данные не вставляются. Что я делаю не так?

Thnx

Edit: Возвращаемое значение ExecuteNonQuery() 1 (я редактировать свой пост, потому что я не могу добавить любые комментарии, когда я нажимаю добавить комментарий, коробка не появляется ..)

Редактировать 2: Я создал класс с свойствами Title и Location. Код: private void btnSave_Click (отправитель объекта, 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 
+0

Помогло ли изменение имени безымянного параметра? –

+0

Нет, это не так. – Martijn

ответ

1

ExecuteNonQuery возвращает Int, указывающий на количество строк , Первое, что я хотел бы сделать, это проверить возвращение. ExecuteNonQuery может выполнять и не влиять на любые строки, которые не будут запускать catch.

+0

Возвращаемое значение 1 – Martijn

+0

Спасибо. Это спасло меня от хлопот! Моя команда «Обновить» ничего не влияет, а возвращаемое значение равно 0. – Achilles

1

Насколько я знаю, вы не можете использовать именованные параметры с помощью OleDbParameter.

Добавленное должен выглядеть следующим образом:

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

И тогда вы должны добавить OleDbParameters в правильном порядке. Имена не используются.

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

Edit:

Непроверенные код ниже, но вот пример того, как я бы это сделать.

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

изменить: connection.ExecuteNonQuery(); ==> command..ExecuteNonQuery(); – Davorin

0

Когда я кодирую, мне нравится упрощать свою работу, а не повторять когда-нибудь у меня есть метод. Я бы просто создал метод для таких параметров, как:

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

Так просто. Я вставляю и продолжаю использовать этот метод параметров в своем обновлении и вставке и т. Д. Надеюсь, это поможет.

Смежные вопросы