“条件表达式中的数据类型不匹配”与子查询中的OleDbCommand

时间:2017-01-22 20:42:19

标签: c# ms-access ado.net

我在OleDbCommand中得到了“条件表达式中的数据类型不匹配”,其中我有一个子查询。实际的数据库是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;

1 个答案:

答案 0 :(得分:0)

答案是首先评估子查询。任何使用过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);