2013-05-05 4 views
0

У меня есть выбор, который использует datetime, из двух datetimepickers, в предложении WHERE. ВЫБРАТЬ работает нормально, заполняет DataGrid, не проблема, но bizzarely DateTime часть SELECT, полностью игнорируется, и все это возвращает набор записей, как будто только «WHERE x_account_id =» + subaccountID были использованы:Проблема SQL Server CE и Datetime Select (C#)

SqlCeConnection conn = new SqlCeConnection(Lib.ConnectionString); 
string sql = "SELECT x_scaleid, x_weight, x_timestamp FROM x WHERE x_account_id = " + subaccountID 
    + " AND (x_timestamp BETWEEN @start_date AND @end_date) ORDER BY x_timestamp DESC"; 
SqlCeCommand cmd = new SqlCeCommand(sql, conn); 
cmd.Parameters.Add("@start_date", SqlDbType.DateTime, 8).Value = dFromFilter.Value.Date; 
cmd.Parameters.Add("@end_date", SqlDbType.DateTime, 8).Value = dToFilter.Value.Date; 
SqlCeDataAdapter da = new SqlCeDataAdapter(); 
da.SelectCommand = cmd; 

Не удалось найти кого-либо с той же проблемой в Интернете, поэтому я как бы застрял. Может быть, мне лучше попытаться преобразовать все даты в int и сохранить их таким образом - всегда ненавидел работу с типами datetime.

Прежде, чем кто-либо спросит, я пробовал различные версии предложения, включая использование «<» и «>», а также различные варианты CONVERT.

+0

Вы проверили, используя любой инструмент, подобный профилировщику, чтобы получить запрос, полученный в БД. Может быть время от времени, dFromFiler или dToFilter могут иметь значение «DateTime» minvalue или max. – Saravanan

+0

Я использовал инструмент SQL Server Compact Tool для непосредственного запуска запроса, и как dFromFiler, так и dToFilter имеют самые широкие диапазоны дат max и min. Мое собственное чувство кишки состоит в том, что это проблема форматирования - формат БД для datetime и то, что C# посылает, как-то разные. – Gaddo

+0

В этом случае попробуйте форматировать дату-время как строку и использовать любой код SQL Server, например 101,103, для форматирования даты и времени для SQL. – Saravanan

ответ

0

Я «решил» проблему, и «разрешил», я имею в виду взломать.

Я создал новый столбец в БД, введите int в таблице x. Когда я заполняю x_timestamp текущим временем, полученным из приложения, я заполняю этот новый столбец номером, построенным из даты, в формате «yyyymmdd». Поэтому, когда вы делаете какую-либо фильтрацию, используя даты, я могу просто выполнить численное сравнение, используя две выбранные даты (снова преобразованные в аналогичные int-форматы в приложении). Работает.

Это не идеальное решение на любом участке, так как оно дублирует данные в БД, но крайние сроки являются крайними сроками, и если никто другой не может предложить лучшего здесь, этот может помочь кому-либо с аналогичной проблемой в будущем.

Смежные вопросы