Вверх ↑
Ответов: 670
Рейтинг: 140
#1: 2020-11-19 09:48:43 ЛС | профиль | цитата
Сделал несколько примеров работы с базой данных Firebird. Возможно, кому-то пригодится.
В схемах измените путь расположения БД на свой (в пути к папке с БД не должно быть русских букв).

1. Работа с БД через утилиту isql.exe, входящую в дистрибутив Firebird.
Add(MainForm,2953706,56,168)
{
Caption="Выгрузка из базы isql"
Point(onClose)
link(onCreate,4227353:doEvent1,[])
link(onClose,7284808:doEnum,[(116,195)(116,314)])
}
Add(StrList,5952139,175,147)
{
@Hint=#11:Запрос к БД|
FileName="Template.sql"
Strings=#18:/*** Settings ***/|15:set heading on;|13:set list off;|13:set echo off;|22:set sqlda_display off;|0:|18:/*** Commands ***/|27:select * from "TBL_ANIMAL";|0:|5:exit;|0:|0:|
Point(doSave)
AddHint(174,-42,80,13,@Hint)
}
Add(Hub,4227353,126,182)
{
OutCount=3
link(onEvent1,4909964:doSave,[(151,188)(151,132)])
link(onEvent2,5952139:doSave,[(158,195)(158,181)])
link(onEvent3,8423034:doExec,[])
}
Add(WinExec,8423034,175,196)
{
FileName="Template.bat"
Mode=0
RunEvent=1
Point(doConsoleExec)
Point(onConsoleResult)
link(onFinished,10005690:doEvent1,[])
}
Add(StrList,11299732,175,252)
{
Strings=#12:Template.sql|12:Template.bat|8:test.txt|
Point(doLoad)
}
Add(ArrayEnum,7284808,189,308)
{
link(onItem,4549278:doDelete,[])
link(Array,11299732:Array,[])
}
Add(StrList,4909964,175,98)
{
@Hint=#34:Укажите расположение БД и isql.exe|
FileName="Template.bat"
Strings=#9:@echo off|0:|8:setlocal|0:|57:path = c:\Program Files (x86)\Firebird\Firebird_2_0\bin\;|0:|177:isql.exe -user "SYSDBA" -password "masterkey" "localhost/3050:c:\Users\Public\Desktop\Examples_with_Firebird_database\TEST_DB.FDB" -i Template.sql -o test.txt -m -pagelength 500|0:|8:endlocal|0:|4:exit|0:|
Point(doSave)
AddHint(86,-31,168,26,@Hint)
}
Add(FileTools,4549278,238,294)
{
}
Add(Memo,8915684,308,154)
{
Width=384
Height=130
Align=2
Font=[Lucida Console,8,0,0,204]
ModeSp=1
FileName="test.txt"
ScrollBars=3
Point(doLoad)
}
Add(StrList,3489578,392,182)
{
FileName="test.txt"
Point(doLoad)
Point(doGetString)
Point(onGetString)
Point(String)
}
Add(Hub,10005690,259,203)
{
OutCount=4
link(onEvent1,8915684:doLoad,[(284,209)(284,188)])
link(onEvent2,3489578:doLoad,[])
link(onEvent3,14972792:doData,[])
link(onEvent4,4732775:doEnum,[(298,230)(298,265)])
}
Add(ArrayEnum,4732775,406,259)
{
link(onItem,7799271:doCompare,[])
link(onEndEnum,3882402:doConvert,[(449,272)(449,314)])
link(Array,3489578:Array,[])
}
Add(StrMask,7799271,462,259)
{
link(onFalse,1924644:doLoad,[])
}
Add(Hub,13615548,357,217)
{
link(onEvent1,3489578:doGetString,[])
link(onEvent2,3489578:doDelete,[(382,230)(382,202)])
}
Add(MTStrTbl,16072772,721,308)
{
Left=405
Top=210
Align=5
Name="asd"
link(CodePageSet,14915785:GetData,[])
}
Add(StrList,7382582,560,259)
{
}
Add(StreamConvertor,3882402,560,308)
{
Mode=7
Point(Data)
link(onResult,5019026:doLoadFromStream,[])
link(Data,7382582:Text,[])
}
Add(MST_Load,5019026,609,301)
{
MSTControl="asd"
link(onLoadFromStream,204618:doColAction,[])
}
Add(MST_ColAction,204618,658,308)
{
Action=9
Index=-2
MSTControl="asd"
}
Add(FTCG_Tools,1924644,511,259)
{
link(onWrite,7382582:doAdd,[])
link(Data,3489578:String,[(517,250)(419,250)])
}
BEGIN_SDK
Add(EditMultiEx,11560049,21,14)
{
WorkCount=#6:doLoad|0:|
EventCount=#7:onWrite|0:|
DataCount=#4:Data|0:|
Width=686
Height=207
VOffset=49
HOffset=91
link(doLoad,6958772:doEvent1,[])
}
Add(FT_StringToArray,16361172,112,70)
{
link(onLoad,2376352:doLength,[])
link(Data,11560049:Data,[])
}
Add(FT_For,16420516,217,70)
{
Start=1
link(onEvent,2029437:doRead,[])
link(End,2376352:Result,[(223,61)(209,61)(209,110)(174,110)])
}
Add(FT_Length,2376352,168,70)
{
link(onLength,16420516:doFor,[])
link(SrcStr,16361172:Str,[(174,61)(160,61)(160,110)(125,110)])
}
Add(FT_If_else,3788407,336,70)
{
Op2=String( )
link(onTrue,16294596:doDelete,[])
}
Add(ArrayRead,2029437,287,70)
{
link(onRead,3788407:doCompare,[])
link(Array,16361172:Array,[(293,61)(279,61)(279,117)(118,117)])
link(Index,7329230:Var2,[])
}
Add(GetDataEx,7329230,294,42)
{
Angle=3
link(Data,16420516:Position,[(272,47)(272,110)(223,110)])
}
Add(FT_Delete,16294596,406,70)
{
CharCount=1
link(onDelete,3231930:doInsert,[])
link(SrcStr,2519015:Var1,[(412,61)(397,61)(397,110)])
link(Position,14346910:Var2,[])
}
Add(FT_Insert,3231930,462,70)
{
SubStr=";"
link(onInsert,12930628:doWork2,[])
link(Position,14346910:Var3,[(482,47)])
}
Add(GetDataEx,14346910,413,42)
{
Angle=3
link(Data,7329230:Var3,[])
}
Add(FT_Memory,7756321,525,70)
{
}
Add(FT_Hub,6958772,49,63)
{
OutCount=3
link(onEvent1,12930628:doWork1,[(74,69)(74,41)(508,41)])
link(onEvent2,16361172:doLoad,[])
link(onEvent3,6395804:doData,[(102,83)(102,132)])
}
Add(HubEx,12930628,504,70)
{
link(onEvent,7756321:doValue,[])
}
Add(FT_DoData,6395804,525,126)
{
link(onEventData,11560049:onWrite,[(593,132)(593,69)])
link(Data,2519015:Var2,[])
}
Add(GetDataEx,2519015,525,105)
{
link(Data,7756321:Value,[])
}
END_SDK
Add(Charset,14072145,777,259)
{
Type=7
link(onCharset,14915785:doData,[(816,265)(816,251)(711,251)(711,265)])
}
Add(EventFromData,14915785,721,259)
{
link(onEvent,14072145:doCharset,[])
}
Add(DoData,14972792,308,217)
{
Data=Integer(2)
link(onEventData,13615548:doEvent1,[])
}

Плюсы – можно делать практически всё (создавать БД, вставлять таблицы, делать запросы и т.д.), не надо ничего дополнительно устанавливать.
Минусы – непросто парсить файл с результатами запроса если результат- “кривая” таблица (пропущенные места в столбцах, некоторые ячейки содержат null или текст с пробелами).

2. Работа с БД через стороннюю утилиту fbexport.exe http://fbexport.sourceforge.net/manual.html
Add(MainForm,2953706,70,133)
{
Caption="Выгрузка из базы fbexport"
Point(onClose)
link(onCreate,4227353:doEvent1,[])
}
Add(MTStrTbl,380764,588,168)
{
Width=384
Height=136
Align=5
Name="asd"
link(CodePageSet,14915785:GetData,[])
}
Add(Replace,12630103,329,168)
{
SubStr="""
link(onReplace,1239579:doConvert,[])
link(Str,4576143:Text,[])
}
Add(Hub,4227353,133,147)
{
OutCount=3
link(onEvent1,12981371:doString,[(158,153)(158,104)])
link(onEvent2,13739474:doExec,[])
}
Add(WinExec,13739474,231,154)
{
FileName="fbexport.exe"
Mode=0
RunEvent=1
link(onFinished,5719107:doEvent1,[])
link(Params,12981371:FString,[])
}
Add(FileTools,15798208,329,217)
{
FileName="myfile.csv"
}
Add(FormatStr,12981371,238,98)
{
Mask=" -Sc -H localhost -D "%1" -U sysdba -P masterkey -F myfile.csv -Q "%2" -T"
Point(FString)
link(Str1,6740905:Text,[])
link(Str2,11672865:Text,[])
}
Add(VisualStrings,6740905,238,21)
{
Lines=#67:c:\Users\Public\Desktop\Examples_with_Firebird_database\TEST_DB.FDB|
Width=403
}
Add(VisualStrings,11672865,245,49)
{
Lines=#26:select * from "TBL_ANIMAL"|
Width=172
}
Add(InfoTip,5707855,735,21)
{
Info=#43:http://fbexport.sourceforge.net/manual.html|
Width=260
Height=18
}
Add(MST_Load,7560086,434,161)
{
FileName="myfile.csv"
Delimiter=","
MSTControl="asd"
link(onLoadFromStream,2285484:doColAction,[])
}
Add(MST_ColAction,2285484,483,168)
{
Action=9
Index=-2
MSTControl="asd"
}
Add(StrList,4576143,329,105)
{
FileName="myfile.csv"
Point(doLoad)
}
Add(Hub,5719107,280,161)
{
OutCount=3
link(onEvent1,4576143:doLoad,[(305,167)(305,139)])
link(onEvent2,12630103:doReplace,[])
link(onEvent3,15798208:doDelete,[(319,181)(319,237)])
}
Add(StreamConvertor,1239579,385,168)
{
Mode=7
link(onResult,7560086:doLoadFromStream,[])
}
Add(Charset,14072145,644,112)
{
Type=7
link(onCharset,14915785:doData,[(683,118)(683,104)(578,104)(578,118)])
}
Add(EventFromData,14915785,588,112)
{
link(onEvent,14072145:doCharset,[])
}

(Схема обрезается, смотрите в архиве.)

Плюсы – выходной файл-готовый CSV, можно получить sql для вставки в другие базы данных.
Минусы – поддерживает Firebird до 2.1 версии, сторонняя утилита

3. Работа с БД через ODBC драйвер и VBJScript. https://www.firebirdsql.org/en/odbc-driver/
Add(FormatStr,1568770,147,266)
{
DataCount=3
Mask="Dim objConn, objRecordset, objColumns \r\n\r\n'sys.onClear nil\r\n\r\nSet objConn = CreateObject("ADODB.Connection")\r\nobjConn.ConnectionString = "Driver=Firebird/InterBase(r) driver;Uid=SYSDBA;Pwd=masterkey;DbName=localhost:%1;"\r\nobjConn.ConnectionTimeOut = 15\r\nobjConn.CommandTimeout = 30\r\nobjConn.Open\r\n\r\n'Set objRecordset = objConn.Execute("%3",,2)\r\nSet objRecordset = objConn.Execute("%2")\r\nSet objColumns = objConn.OpenSchema(4, Array(Empty,Empty, "%3"))\r\n\r\n'Перебираем название столбцов\r\nWhile Not objColumns.EOF\r\n sys.onColNames Trim(objColumns.Fields(3))\r\n objColumns.MoveNext\r\nWend\r\n\r\n'Set objColumns = objConn.Execute("select rdb$field_name from rdb$relation_fields where rdb$relation_name='%3' order by rdb$field_position",,1)\r\n'While Not objColumns.EOF\r\n' sys.onColNames objColumns.Fields(0).Value\r\n' objColumns.MoveNext\r\n'Wend\r\n\r\n'Перебираем результаты запроса\r\nWhile Not objRecordset.EOF\r\n strRes = vbNullString\r\n For i=0 To objRecordset.Fields.Count-1\r\n strRes = strRes & objRecordset.Fields(i).Value & vbTab\r\n Next\r\n sys.onQuery strRes\r\n objRecordset.MoveNext\r\nWend\r\n\r\nsys.onEnd nil\r\n\r\n'objRecordset.Save "test.xml", 1\r\n\r\nobjConn.Close\r\nSet objConn = Nothing\r\nSet objColumns = Nothing\r\nSet objRecordset = Nothing\r\n\r\n\r\n "
link(onFString,224191:##SetScript,[])
link(Str1,6740905:Text,[])
link(Str2,11672865:Text,[])
link(Str3,4385306:Text,[])
}
Add(MainForm,2953706,77,252)
{
Width=827
Height=431
Caption="Выгрузка из базы ODBC"
link(onCreate,1568770:doString,[])
}
Add(VisualStrings,6740905,147,133)
{
Lines=#67:c:\Users\Public\Desktop\Examples_with_Firebird_database\TEST_DB.FDB|
Width=375
}
Add(VisualStrings,11672865,154,161)
{
Lines=#24:select * from TBL_ANIMAL|
Width=172
}
Add(InfoTip,5707855,651,119)
{
Info=#51:http://www.ibphoenix.com/download/connectivity/odbc|3:или|43:https://www.firebirdsql.org/en/odbc-driver/|0:|
Width=379
Height=46
}
Add(VBJScript,224191,203,266)
{
WorkPoints=#11:##SetScript|
EventPoints=#7:onQuery|10:onColNames|5:onEnd|
Script=#0:|0:|
UseName=0
link(onQuery,7153700:doMT,[])
link(onColNames,7431476:doMT,[(263,279)(263,314)])
link(onEnd,7840295:doColAction,[(256,286)(256,349)])
}
Add(VisualStrings,4385306,161,189)
{
Lines=#10:TBL_ANIMAL|
Width=165
}
Add(MTStrTbl,10873068,448,259)
{
Left=60
Top=210
Width=660
Align=5
Name="asd"
link(CodePageSet,14915785:GetData,[])
}
Add(MST_DB,8691268,329,259)
{
MSTControl="asd"
}
Add(Charset,14072145,504,210)
{
Type=7
link(onCharset,14915785:doData,[(543,216)(543,202)(438,202)(438,216)])
}
Add(EventFromData,14915785,448,210)
{
link(onEvent,14072145:doCharset,[])
}
Add(MT_String,7153700,273,259)
{
Delimeter="\t"
link(onResult,8691268:doAddRow,[])
}
Add(MT_String,7431476,273,301)
{
Delimeter="\t"
link(onResult,8691268:doAddCols,[(312,307)(312,272)])
}
Add(MST_ColAction,7840295,273,343)
{
Action=9
Index=-2
MSTControl="asd"
}

Плюсы – никаких внешних файлов
Минусы – для работы нужен установленный ODBC драйвер

Все схемы были проверены на локальном сервере Firebird 2.0 и на Windows 10 64.
Архив с примерами и тестовой базой https://forum.hiasm.com/getfile/39171
карма: 14

2
файлы: 1Examples_with_Firebird_database.zip [275.9KB] [324]
Голосовали:user_asm, Pavel
Редактировалось 4 раз(а), последний 2020-11-19 10:01:18