C# &引用;“条件表达式中的数据类型不匹配”;在子查询中使用OleDbCommand

C# &引用;“条件表达式中的数据类型不匹配”;在子查询中使用OleDbCommand,c#,ms-access,ado.net,C#,Ms Access,Ado.net,我得到了一个“条件表达式中的数据类型不匹配”的OLEDB命令,其中我有一个子查询。实际的数据库是Access,尽管我不确定它是否能够向数据库显示查询 DateTime EventDate; string HT,AT; int HS,AS; OleDbCommand cmd cmd.CommandText = @"INSERT INTO TheTable (EventDate,HT,HS,[AS],[AT]) SELECT top 1 @EventDate,@HT,@HS,@AS,@A

我得到了一个“条件表达式中的数据类型不匹配”的OLEDB命令,其中我有一个子查询。实际的数据库是Access,尽管我不确定它是否能够向数据库显示查询

DateTime EventDate;
string HT,AT;
int HS,AS;
OleDbCommand cmd

cmd.CommandText = @"INSERT INTO TheTable (EventDate,HT,HS,[AS],[AT]) 
    SELECT top 1 @EventDate,@HT,@HS,@AS,@AT FROM TheTable 
WHERE NOT EXISTS (SELECT 1 FROM TheTable WHERE HT=@HT2)";

cmd.CommandType = CommandType.Text;
cmd.Parameters.AddWithValue("@EventDate", EventDate);
cmd.Parameters.AddWithValue("@HT", HT);
cmd.Parameters.AddWithValue("@HS", HS);
cmd.Parameters.AddWithValue("@AS", AS);
cmd.Parameters.AddWithValue("@AT", AT);
cmd.Parameters.AddWithValue("@HT2", HT);
如果我删除子查询,它可以正常工作。我确信我所有的变量都是正确的类型,都是有效的值。如果我去掉子查询,它可以正常工作

子查询是否存在使参数不能与OleDbCommand一起工作的问题

更新:尝试设置日期类型,但没有任何区别

cmd.Parameters.Add("@EventDate", OleDbType.Date); 
cmd.Parameters["@EventDate"].Value = EventDate;

答案是首先计算子查询。任何使用过OleDbCommand的人很快就会发现,参数的名称并不重要,重要的是顺序,它必须与sql中参数的顺序相匹配。但是,在这种情况下,我想因为子查询是首先计算的,所以必须首先提供它的参数,即使它们在sql语句中是最后一个

cmd.CommandType = CommandType.Text;
cmd.Parameters.AddWithValue("@HT2", HT);
cmd.Parameters.AddWithValue("@EventDate", EventDate);
cmd.Parameters.AddWithValue("@HT", HT);
cmd.Parameters.AddWithValue("@HS", HS);
cmd.Parameters.AddWithValue("@AS", AS);
cmd.Parameters.AddWithValue("@AT", AT);

使用cmd.Parameters.Add(名称、类型).Value=Value而不是AddWithValue。特别是当您尝试将日期传递给ms access enginethanks时,尝试了这样做,但没有任何区别(请参阅更新)尝试使用
cmd.Parameters.AddWithValue(@EventDate)、DateTime(EventDate.Year、EventDate.Month、EventDate.Day、EventDate.Hour、EventDate.Minute、EventDate.Second)省略
EventDate的毫秒部分。据我所知,您的问题似乎来自如何处理
OleDbType
treats
DateTime
参数。