C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
ADOQuery, order by
Лена
Отправлено: 30.11.2006, 18:01


Мастер участка

Группа: Участник
Сообщений: 501



На моем компьютере мое приложение работает нормально. При переносе на другой компьютер не выполняется последняя часть любого SQL запроса ORDER by “имя колонки”.
Связь ADOQuery -> TDatasetProvider -> TClientDataset -> TDatasource грид
Почему может не выполняться ORDER by компонента ADOQuery при переносе на другой компьютер?
Сделала принудительную кнопку:
CODE

void __fastcall TForm1::ButtonDoorsClick(TObject *Sender)
{
DataModule2->ClientDataSetDoors->Active = false;
DataModule2->ADOQueryDoors->Active = false;
DataModule2->ADOQueryDoors->SQL->Clear();
DataModule2->ADOQueryDoors->SQL->Add("select * from gates order by name");
DataModule2->ADOQueryDoors->Active = true;
DataModule2->ClientDataSetDoors->Active = true;
}

На моем компьютере все нормально, а на другом записи не сортируются согласно order by name. С чем это может быть связано?
Valdemar
Отправлено: 04.12.2006, 14:04


Мастер участка

Группа: Участник
Сообщений: 433



Возможно, что на других машинах не указана кодировка (charset) или порядок сортировки (collate).
Уточни, какая БД. Используешь ODBC или что другое?
Лена
Отправлено: 04.12.2006, 14:33


Мастер участка

Группа: Участник
Сообщений: 501



База данных PostgreSQL. Доступ через специализированный драйвер psqlodbc. Драйвер настроила также как и на моем компьютере, однако на моем order by работает, а на другом нет. Действительно сортировка осуществляется по колонкам с русскими названиями.
А как на другом компьютере указать кодировку (charset) или порядок сортировки (collate)?

Valdemar
Отправлено: 05.12.2006, 08:50


Мастер участка

Группа: Участник
Сообщений: 433



Для MySQL я делал это выполнением в самом начале запроса:
set names 'cp1251'
либо
SET CHARSET CP1251
В ODBC драйвере для MySQL есть закладка Connect Options, а на ней поле Initial Statement, в котором можно прописать команду, которая будет выполняться при подключении. Посмотри, может в настройках psqlodbc есть подобное.
Также порядок сортировки можно задать в тексте самого запроса:
select * from table_name order by field_name COLLATE cp1251_general_ci
На MySQL это запрос работает, на PostgreSQL не знаю.
Лена
Отправлено: 05.12.2006, 12:15


Мастер участка

Группа: Участник
Сообщений: 501



QUOTE (Valdemar @ 05.12.2006, 08:50)
В ODBC драйвере для MySQL есть закладка Connect Options, а на ней поле Initial Statement, в котором можно прописать команду

Нет не нашла. На рисунке все настройки драйвера доступа.

select * from table_name order by field_name COLLATE cp1251_general_ci
Что такое _general_ci?

Пишу такой запрос не работает:
select * from visitors order by lastname COLLATE cp1251_general_ci
Ошибка:
ERROR: syntax error at or near "COLLATE" at character 42
и так тоже не работает:
select * from visitors order by lastname COLLATE cp1251

Может в самом ADQuery можно как-то задать этот самый COLLATE?


Присоединить изображение

Присоединить изображение

Лена
Отправлено: 05.12.2006, 12:34


Мастер участка

Группа: Участник
Сообщений: 501



Похоже слова COLLATE вообще нет в SQL для PostgreSQL. В help-e не нашла. sad.gif
Valdemar
Отправлено: 05.12.2006, 13:05


Мастер участка

Группа: Участник
Сообщений: 433



На втором рисунке есть поле Connect Settings, может в нем прописать что-то вроде CodePage=cp1251.
Лена
Отправлено: 05.12.2006, 13:58


Мастер участка

Группа: Участник
Сообщений: 501



Попробывала, ничего не изменилось. sad.gif
Лена
Отправлено: 05.12.2006, 15:02


Мастер участка

Группа: Участник
Сообщений: 501



Вроде нашла для PostgreSQL. Оказывается это не только у меня проблема. Вот что надо сделать (прочитала на форуме):

>сделал БД в koi8, кодировку для коннекта указал utf8

Попробую понять что сие значить. smile.gif
Valdemar
Отправлено: 05.12.2006, 17:02


Мастер участка

Группа: Участник
Сообщений: 433



Попробуй в самом начале работы программы, сразу после подключения, выполнить запросы:
set character_set_client='cp1251'
set character_set_results='cp1251'
set collation_connection='cp1251_general_cs'

или

set names 'cp1251'

или

SET CHARSET CP1251
А уже после этого выполнять все остальные запросы.

Все это, если БД и текстовые поля имеют кодировку cp1251.
olegenty
Отправлено: 06.12.2006, 07:52


Ветеран

Группа: Модератор
Сообщений: 2412



в случае ADO это может не привести к ожидаемому результату, поскольку ADO может фоново оперировать пулом соединений, вместо предполагаемого одного.
ion
Отправлено: 18.12.2006, 06:33


Ученик-кочегар

Группа: Участник
Сообщений: 15



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

Вернуться в Работа с базами данных в C++Builder