Форум » [x]Harbour » работа через sql драйвер » Ответить

работа через sql драйвер

dimao: Привет. Я надолго откололся от харборно-клипперных берегов, помогите сориентироваться на местности, пожалуйста. Есть ои в харборе сретства, чтобы переместить таблицы из DBF в sql сервер? то есть, чтобы вместо dbf файлов использовались таблицы sql . Без изменения синтаксиса программы, перекомпилировать с каким-то драйвером и пользоваться механизмами поддержания целостности, бакапа и прочими прелестями от sql сервера.

Ответов - 17

Haz: без изменения синтаксиса - нет. С минимальным изменением - ADS (платный или ломаный ) с любым бесплатным sql = все переписывать

dimao: жалко. Было бы интересно, пользоваться синтаксисом Клиппера и движком sql сервера.

Haz: dimao пишет: Было бы интересно это ADS. Немного обыграть команду USE и в целом готово. Бесплатно adslocal, но он сильно уступает северной в производительности и надёжности. Платная северная слишком дорога. На версию 10 ключи по всему интернету валяются. Последняя 12 вышла сразу после покупки ADS SAP вроде в 2014. С тех пор обновлёний нет.


SergKis: dimao пишет Было бы интересно, пользоваться синтаксисом Клиппера и движком sql сервера. Это каким образом ? Пример MiniGui\SAMPLES\BASIC\MYSQL\demo_2.prg (кусочек на классе Class TMySQLServer)[pre2] *--------------------------------------------------------------* Function Grid_fill() *--------------------------------------------------------------* Local cSearch:= ' "'+Upper(AllTrim(Grid_Names.cSearch.Value ))+'%" ' Local nCounter:= 0 Local oRow Local i Local oQuery Local GridMax:= iif(len(cSearch)== 0, 30, 1000000) DELETE ITEM ALL FROM Grid_1 Of Grid_Names oQuery := oServer:Query( "Select Code, Name From NAMES WHERE NAME LIKE "+cSearch+" Order By Name" ) If oQuery:NetErr() MsgInfo("SQL SELECT error: " + oQuery:Error()) RELEASE WINDOW ALL Quit Endif For i := 1 To oQuery:LastRec() nCounter++ If nCounter == GridMax Exit Endif oRow := oQuery:GetRow(i) ADD ITEM { Str(oRow:fieldGet(1), 8), oRow:fieldGet(2) } TO Grid_1 Of Grid_Names oQuery:Skip(1) Next oQuery:Destroy() Grid_Names.cSearch.SetFocus Return Nil [/pre2] Пример MiniGui\SAMPLES\Advanced\Tsb_sqlite\demo.prg (тоже кусочек) [pre2] *--------------------------------------------------------* FUNCTION BrowseTable(cTable, mod) *--------------------------------------------------------* Local cSelect, bSetup , oBrw Local nWinWidth := getdesktopwidth() * 0.8 Local nWinHeight := getdesktopheight() * 0.8 Local cTitle := "Table: " + cTable if mod == 1 cSelect := "SELECT * FROM " + cTable DBUSEAREA( .T.,, cSelect, "TABLE" ,,, "UTF8") Select TABLE ... *--------------------------------------------------------* Function SqlUpdate(uVal, nCol, cTable, lApp) *--------------------------------------------------------* Local cQuery, i, cFldName, nStart, cQuery2 Local aDbStru := dbstruct() if lApp cQuery:= "INSERT INTO "+cTable+" ( " cQuery2:= " ) values ( " for i := 1 to len(aDbStru) cFldName := aDbStru[i, 1] if i > 1 cQuery += " , " cQuery2 += " , " endif cQuery += cFldName cQuery2 += c2sql(&cFldName) next cQuery += cQuery2 + " )" else nStart := if(nCol==1,2,1) cFldName := aDbStru[nCol, 1] cQuery := "UPDATE "+cTable+" SET " + cFldName + " = " + c2sql(&cFldName) + " WHERE " for i := 1 to len(aDbStru) if i != nCol cFldName := aDbStru[i, 1] if i > nStart cQuery += " AND " endif cQuery += cFldName + " = "+ c2sql(&cFldName) endif next cQuery += " " endif If ! RDDINFO(RDDI_EXECUTE, cQuery ) MsgStop("Can't update record in table "+cTable+" !", "Error") Return .F. EndIf Return .T. *--------------------------------------------------------* Function SqlDelete(cTable ) *--------------------------------------------------------* Local cQuery, i, cFldName Local aDbStru := dbstruct() cQuery := "DELETE FROM "+cTable+ " WHERE " for i := 1 to len(aDbStru) cFldName := aDbStru[i, 1] if i > 1 cQuery += " AND " endif cQuery += cFldName + " = "+ c2sql(&cFldName) next cQuery += " " If ! RDDINFO(RDDI_EXECUTE, cQuery ) MsgStop("Can't Delete record in table "+cTable+" !", "Error") Return .F. EndIf Return .T. *--------------------------------------------------------* FUNCTION CreatefromDBF(cSbase, cDBase ) *--------------------------------------------------------* LOCAL cHeader, cQuery := "", NrReg:= 0, cTable := cFileNoExt(cDBase) LOCAL lCreateIfNotExist := .t., cOldRdd, db, lRet := .f. IF !FILE( hb_dirBase()+cDBase+".dbf" ) RETURN .f. endif cTable := cDBase db := sqlite3_open( cSbase, lCreateIfNotExist ) IF !DB_IS_OPEN( db ) MsgStop( "Can't open/create " + cSbase, "Error" ) Return .f. endif sqlite3_exec( db, "PRAGMA auto_vacuum=0" ) * Create table IF ( RDDSETDEFAULT() != "DBFNTX" ) cOldRdd := RDDSETDEFAULT( "DBFNTX" ) ENDIF DBUSEAREA(.T.,'DBFNTX',cTable) cHeader := QueryCrea(cTable,0) IF sqlite3_exec( db, cHeader ) == SQLITE_OK go top Do While !Eof() cQuery += QueryCrea(cTable,1) NrReg++ skip EndDo use IF sqlite3_exec( db, ; "BEGIN TRANSACTION;" + ; cQuery + ; "COMMIT;" ) == SQLITE_OK MsgInfo( AllTrim(Str(NrReg))+" records added to table "+cTable, "Result" ) lRet := .t. ENDIF ENDIF RDDSETDEFAULT( cOldRdd ) RETURN .t. [/pre2] и т.д. по серверам Haz без изменения синтаксиса - нет. С минимальным изменением - ADS (платный или ломаный ) с любым бесплатным sql = все переписывать

SergKis: PS Сервер LetoDb => LetoDbf => сервера работы с dbf файлами, например тут http://clipper.borda.ru/?1-7-0-00000042-000-0-0-1544163593 Кусочек leto_std.ch [pre2] ... #xtranslate DBEVAL( [<x,...>] ) => LETO_DBEVAL( <x> ) #command REPLACE [<f1> WITH <x1> [, <fN> WITH <xN>]] ; [FOR <for>] [WHILE <while>] [NEXT <next>] ; [RECORD <rec>] [<rest:REST>] [ALL] [<descend:DESC,DESCENDING>] => ; leto_dbEval( "{|| FIELDPUT('"+<"f1">+"',"+<"x1">+")"[+", FIELDPUT('"+<"fN">+"',"+<"xN">+")"]+" }", ; { <{for}>, <"for"> }, { <{while}>, <"while"> }, <next>, <rec>, <.rest.>,, .T., <.descend.>, .F. ) #command REPLACE <f1> WITH <v1>[, <fN> WITH <vN>] => ; _FIELD-><f1> := <v1> [; _FIELD-><fN> := <vN>] #command DELETE [FOR <for>] [WHILE <while>] [NEXT <next>] ; [RECORD <rec>] [<rest:REST>] [ALL] [<descend:DESC,DESCENDING>] [INTO <v>] => ; [ <v> := ]; leto_dbEval( "{|n| dbDelete(), n }", { <{for}>, <"for"> }, { <{while}>, <"while"> }, <next>, <rec>, <.rest.>,, .T., <.descend.>, .F. ) #command DELETE => dbDelete() #command RECALL [FOR <for>] [WHILE <while>] [NEXT <next>] ; [RECORD <rec>] [<rest:REST>] [ALL] [<descend:DESC,DESCENDING>] [INTO <v>] => ; [ <v> := ]; leto_dbEval( "{|n| dbRecall(), n }", { <{for}>, <"for"> }, { <{while}>, <"while"> }, <next>, <rec>, <.rest.>,, .T., <.descend.>, .T. ) #command RECALL => dbRecall() #command COUNT [[INTO][TO] <v>] ; [FOR <for>] [WHILE <while>] [NEXT <next>] ; [RECORD <rec>] [<rest:REST>] [ALL] [<descend:DESC,DESCENDING>] => ; [ <v> := ]; leto_dbEval( "{|n| n }", { <{for}>, <"for"> }, { <{while}>, <"while"> }, <next>, <rec>, <.rest.>,, .F., <.descend.> ) ... [/pre2] Тут синтаксис clpper, но не sql движок

Andrey: dimao пишет: Есть ои в харборе сретства, чтобы переместить таблицы из DBF в sql сервер? то есть, чтобы вместо dbf файлов использовались таблицы sql . Без изменения синтаксиса программы ЛетоДБ можно ставить и не заморачиваться ни с какими таблицами sql, если нужно остаться на синтаксисе Клипера. Скорость и простота просто поражает - https://abonent4.ru/letodb/ Всё остальное в любом случае нужно переписывать.

AlexeyD: Andrey, добрый день. Посоветуйте, пожалуйста, с чего начать, чтобы получить такой же интерфейс, как у программ на сайте abonent4.ru. Опыт - Clipper.

Andrey: AlexeyD пишет: Посоветуйте, пожалуйста, с чего начать Это МиниГуи ! Таблицы - tsbrowse. Смотреть в соседней ветке этого форума. Куча примеров для пробы и понятия как это работает. Помочь в освоении помогут здесь же на форуме.

Haz: AlexeyD пишет: Посоветуйте, пожалуйста, с чего начать, Дополню Андрея. По ссылкам с форума установить Minigui. Это Gui одежка на Harbour. Установить компилятор borland, можно тот-же bcc55. Разобраться с настрой путей и просто просмотреть все примеры из поставки МиниГуи. Далее выбрать свой самый простой проект на clipper и понемногу реализовать в Gui.

Andrey: Посмотри ещё https://abonent4.ru/minigui/ Там есть инструкции. Таблицы смотри пример - Tsb_composite(1.8) работа с объектом Tsbrowse IDE не пользуюсь, уже привык без него, т.е. формы создаю кодом.

rvu: Haz пишет: можно тот-же bcc55 А он с новыми версиями минигуи работает? Они же теперь под bcc58.

SergKis: rvu пишет А он с новыми версиями минигуи работает? Они же теперь под bcc58. Сделал в последних версиях hmg C:\MiniGuiBcc58\BATCH\MiniGui.cfg такой[pre2] # Basic configuration for Compile.bat MG_CMP=harbour MG_BCC=c:\borland\bcc55 MG_ROOT=c:\miniguiBcc58 [/pre2] Примеры c TsBrowse собираются и работают. Попробуйте

rvu: А в чем был смысл перехода на Bcc58? Кстати, я пытаюсь перейти на Embarcadero C++ 10.1 Berlin compiler, вот в этом вижу смысл, но не все программы пока что смог там откомпилировать.

gfilatov2002: rvu пишет: в чем был смысл перехода на Bcc58? Причина перехода простая: BCC 5.5 была выпущена в 2000 году, еще до выхода Windows XP BCC 5.8 была выпущена в 2006 году, еще до выхода Windows Vista Embarcadero C++ 10.1 была выпущена в 2016 году

rvu: gfilatov2002 пишет: Embarcadero C++ 10.1 была выпущена в 2016 году Кстати, они сейчас раздают The Embarcadero 10.2 Tokyo C++ compiler.

AlexeyD: Спасибо.

gfilatov2002: rvu пишет: они сейчас раздают The Embarcadero 10.2 Благодарю за сообщение! Уже обновился - полет нормальный



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