Acerca de:

Este blog contiene los códigos, ejemplos y bases de datos que he usado cuando aprendía acerca de algún tema específico. En lugar de borrarlos (una vez dominado ya el tema), he decidido publicarlos :)

jueves, 17 de febrero de 2011

C# y Ms Access: Excepciòn del tipo "Insert Into Syntaxis Error"

Sucedió un día que tenía que insertar unos datitos a una base de datos en Access 2003 usando C#. La base de datos tiene una sola tabla (la llamaré "miTabla") con tres campos: "No", "un_ID" y "Tittle" de tipos numérico, texto y texto, respectivamente.

Mi código era:

private void AddDato(string No, string ID, string Tittle, ref OleDbConnection cnn)
        {
            OleDbCommand cmd = new OleDbCommand(
"INSERT INTO miTabla (No, un_ID, Tittle) VALUES(@Num, @uID, @nTittle)", cnn);
            cmd.Parameters.AddWithValue("@Num", Convert.ToInt32(No));
            cmd.Parameters.AddWithValue("@uID", ID);
            cmd.Parameters.AddWithValue("@nTittle", Tittle);          

                cnn.Open();
                cmd.ExecuteNonQuery();

                cmd.Dispose();
                cnn.Close();
            }
        }


Y a pesar de estar todo bien, siempre me tiraba una excepción que decía "Syntaxis Error en Insert Into", o cualquier cosa parecida, en la línea cmd.ExecuteNonQuery().

Después de horas depurando y leyendo foros, encontré por ahí un tip clave:
A las bases de datos en Access no les gustan los campos con nombres como "Date", "login" o "Password".

Entonces el error no estaba en mi Insert Into, si no, posiblemente, en los nombres de mis campos.
Hice una pequeña modificación al código (no a la base de datos) y el problema se resolvió maravillosamente:

private void AddDato(string No, string ID, string Tittle, ref OleDbConnection cnn)
        {
            OleDbCommand cmd = new OleDbCommand(
"INSERT INTO miTabla ([No], [un_ID], [Tittle]) VALUES(@Num, @uID, @nTittle)", cnn);
            cmd.Parameters.AddWithValue("@Num", Convert.ToInt32(No));
            cmd.Parameters.AddWithValue("@uID", ID);
            cmd.Parameters.AddWithValue("@nTittle", Tittle);

                cnn.Open();
                cmd.ExecuteNonQuery();


                cmd.Dispose();
                cnn.Close();
            }
        }
 

Dejo como tarea hallar el cambio que hice :)