2012-05-18 9 views
0

У меня есть следующие команды, используемые в приложении C# WinForms, который использует OleDb для подключения к базе данных Access 2010:Сравнение двух строк с помощью SQL

oc_payslips = new OleDbCommand("SELECT <fields> FROM Payslips WHERE LicenseID = \"" + IDs[cb_Employees.SelectedIndex] + "\" AND DateOfPayment >= \"" + startDate + "\" AND DateOfPayment <= \"" + endDate + "\"", DB_Connection.con); 

Это не работает. Мое лучшее предположение заключается в том, что я не могу сравнивать две строки, подобные SQL.

Идея состоит в том, чтобы получить записи, имеющие дату между двумя датами, все из которых имеют формат «dd/MM/yyyy». Дата хранится в виде строки в базе данных.

Я не смог найти ответ на этот вопрос в Интернете, так вот мой вопрос:

Есть ли способ сравнения двух строк с помощью SQL и определить, что является первым в алфавитном порядке?

P.S .: Я знаю, что я могу получить все даты сначала, сравнить их, а затем найти идентификаторы, которые имеют правильную дату, но мой вопрос связан с выполнением этого в одном запросе SQL.

+0

«одиночные кавычки» вместо «двойных кавычек» для строковых литералов sql? – Aprillion

+0

@MarkByers я не думаю '01/01/2012' против.'31/12/2011' будут отсортированы по-разному на разных языках;), но эти строки не могут быть отсортированы правильно, их нужно преобразовать в дату или форматировать как строку' yyyy/mm/dd' first – Aprillion

+0

@MarkByers, не суть, меня интересует, есть ли команда SQL для сравнения двух строк, например, вы бы сравнили два числа [используя <=/=>/etc]. –

ответ

0

http://www.tutorialspoint.com/sql/sql-string-functions.htm#function_strcmp

AFAIK, если она возвращает -1, чем первая строка будет перед вторым использованием английского алфавита

+0

Ведение oc_payslips = новый OleDbCommand ("SELECT FROM WHERE LicenseID платежные ведомости = \"»+ идентификаторы [cb_Employees.SelectedIndex] + "\" И STRCMP (DateOfPayment, \ "" + StartDate + "\") = 1 и STRCMP (DateOfPayment, \ "" + endDate + "\") = -1 ", DB_Connection.con); вызывает это исключение: Неопределенная функция «STRCMP» в выражении. Я использовал его неправильно или мог быть недоступен в OleDb? –

+0

он выглядит как учебник для (неуказанного) стандарта SQL, Access - это не совсем лучший пример реализации стандартов SQL. – Aprillion

2

У вас есть несколько проблем

  • Вы должны использоваться параметризованные команды вместо того, чтобы использовать конкатенация строк.

  • Вы используете двойные кавычки вместо одиночных кавычек в качестве разделителей строк в SQL.

  • Вы сравниваете даты как строки. Если поле таблицы, если для типа Date/Time, вам придется использовать литер даты (если вы продолжаете использовать конкатенацию строк). Если даты хранятся в виде строк, отформатированных как «dd/MM/yyyy», сравнение не будет работать.

  • То же самое с LicenseID. Если это числовой тип, сравните LicenseID = 123 не LicenseID = "123".

Три последние проблемы автоматически исчезают, если вы используете параметризованные запросы.

См. How to: Execute a Parameterized Query на MSDN.


oc_payslips = new OleDbCommand(
    @"SELECT <fields> FROM Payslips 
     WHERE LicenseID = @lid AND 
     DateOfPayment >= @start AND DateOfPayment <= @end", DB_Connection.con); 

oc_payslips.Parameters.AddWithValue("@lid", IDs[cb_Employees.SelectedIndex]); 
oc_payslips.Parameters.AddWithValue("@start", startDate); 
oc_payslips.Parameters.AddWithValue("@end", endDate); 
... 

Это плохая идея, чтобы хранить даты в виде строки в базе данных. Если вы хотите сравнить даты, хранящиеся в виде строк, это будет работать, только если строки отформатированы как «yyyy/MM/dd», как указал Влад Шнаковски в своем комментарии. Тем не менее, вы можете попробовать использовать

"... CDate(DateOfPayment) BETWEEN @start AND @end" 

и убедитесь, что вы передаете параметры типа DateTime.

+0

Я использую \ ", который работает так же, как и в Access, так что это не проблема. Мне лучше понять, что сортировка дат в этом формате не будет работать, я просто интересовался этим методом. LicenseID также является строкой. Тем не менее, использование параметризованных запросов выглядит намного лучше, поэтому я буду пытаться использовать их с этого момента. –

+0

Ваше решение кажется правильным. Я буду тестировать его и пометить его как ответ, если он будет работать. Большое спасибо! –

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