2017-01-22 1 views
0

Я получаю «несоответствие типов данных в выражении критериев» с OleDbCommand, где у меня есть подзапрос. Фактической базой данных является Access, хотя я не уверен, что она доставляет запрос в базу данных.«Несоответствие типа данных в выражении критериев» с помощью OleDbCommand в подзапросе

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 [email protected])"; 

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?

UPDATE: пытался настройки типа даты и это не имело никакого значения

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

Использовать _cmd.Parameters.Add (имя, тип) .Value = значение_ вместо _AddWithValue_. в частности, когда вы пытаетесь передать дату в механизм доступа ms-доступа – Steve

+0

спасибо, попробовал это, но это не имело никакого значения (см. обновление) –

+1

Попробуйте пропустить миллисекундную часть 'EventDate', используя' cmd.Parameters.AddWithValue («@ EventDate», DateTime (EventDate.Year, EventDate.Month, EventDate.Day, EventDate.Hour, EventDate.Minute, EventDate.Second)); '. Насколько мне известно, ваша проблема возникает из-за того, как 'OleDbType' обрабатывает параметр DateTime. –

ответ

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); 
Смежные вопросы