On-line: Dr. Oldwarez, гостей 1. Всего: 2 [подробнее..]
АвторСообщение
moderator




Пост N: 2201
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 13.10.23 16:46. Заголовок: Библиотека SQLRDD для Харбора


Всем кому это интересно
Стали доступны исходники известной библиотеки SQLRDD для xXарбора, которая раньше была платной.
Сейчас адаптирую для работы с Минигуи эту библиотеку, которая позволяет портировать синтаксис Харбора без всяких изменений для работы с серверами MySQL, Postgres, Firebird, Oracle, MS SQL.

Подготовил для сравнения две программы - одна использует SQLRDD для доступа к таблице на сервере MySQL, а другая использует для доступа к DBF драйвер DBFCDX.

Код первой программы ниже
 
#include "minigui.ch"
#include "sqlrdd.ch"

REQUEST SQLRDD
REQUEST SR_MYSQL


// NOTE: the database must exist before runnning the test.
#define SERVER "localhost"
#define UID "root"
#define PWD "mypass"
#define DTB "test"

*--------------------------------------------------------*
FUNCTION Main()
*--------------------------------------------------------*

LOCAL nConnection

rddSetDefault( "SQLRDD" )

nConnection := sr_AddConnection( CONNECT_MYSQL, "MySQL=" + SERVER + ";UID=" + UID + ";PWD=" + PWD + ";DTB=" + DTB )

IF nConnection < 0
Alert( "Connection error. See sqlerror.log for details." )
RETURN NIL
ELSE
//Alert( "Connected to : " + SR_GetConnectionInfo(, SQL_DBMS_NAME ) + " " + SR_GetConnectionInfo(, SQL_DBMS_VER ) )
ENDIF

DEFINE WINDOW Form_1 ;
WIDTH 640 HEIGHT 480 ;
TITLE 'SQLRDD Demo' ;
MAIN NOMAXIMIZE ;
ON INIT OpenTable() ;
ON RELEASE CloseTable()

DEFINE MAIN MENU

DEFINE POPUP 'Test'
MENUITEM 'Add record' ACTION AddRecord( 'ARG', 'Argentina', 38740000 )
SEPARATOR
ITEM "Exit" ACTION ThisWindow.Release()
END POPUP

END MENU

@ 10, 10 BROWSE Browse_1 ;
WIDTH 610 ;
HEIGHT 390 ;
HEADERS { 'Code', 'Name', 'Residents' } ;
WIDTHS { 50, 160, 100 } ;
WORKAREA country ;
FIELDS { 'Code', 'Name', 'Residents' } ;
JUSTIFY { BROWSE_JTFY_LEFT, BROWSE_JTFY_LEFT, BROWSE_JTFY_RIGHT } ;
EDIT ;
INPLACE ;
READONLY { .T., .F., .F. }

END WINDOW

CENTER WINDOW Form_1

ACTIVATE WINDOW Form_1

RETURN NIL

*--------------------------------------------------------*
PROCEDURE OpenTable
*--------------------------------------------------------*

Form_1.Browse_1.VISIBLE := .F.

CreateTable()

INDEX ON FIELD->RESIDENTS TAG residents TO country

GO TOP

Form_1.Browse_1.VISIBLE := .T.

RETURN

*--------------------------------------------------------*
PROCEDURE CloseTable
*--------------------------------------------------------*

dbCloseArea( "country" )

RETURN

*--------------------------------------------------------*
FUNCTION CreateTable
*--------------------------------------------------------*

LOCAL aStruct := { ;
{ "CODE", "C", 3, 0 }, ;
{ "NAME", "C", 50, 0 }, ;
{ "RESIDENTS", "N", 11, 0 } ;
}

IF sr_file( "country" )
sr_DropTable( "country" )
sr_DropIndex( "country" )
ENDIF

dbCreate( "country", aStruct, "SQLRDD" )

USE country /*EXCLUSIVE*/ VIA "SQLRDD"

dbAppend()
REPLACE CODE WITH 'LTU', NAME WITH 'Lithuania', RESIDENTS WITH 3369600
dbAppend()
REPLACE CODE WITH 'USA', NAME WITH 'United States of America', RESIDENTS WITH 305397000
dbAppend()
REPLACE CODE WITH 'POR', NAME WITH 'Portugal', RESIDENTS WITH 10617600
dbAppend()
REPLACE CODE WITH 'POL', NAME WITH 'Poland', RESIDENTS WITH 38115967
dbAppend()
REPLACE CODE WITH 'AUS', NAME WITH 'Australia', RESIDENTS WITH 21446187
dbAppend()
REPLACE CODE WITH 'FRA', NAME WITH 'France', RESIDENTS WITH 64473140
dbAppend()
REPLACE CODE WITH 'RUS', NAME WITH 'Russia', RESIDENTS WITH 141900000

RETURN NIL

*--------------------------------------------------------*
PROCEDURE AddRecord( cCode, cName, nResidents )
*--------------------------------------------------------*

APPEND BLANK

REPLACE CODE WITH cCode, ;
NAME WITH cName, ;
RESIDENTS WITH nResidents

dbUnlock() // Recno() is valid only after UNLOCK or COMMIT

Form_1.Browse_1.VALUE := country->( RecNo() )
Form_1.Browse_1.Refresh

RETURN

и для сравнения код второй программы:
#include "minigui.ch" 

REQUEST DBFCDX

*--------------------------------------------------------*
FUNCTION Main()
*--------------------------------------------------------*

rddSetDefault( "DBFCDX" )

DEFINE WINDOW Form_1 ;
WIDTH 640 HEIGHT 480 ;
TITLE 'DBFCDX Demo' ;
MAIN NOMAXIMIZE ;
ON INIT OpenTable() ;
ON RELEASE CloseTable()

DEFINE MAIN MENU

DEFINE POPUP 'Test'
MENUITEM 'Add record' ACTION AddRecord( 'ARG', 'Argentina', 38740000 )
SEPARATOR
ITEM "Exit" ACTION ThisWindow.Release()
END POPUP

END MENU

@ 10, 10 BROWSE Browse_1 ;
WIDTH 610 ;
HEIGHT 390 ;
HEADERS { 'Code', 'Name', 'Residents' } ;
WIDTHS { 50, 160, 100 } ;
WORKAREA country ;
FIELDS { 'Code', 'Name', 'Residents' } ;
JUSTIFY { BROWSE_JTFY_LEFT, BROWSE_JTFY_LEFT, BROWSE_JTFY_RIGHT } ;
EDIT ;
INPLACE ;
READONLY { .T., .F., .F. }

END WINDOW

CENTER WINDOW Form_1

ACTIVATE WINDOW Form_1

RETURN NIL

*--------------------------------------------------------*
PROCEDURE OpenTable
*--------------------------------------------------------*

Form_1.Browse_1.VISIBLE := .F.

CreateTable()

INDEX ON FIELD->RESIDENTS TAG residents TO country

GO TOP

Form_1.Browse_1.VISIBLE := .T.

RETURN

*--------------------------------------------------------*
PROCEDURE CloseTable
*--------------------------------------------------------*

dbCloseArea( "country" )

RETURN

*--------------------------------------------------------*
FUNCTION CreateTable
*--------------------------------------------------------*

LOCAL aStruct := { ;
{ "CODE", "C", 3, 0 }, ;
{ "NAME", "C", 50, 0 }, ;
{ "RESIDENTS", "N", 11, 0 } ;
}

IF File( "country.dbf" )
FErase( "country.dbf" )
FErase( "country.cdx" )
ENDIF

dbCreate( "country", aStruct, "DBFCDX" )

USE country /*EXCLUSIVE*/ VIA "DBFCDX"

dbAppend()
REPLACE CODE WITH 'LTU', NAME WITH 'Lithuania', RESIDENTS WITH 3369600
dbAppend()
REPLACE CODE WITH 'USA', NAME WITH 'United States of America', RESIDENTS WITH 305397000
dbAppend()
REPLACE CODE WITH 'POR', NAME WITH 'Portugal', RESIDENTS WITH 10617600
dbAppend()
REPLACE CODE WITH 'POL', NAME WITH 'Poland', RESIDENTS WITH 38115967
dbAppend()
REPLACE CODE WITH 'AUS', NAME WITH 'Australia', RESIDENTS WITH 21446187
dbAppend()
REPLACE CODE WITH 'FRA', NAME WITH 'France', RESIDENTS WITH 64473140
dbAppend()
REPLACE CODE WITH 'RUS', NAME WITH 'Russia', RESIDENTS WITH 141900000

RETURN NIL

*--------------------------------------------------------*
PROCEDURE AddRecord( cCode, cName, nResidents )
*--------------------------------------------------------*

APPEND BLANK

REPLACE CODE WITH cCode, ;
NAME WITH cName, ;
RESIDENTS WITH nResidents

Form_1.Browse_1.VALUE := country->( RecNo() )
Form_1.Browse_1.Refresh

RETURN

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

Ваши комментарии на тему актуальности этой библиотеки приветствуются...

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 36 , стр: 1 2 All [только новые]


Ответов - 36 , стр: 1 2 All [только новые]
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 76
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет