Форум » [x]Harbour » [?] ADS + SQL + база в OEM » Ответить

[?] ADS + SQL + база в OEM

Dima: Подключаюсь к словарю через adsConnect60 Открываю базу через USE [pre2] use klient new ? ADSGETTABLECHARTYPE() // вернуло ADS_OEM , так и надо wait browse() // тут все красиво close klient [/pre2] Далее создаю и выполняю SQL запрос [pre2] Запрос таков cSQL:="select * from klient" ? ADSGETTABLECHARTYPE() // вернуло ADS_OEM , так и надо wait browse() // тут все красиво [/pre2] Усложняю запрос [pre2] cSQL:="select TOP 10 * from klient" ? ADSGETTABLECHARTYPE() // вернуло ADS_ANSI , а должно быть ADS_OEM wait browse() // тут крякозяблы [/pre2] Как решить задачу красиво и без костылей ?

Ответов - 12

Vlad04: Усложняю запрос cSQL:="select TOP 10 * from klient" Видно что-то осталось за кадром. От того, что ограничили выборку, кодовая страница не должна измениться. Предложение TOP используется совместно с предложением ORDER BY, иначе выборка происходит фактически случайных записей.

Dima: Vlad04 пишет: Предложение TOP используется совместно с предложением ORDER BY, иначе выборка происходит фактически случайных записей. Добавил ORDER BY , но проблема осталась. Изменил так cSQL:="select * from klient where kod_kl=5" Проблема осталась. PS В общем когда выборка , то получаем крякозяблы.

Haz: Vlad04 пишет: Видно что-то осталось за кадром. От того, что ограничили выборку, кодовая страница не должна измениться. за кардом осталось только что база CDX и версия ADS. В остальном - подтверждаю то что Дима говорит, чуть изменили запрос и CharSet слетает. Сам видел (подключался по AIS ) , как исправить пока не знаю. Есть кривой костыль в виде условного блока выборки-записи бровса через AnsiToOem ... но это же бред. Advantage Architect - все запросы показывает верно, а из консольного теста вот такая бяка. Дима скинь короткий самодостаточный, базу можно нагенерить с строками случайными, а я завтра на adslocal проверю. PS У меня самого везде таблицы ADT и ANSI , на такой глюк в этой комбинации не натыкался


Dima: Haz пишет: Дима скинь короткий самодостаточный, базу можно нагенерить с строками случайными, а я завтра на adslocal проверю. Хорошо , завтра придумаю и выложу. Спасибо Игорь !

Dima: Примерчик (prg в 866 кодировке) [pre2] #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 [/pre2]

Dima: вот такое выражение тоже глючит [pre2] cSQL:="select * from test WHERE naim LIKE '%р%'" [/pre2] а такое нет [pre2] cSQL:="select * from test where cod in (2,7,10)" [/pre2]

Vlad04: У меня все нормально. Правда я использую хХарбоур 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. )

Vlad04: У меня все нормально. Правда я использую хХарбоур 1 и ADS 9. В заголовке файла я изменил определения: // HB_LANGSELECT("RU866") // hb_cdpSelect( "RU866" ) // rddSetDefault( "ADSCDX" ) // AdsSetCharType(2,.t.) Чем заменил, не могу ввести Сайт форума ругается

Vlad04: У меня все нормально. Правда я использую хХарбоур 1 и ADS 9. В заголовке файла я изменил определения: Чем заменил, не могу ввести Сайт форума ругается

Vlad04: Вот это я на вводил. Каждая попытка, завершалась ошибкой !!

Haz: 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 а разгадка оказалась в твоей ошибке Дима позже отпишет

Dima: 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



полная версия страницы