Perché ricevo " Mancata corrispondenza del tipo di dati nell'espressione dei criteri” con questo codice?[duplicato]
-
24-12-2019 - |
Domanda
Sto cercando di inserire un record in una tabella di MS Access con questo codice:
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();
}
}
}
...ma il " cmd.ExecuteNonQuery ();" la linea esplode con:
Sistema.Dati.OleDb.OleDbException è stato non gestito dal codice utente Message = Mancata corrispondenza del tipo di dati nell'espressione dei criteri.Origine = Motore di database di Microsoft Office Access StackTrace:al Sistema.Dati.OleDb.Comando OLEDB.ExecuteCommandTextErrorHandling (OleDbHResult hr) al Sistema.Dati.OleDb.Comando OLEDB.ExecuteCommandTextForSingleResult (tagDBPARAMS dbParams, Oggetto & executeResult) al Sistema.Dati.OleDb.Comando OLEDB.ExecuteCommandText (Oggetto & executeResult) al Sistema.Dati.OleDb.Comando OLEDB.ExecuteCommand (comportamento CommandBehavior, Oggetto & executeResult) al Sistema.Dati.OleDb.Comando OLEDB.ExecuteReaderInternal (comportamento CommandBehavior, metodo String) al Sistema.Dati.OleDb.Comando OLEDB.ExecuteNonQuery()
La mia ipotesi è che il problema sia il valore DateTime solitario, ma cosa c'è di sbagliato in:
cmd.Parameters.AddWithValue("@DTNow", collect_dttm);
?
Sto passando " DateTime.Ora " come il collect_dttm arg.
Soluzione
Il link fornito mostra almeno due correzioni per questo;Ho trovato il più semplice per rimuovere semplicemente il parametro DateTime dal mix e iniettare direttamente il valore DateTime dall'interno dell'istruzione Insert sostituendo il parametro "DTNow" con una chiamata a " Now ()" in questo modo:
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)";