Error al enviar datos a la base de datos de Access
Tengo esta excepción cuando intento enviar mi código a la base de datos de Access:
System.Data.OleDb.OleDbException (0x80040E07): no coincide el tipo de datos en una expresión de condición de selección
en System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling (hr OleDbHResult)
en System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult (tagDBPARAMS dbParams, de objetos y ExecuteResult)
en System.Data.OleDb.OleDbCommand.ExecuteCommandText (Object y ExecuteResult)
en System.Data. OleDb.OleDbCommand.ExecuteCommand (CommandBehavior comportamiento, de objetos y ExecuteResult)
en System.Data.OleDb.OleDbCommand.ExecuteReaderInternal (comportamiento CommandBehavior, método String)
en System.Data.OleDb.OleDbCommand.ExecuteNonQuery ()
en KPIZ.Form2.btn_save_Click (remitente objeto , EventArgs e) en C: \ Users \ booku \ source \ repos \ KPIZ \ KPIZ \ Form2.cs: línea 110
Mi código:
private void btn_save_Click(object sender, EventArgs e)
{
try
{
byte[] imageBt = null;
FileStream fstream = new FileStream(this.textBox2.Text, FileMode.Open, FileAccess.Read);
BinaryReader br = new BinaryReader(fstream);
imageBt = br.ReadBytes((int)fstream.Length);
connection.Open();
OleDbCommand command = new OleDbCommand();
command.Connection = connection;
command.CommandText = @"INSERT INTO [SportInfo]([ID],[FirstName],[LastName],[DOB],[Sport],[DIW],[Image])" + "VALUES(@id, @Fn, @Ln, @Date, @Sports, @days ,@IMG)";
command.Parameters.Add(new OleDbParameter("@Fn", Convert.ToString(txt_fname.Text)));
command.Parameters.Add(new OleDbParameter("@Ln", Convert.ToString(txt_lname.Text)));
command.Parameters.Add(new OleDbParameter("@Date", Convert.ToString(mtxt_dob.Text)));
command.Parameters.Add(new OleDbParameter("@Sports", Convert.ToString(txt_sport.Text)));
command.Parameters.Add(new OleDbParameter("@days", Convert.ToInt32(nmc_diw.Text)));
command.Parameters.Add(new OleDbParameter("@id", Convert.ToInt32(txt_id.Text)));
command.Parameters.Add(new OleDbParameter("@IMG", imageBt));
command.ExecuteNonQuery();
MessageBox.Show("Data Saved");
connection.Close();
}
catch (Exception ex)
{
MessageBox.Show("Unlucky " + ex);
connection.Close();
}
try
{
connection.Open();
OleDbCommand command = new OleDbCommand();
command.Connection = connection;
string query = "select ID,LastName,FirstName,DOB,Sport,DIW, from SportInfo ";
command.CommandText = query;
OleDbDataAdapter da = new OleDbDataAdapter(command);
dt = new DataTable();
da.Fill(dt);
dataGridView1.DataSource = dt;
connection.Close();
}
}
Respuestas
Los parámetros OLEDB siempre son posicionales. Esto significa que el orden de los parámetros en su consulta debe coincidir con el orden de los parámetros a medida que se agregan en su código.
Además, debe agregar su parámetro de fecha para que sea una fecha, no una cadena.
Ajuste el orden de sus parámetros para que coincida con:
command.Parameters.Add(new OleDbParameter("@id", Convert.ToInt32(txt_id.Text)));
command.Parameters.Add(new OleDbParameter("@Fn", Convert.ToString(txt_fname.Text)));
command.Parameters.Add(new OleDbParameter("@Ln", Convert.ToString(txt_lname.Text)));
command.Parameters.Add(new OleDbParameter("@Date", DateTime.Parse(mtxt_dob.Text)));
command.Parameters.Add(new OleDbParameter("@Sports", Convert.ToString(txt_sport.Text)));
command.Parameters.Add(new OleDbParameter("@days", Convert.ToInt32(nmc_diw.Text)));
command.Parameters.Add(new OleDbParameter("@IMG", imageBt));
Si el orden no coincide, obtendrá muchos errores, porque ahora está intentando insertar un campo de texto en su columna de fecha o columna de número entero.