¿Por qué obtengo "Falta de coincidencia de tipo de datos en la expresión de criterios" con este código?[duplicado]
-
24-12-2019 - |
Pregunta
Estoy tratando de insertar un registro en una tabla de MS Access con este código:
public void InsertIntoPPTData(string tx, string site_no, string xmlfile, DateTime collect_dttm, string ppt_user, string tx_memo, string file_beg, string file_end)
{
string connStr = @"Provider=Microsoft.ACE.OLEDB.12.0;User ID=Duckbilled;Password=Platypus;Data Source=C:\RGT\NotSoBigData.MDB;Jet OLEDB:System database=C:\CCRWin\Data\jftfdcsc.mdw";
using (var conn = new OleDbConnection(connStr))
{
using (var cmd = conn.CreateCommand())
{
cmd.CommandText =
@"INSERT INTO tx_tillermantea (tx, site_no, xmlfile, collect_dttm, ppt_user, tx_memo, file_beg, file_end)
VALUES(@txval, @siteNum, @xmlfileName, @DTNow, @PPTUser, @TXMemo, @strfile_beg, @strfile_end)";
cmd.CommandType = CommandType.Text;
cmd.Parameters.AddWithValue("@txval", tx);
cmd.Parameters.AddWithValue("@siteNum", site_no);
cmd.Parameters.AddWithValue("@xmlfileName", xmlfile);
cmd.Parameters.AddWithValue("@DTNow", collect_dttm);
cmd.Parameters.AddWithValue("@PPTUser", ppt_user);
cmd.Parameters.AddWithValue("@TXMemo", tx_memo);
cmd.Parameters.AddWithValue("@strfile_beg", file_beg);
cmd.Parameters.AddWithValue("@strfile_end", file_end);
conn.Open();
cmd.ExecuteNonQuery();
}
}
}
...pero el " cmd.ExecuteNonQuery (); " la línea explota con:
Sistema.Datos.OleDb.OleDbException no fue manejada por el código de usuario Mensaje = Falta de coincidencia del tipo de datos en la expresión de criterios.Fuente = Motor de base de datos de Microsoft Office Access Seguimiento de pila:en el Sistema.Datos.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling (OleDbHResult hr) en el Sistema.Datos.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult (tagDBPARAMS dbParams, Object y ExecuteResult) en el Sistema.Datos.OleDb.OleDbCommand.ExecuteCommandText (Objeto y ejecutor) en el Sistema.Datos.OleDb.OleDbCommand.ExecuteCommand (Comportamiento de CommandBehavior, Object y ExecuteResult) en el Sistema.Datos.OleDb.OleDbCommand.ExecuteReaderInternal (Comportamiento CommandBehavior, método String) en el Sistema.Datos.OleDb.OleDbCommand.ExecuteNonQuery()
Supongo que el problema es el valor de fecha y hora solitario, pero ¿qué tiene de malo:
cmd.Parameters.AddWithValue("@DTNow", collect_dttm);
?
Estoy pasando " Fecha y hora.Ahora " como el argumento collect_dttm.
Solución
El enlace proporcionado muestra al menos dos correcciones para esto;Encontré que el más sencillo era simplemente eliminar el parámetro DateTime de la mezcla e inyectar directamente el valor DateTime desde la instrucción Insert reemplazando el parámetro "DTNow" con una llamada a "Now ()" así:
cmd.CommandText =
@"INSERT INTO tx_tillermantea (tx, site_no, xmlfile, collect_dttm, ppt_user, tx_memo, file_beg, file_end)
VALUES(@txval, @siteNum, @xmlfileName, Now(), @PPTUser, @TXMemo, @strfile_beg, @strfile_end)";