このコードで「基準式のデータ型の不一致」が発生するのはなぜですか?[重複]
-
24-12-2019 - |
質問
このコードでMS Accessテーブルにレコードを挿入しようとしています:
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();
}
}
}
...しかし、"cmd。ExecuteNonQuery();"行はで爆破します:
システム。データ。OleDb。OleDbExceptionはユーザーコードによって処理されませんでした Message=条件式のデータ型の不一致。Source=Microsoft Office Accessデータベースエンジン スタックトレース:システムで。データ。OleDb。OleDbCommand。ExecuteCommandTextErrorHandling(OleDbHResult hr) システムで。データ。OleDb。OleDbCommand。Executecommandtextforsinglerresult(tagDBPARAMS dbParams,Object&executeResult) システムで。データ。OleDb。OleDbCommand。ExecuteCommandText(オブジェクト&executeResult) システムで。データ。OleDb。OleDbCommand。ExecuteCommand(CommandBehavior behavior,Object&executeResult) システムで。データ。OleDb。OleDbCommand。ExecuteReaderInternal(CommandBehavior動作、文字列メソッド) システムで。データ。OleDb。OleDbCommand。ExecuteNonQuery()
私の推測では、問題は唯一のDateTime値ですが、何が間違っているのでしょうか:
cmd.Parameters.AddWithValue("@DTNow", collect_dttm);
?
私は"DateTimeを渡しています。今すぐ"collect_dttm argとして。
解決
提供されたリンクは、これに対する少なくとも2つの修正を示しています;最も簡単なのは、単にミックスからDateTimeパラメータを削除し、"DTNow"パラメータを"Now()"の呼び出しに置き換えて、Insertステートメント内からdateTime値を直接注入することで:
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)";