我得到一个“数据类型不匹配的条件表达式”与一个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;发布于 2017-01-24 06:26:13
答案是首先计算子查询。任何使用过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);https://stackoverflow.com/questions/41795921
复制相似问题