2009-02-03 17 views
5

Tengo un problema al conectar con mi 2007. Código de MS Access DB:C# Cómo conectar a 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(); 
     } 
    } 

Cuando ejecuto este código, el cuadro de mensaje aparece. Esto debería significar que mis datos están insertados. Pero cuando abro el archivo accdb, no se insertan datos. ¿Qué estoy haciendo mal?

Thnx

Editar: El valor de retorno de ExecuteNonQuery() es 1 (edito mi puesto, porque no puedo añadir algún comentario, al hacer clic en agregar comentario, el cuadro no aparece ..)

Editar 2: He creado una clase con las propiedades Título y Ubicación. Código: vacío privado btnSave_Click (remitente del objeto, 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(); 
} 

}

Dado que todavía no puede hacer clic en el botón Añadir comentario, aquí está mi nuevo código con los parámetros de SQL sin nombre:

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

¿Ha ayudado el cambio de nombre anónimo? –

+0

No, no lo hizo .. – Martijn

Respuesta

1

ExecuteNonQuery devolverá un entero que indica el número de filas afectadas . Lo primero que haría es verificar la devolución. ExecuteNonQuery puede ejecutarse y no afectar a ninguna fila, que no activará la captura.

+0

El valor de retorno es 1 – Martijn

+0

Gracias. ¡Esto me ahorró muchas molestias! Mi comando de actualización no está afectando a nada y el valor de retorno es 0. – Achilles

1

Que yo sepa, no puede usar parámetros con nombre con el parámetro OleDbParameter.

Su inserción debe ser similar:

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

Y entonces usted tiene que añadir OleDbParameters en el orden correcto. Los nombres no son usados.

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

Editar:

código no probado a continuación, pero aquí es un ejemplo de cómo lo haría.

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

edit: connection.ExecuteNonQuery(); ==> command..ExecuteNonQuery(); – Davorin

0

Cuando codigo, me gusta simplificar mi trabajo y no volver a hacer cada vez que tengo un método. Crearía simplemente un método para parámetros tales como:

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

Así de simple. Inserto y sigo usando este método de parámetro en mi actualización e inserto, etc. Espero que esto ayude.