2015-12-21 9 views
0

Я делаю программу на C#, и я пытаюсь выполнить запрос в файлах DBF, которые, я думаю, в порядке, но значение свойства HasRows DataReader ложно. Я думаю, проблема связана с датами. Это мой код:выполнить запрос в dbf из C#

string Con = @"Provider=VFPOLEDB.1;Data Source=\\Server\ges_01"; 
OleDbConnection ConnectionHandler = new OleDbConnection(Con); 
ConnectionHandler.Open(); 

string SQL = "SELECT codalb FROM BALBARA WHERE FECALB BETWEEN CTOD('2015/12/07') AND CTOD('2015/12/13') AND CODCLI LIKE '%9' ORDER BY CODALB" 
OleDbCommand Query = new OleDbCommand(SQL, ConnectionHandler); 
OleDbDataReader datareader = Query.ExecuteReader(); 
while(datareader.Read()) 
{} 

Я знаю, что все остальное в порядке, потому что, если поместить string SQL="select codalb from balbara"; работает отлично.

Любой может сказать мне, что i'm делает неправильно

+0

Это SQL строка обыкновения компиляции из-за неэкранированную цитату ... –

+0

Вы должны, вероятно, использовать даты в формате '...ГДЕ FECALB МЕЖДУ {^ 2015/12/07} И ... ' –

+0

@Alex K. K Положите, как вы предлагаете, но не сработаете – Ion

ответ

6

Проблема здесь в том, что функция CTOD() не поддерживается OLE DB Provider.

Изменить запрос использовать DTOS(), которые:

Возвращает дату символов строки в формате ГГГГММДД из указанного Даты или выражения DateTime.

Так заключая запрос может стать для:

string SQL = String.Format(
    @"SELECT 
     codalb 
    FROM 
     balbara 
    WHERE 
     DTOS(fecalb) BETWEEN '{0}' AND '{1}' 
     AND codcli LIKE '%9' 
    ORDER BY 
     codalb", 
     dateTimeVariable1.ToString("yyyyMMdd"), 
     dateTimeVariable2.ToString("yyyyMMdd")); 

Примечания 1: ЗАКАНЧИВАТЬ отступы, чтобы помочь вам писать читаемый код, и я предлагаю, чтобы написать все колонки/имена таблицы в нижнем регистре, так вы можете легко изменить, каковы ваши «данные» и что такое SQL.

Примечание 2: вы можете найти OFFICAL примеры форматных строк о DateTime типа here.


EDIT: Как хороших советов в комментариях от @AlanB, вы должны всегда стремиться использовать parametrized queries вместо строки для предотвращения SQL Injection атак.

Замечание о параметрах OLEDB:

В .NET Поставщик OLE DB не поддерживает именованные параметры для передачи параметров оператора SQL или хранимой процедуры, называемой помощью OleDbCommand когда CommandType установлен в Текст. В этом случае необходимо использовать знаковый знак вопроса (?) .

И о порядке параметров:

Таким образом, порядок, в котором объекты OleDbParameter добавляют к OleDbParameterCollection должны непосредственно соответствовать положению знак вопроса заполнитель для параметра в тексте команды.

Таким образом, все эти сведения, приведенные запрос может выглядеть этот пример:

OleDbCommand Query = new OleDbCommand(); 
Query.Connection = ConnectionHandler; 
Query.CommandText = 
    @"SELECT 
     codalb 
    FROM 
     balbara 
    WHERE 
     DTOS(fecalb) BETWEEN ? AND ? 
     AND codcli LIKE '%9' 
    ORDER BY 
     codalb"; 

Query.Parameters.Add(dateTimeVariable1.ToString("yyyyMMdd")); 
Query.Parameters.Add(dateTimeVariable2.ToString("yyyyMMdd")); 
OleDbDataReader datareader = Query.ExecuteReader(); 
+0

PERFECT - это то, что мне нужно – Ion

+0

И используйте параметры. –

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

  • Нет связанных вопросов^_^