Автор | Сообщение |
|
| |
Пост N: 5409
Зарегистрирован: 17.05.05
|
|
Отправлено: 16.12.15 16:56. Заголовок: [?] ADS + SQL + база в OEM
Подключаюсь к словарю через adsConnect60 Открываю базу через USE use klient new ? ADSGETTABLECHARTYPE() // вернуло ADS_OEM , так и надо wait browse() // тут все красиво close klient Далее создаю и выполняю SQL запрос Запрос таков cSQL:="select * from klient" ? ADSGETTABLECHARTYPE() // вернуло ADS_OEM , так и надо wait browse() // тут все красиво Усложняю запрос cSQL:="select TOP 10 * from klient" ? ADSGETTABLECHARTYPE() // вернуло ADS_ANSI , а должно быть ADS_OEM wait browse() // тут крякозяблы Как решить задачу красиво и без костылей ?
|
|
|
Ответов - 12
[только новые]
|
|
|
| постоянный участник
|
Пост N: 501
Зарегистрирован: 13.10.05
|
|
Отправлено: 16.12.15 19:51. Заголовок: Усложняю запрос c..
цитата: | Усложняю запрос cSQL:="select TOP 10 * from klient" |
| Видно что-то осталось за кадром. От того, что ограничили выборку, кодовая страница не должна измениться. Предложение TOP используется совместно с предложением ORDER BY, иначе выборка происходит фактически случайных записей.
|
|
|
|
| |
Пост N: 5410
Зарегистрирован: 17.05.05
|
|
Отправлено: 16.12.15 20:43. Заголовок: Vlad04 пишет: Предл..
Vlad04 пишет: цитата: | Предложение TOP используется совместно с предложением ORDER BY, иначе выборка происходит фактически случайных записей. |
| Добавил ORDER BY , но проблема осталась. Изменил так cSQL:="select * from klient where kod_kl=5" Проблема осталась. PS В общем когда выборка , то получаем крякозяблы.
|
|
|
|
| |
Пост N: 726
Зарегистрирован: 20.02.11
|
|
Отправлено: 16.12.15 22:37. Заголовок: Vlad04 пишет: Видно..
Vlad04 пишет: цитата: | Видно что-то осталось за кадром. От того, что ограничили выборку, кодовая страница не должна измениться. |
| за кардом осталось только что база CDX и версия ADS. В остальном - подтверждаю то что Дима говорит, чуть изменили запрос и CharSet слетает. Сам видел (подключался по AIS ) , как исправить пока не знаю. Есть кривой костыль в виде условного блока выборки-записи бровса через AnsiToOem ... но это же бред. Advantage Architect - все запросы показывает верно, а из консольного теста вот такая бяка. Дима скинь короткий самодостаточный, базу можно нагенерить с строками случайными, а я завтра на adslocal проверю. PS У меня самого везде таблицы ADT и ANSI , на такой глюк в этой комбинации не натыкался
|
|
|
|
| |
Пост N: 5411
Зарегистрирован: 17.05.05
|
|
Отправлено: 16.12.15 23:44. Заголовок: Haz пишет: Дима ски..
Haz пишет: цитата: | Дима скинь короткий самодостаточный, базу можно нагенерить с строками случайными, а я завтра на adslocal проверю. |
| Хорошо , завтра придумаю и выложу. Спасибо Игорь !
|
|
|
|
| |
Пост N: 5412
Зарегистрирован: 17.05.05
|
|
Отправлено: 17.12.15 10:25. Заголовок: Примерчик (prg в 866..
Примерчик (prg в 866 кодировке) Скрытый текст #include "ads.ch" REQUEST DBFCDX REQUEST ADS REQUEST HB_LANG_RU866 REQUEST HB_CODEPAGE_RU866 FUNC Main() local cSQL:="" local hConnection local cpath:=hb_CurDrive()+":\"+CurDir()+"\" local i HB_LANGSELECT("RU866") hb_cdpSelect( "RU866" ) rddSetDefault( "ADSCDX" ) AdsSetCharType(2,.t.) set date to german AdsSetDeleted(.T.) AdsRightsCheck(.F.) if !hb_FileExists( cpath+"test.dbf" ) dbcreate(cpath+"test.dbf",{; {"naim","c",15,0},; {"cod","n",2,0}},"DBFCDX",.t.,"TMP") for i=1 to 10 TMP->(dbappend()) TMP->naim:="Проверка-"+ntoc(i) TMP->cod:=i next close TMP endif if !hb_FileExists( cpath+"dd_test.add" ) AdsDDCreate(cpath+"dd_test.add") adsConnect60( cpath+"dd_test.add", 7, "ADSSYS",'', 0, @hConnection ) ADSDDADDTABLE(,cpath+"test.dbf") hConnection:=nil endif cls ? adsConnect60(cpath+"dd_test.add", 7 , "ADSSYS",'', 0 , @hConnection ) use test new dbeval({||qout(naim)}) close test Select 0 IF AdsCreateSqlStatement("test" ,ADS_CDX ) cSQL:="select * from test" //ok AdsExecuteSqlDirect(cSQL) ? ? "ADSGETTABLECHARTYPE() ",ADSGETTABLECHARTYPE() dbeval({||qout(naim)}) close test ELSE ? "error" ENDIF *********************** Select 0 IF AdsCreateSqlStatement("test" ,ADS_CDX ) cSQL:="select TOP 5 * from test" // глючит //cSQL:="select * from test where cod=1" // ok //cSQL:="select * from test where cod>4" // ok //cSQL:="select TOP 1 * from test order by cod" //глючит // на каких еще выборках будет глючить не понятно )) AdsExecuteSqlDirect(cSQL) ? ? "ADSGETTABLECHARTYPE() ",ADSGETTABLECHARTYPE() dbeval({||qout(naim)}) ELSE ? "error" ENDIF wait AdsDisconnect( hConnection ) quit RETURN NIL
|
|
|
|
|
| |
Пост N: 5413
Зарегистрирован: 17.05.05
|
|
Отправлено: 17.12.15 11:39. Заголовок: вот такое выражение ..
вот такое выражение тоже глючит cSQL:="select * from test WHERE naim LIKE '%р%'" а такое нет cSQL:="select * from test where cod in (2,7,10)"
|
|
|
|
| постоянный участник
|
Пост N: 504
Зарегистрирован: 13.10.05
|
|
Отправлено: 17.12.15 20:18. Заголовок: У меня все нормально..
У меня все нормально. Правда я использую хХарбоур 1 и ADS 9. В заголовке файла я изменил определения: цитата: | // // HB_LANGSELECT("RU866") // hb_cdpSelect( "RU866" ) // // rddSetDefault( "ADSCDX" ) // AdsSetCharType(2,.t.) REQUEST ADS ; rddRegister("ADS", 1 ) rddsetdefault("ADS" ); SET SERVER LOCAL AdsSetFileType(ADS_CDX) //ОЕМ AdsSetCharType( 1, .T. ) |
|
|
|
|
|
| постоянный участник
|
Пост N: 509
Зарегистрирован: 13.10.05
|
|
Отправлено: 17.12.15 20:34. Заголовок: У меня все нормально..
У меня все нормально. Правда я использую хХарбоур 1 и ADS 9. В заголовке файла я изменил определения: цитата: | // HB_LANGSELECT("RU866") // hb_cdpSelect( "RU866" ) // rddSetDefault( "ADSCDX" ) // AdsSetCharType(2,.t.) |
| Чем заменил, не могу ввести Сайт форума ругается
|
|
|
|
| постоянный участник
|
Пост N: 510
Зарегистрирован: 13.10.05
|
|
Отправлено: 17.12.15 20:34. Заголовок: У меня все нормально..
У меня все нормально. Правда я использую хХарбоур 1 и ADS 9. В заголовке файла я изменил определения: Чем заменил, не могу ввести Сайт форума ругается
|
|
|
|
| постоянный участник
|
Пост N: 511
Зарегистрирован: 13.10.05
|
|
Отправлено: 17.12.15 20:36. Заголовок: Вот это я на вводил...
Вот это я на вводил. Каждая попытка, завершалась ошибкой !!
|
|
|
|
| |
Пост N: 729
Зарегистрирован: 20.02.11
|
|
Отправлено: 17.12.15 20:54. Заголовок: Vlad04 пишет: //ОЕМ..
Vlad04 пишет: цитата: | //ОЕМ AdsSetCharType( 1, .T. ) |
| OEM = 2 из ADS.CH #command SET CHARTYPE TO <x:ANSI,OEM> ; => AdsSetCharType( if( upper( <(x)> ) == "OEM", 2, 1 ) ) из справки по ADS ADS_ANSI=1 ADS_OEM=2 а разгадка оказалась в твоей ошибке Дима позже отпишет
|
|
|
|
|
| |
Пост N: 5414
Зарегистрирован: 17.05.05
|
|
Отправлено: 17.12.15 22:30. Заголовок: Vlad04 пишет: Вот э..
Vlad04 пишет: цитата: | Вот это я на вводил. Каждая попытка, завершалась ошибкой !! |
| Почищу , бывает..... косяки форума. Haz пишет: цитата: | а разгадка оказалась в твоей ошибке |
| Так и есть. Если кратко. База в OEM И если перед созданием словаря задать установку AdsSetCharType(ADS_OEM,.T.) то на ряде (не всех) выборок SQL будут каляки-маляки (глюки с кодировкой). Причину выяснить не удалось и скорее всего это глюк ADS. Ежели перед созданием словаря задать AdsSetCharType(ADS_ANSI) или ни чего не задавать а по умолчанию ADS_ANSI то все будет пучком. Это конечно как бы парадокс добавлять в словарь базу (ADSDDADDTABLE) которая в OEM c флагом ADS_ANSI , но работает , во всяком случае на проведенных тестах кодировка не слетает. Ну и далее как обычно ставим AdsSetCharType(ADS_OEM,.T.) если базы реально в OEM. Фокус-покус конечно , но работает. По большому счету надо бы базы конвертнуть в ANSI , так как на OEM кодировку разработчик мне кажется забил. PS А форум сегодня реально глючит........некая антиспам защита срабатывает )) Warning: preg_match() [function.preg-match]: Compilation failed: invalid UTF-8 string at offset 1 in /www/borda.ru/www/antispam.php on line 22
|
|
|
|