Avatar billede koden12 Nybegynder
24. november 2003 - 19:02 Der er 40 kommentarer og
1 løsning

server DB

kan der gennem Delphi laves en server database som over 100 kan skrive i på samme tid , enten gennem ADO eller BDE ? Bliver den ikke langsom ?
hvordan ser det ud ?

VH
Koden12
Avatar billede neeo Nybegynder
24. november 2003 - 19:44 #1
kan du ikke uddybe det lidt :)
Avatar billede janbb Juniormester
24. november 2003 - 19:47 #2
Det er vel osse OS der udgør begrænsning ? - hastighed do og maskine ? men det er jo banalt self. du er vel mere ude efter sammenligninger med andre typer konstruktioner VB o.l. formoder jeg.Saa nogle dll.ere der kunne håndtere mange samt. brugere, men 100 har jeg slet ikke begreb om.
Avatar billede koden12 Nybegynder
24. november 2003 - 19:53 #3
Nææ jeg vil gerne bar vide om Delphi og Access fx kan håndterer en server database som ligger på server i et firma og hvor der er lavet et brugerinterfase i delphi som tilgår denne Database.
VH
koden12
Avatar billede whynot Nybegynder
24. november 2003 - 22:48 #4
den kan den godt.. men access er ikke et optimalt valg af database. Access er i den samligning en "lille" database og uden nogen reel håndtering af samtidigheds problemer.

Jeg har personlig oplevet en virksomhed som netop havde en access database løsning.. og de havde flere gange oplevet at deres database var blevet ødelagt blot fordi deres kontorer ikke lå på samme lokation. Deres løsning blev at lave terminal server - herved ligger al beregning ét sted hos serveren og derved bliver samtidighedsproblematikken nedsat drastisk.

Jeg vil anbefale MSSQL eller hvis det godt må være lidt "lowbudget".. så måske en MySql.. men stadig med det forbehold at den er bedre end access men ikke på højde med MSSQL.

håber det hjalp.
Avatar billede koden12 Nybegynder
25. november 2003 - 10:06 #5
En MySql kan jo ikke ses i Delphi eller laves til en rigtig database program i Delphi ?
MSSQL er dyr..
Ville Paradox kunne løse det ?

VH
Koden12
Avatar billede whynot Nybegynder
25. november 2003 - 11:42 #6
Mysql kan godt tilgåes gennem delphi.!.. der er flere måder at tilgå MySql .. den "nemmeste" er ved at anvende microolap 's component "TMySQLDAC" eller "DAC for MySQL".. som den også hedder.. jeg ved at Morten_s har skrevet om MySQL i delphi flere gange på eksperten.. du kan tjekke hans besvarelser ud - de er faktisk rigtig gode.

Og nej - jeg vil ikke spille smart overfor paradox.. jeg har simpelthen ikke arbejdet nok med den database.. men faktum er at jeg MEGET sjællendt støder på paradox i virksomheder.. og det må der være en grund til. Men som sagt - jeg ved ikke meget om paradox og derfor heller ikke meget om svagheder/styrker for den.
Avatar billede borrisholt Novice
26. november 2003 - 10:42 #7
Ellers er der jo også andre løsninger som Interbase som Pelle (Pellelil) er ekspert i.

I øvrigt er en MSSQL ikke så dyr, hvos du fx har en FoxPro licens allerede.

Jens B
Avatar billede janbb Juniormester
26. november 2003 - 15:03 #8
Jeg synes aldrig der hae været exeleret i programeksempler med interbase ?.
Avatar billede borrisholt Novice
26. november 2003 - 15:14 #9
Ellers spørg Pelle. Han arbejder med det til daglig.

Jens B
Avatar billede koden12 Nybegynder
26. november 2003 - 23:19 #10
Jeg har heller ikke set Intebase beskrevet og navnligt ikke hvordan de mærkelige CDS filer bliver til ??
Er de dannet lige ud af den blå luft ?

VH
koden12
Avatar billede pellelil Nybegynder
27. november 2003 - 08:41 #11
Jeg vil helt klart foreslå at du benytter InterBase, da den nemt kan klare trykket (er pt. ved at udvikle et system hvor vi forventer at +200 brugere skal have adgang til en 30-100 GB database).

Egentlig er det ikke InterBase, men en "af-art" der hedder FireBird. Denne kan hentes via adressen: http://www.firebirdsql.com. Den seneste (færdige/stabile) version er 1.0.3 (build 972), men version 1.5 er ved at være klar (er pt. ude some RC7, som forhåbentlig bliver den sidste RC).

InterBase/FireBird kan hentes/installeres/anvendes gratis, men de værktøjer der følger med (til at opbygge en database) er ikke specielt "produktive" (du skal selv sidde og skrive DDL ("SQL kommandoer") for at opbygge din database.

Personligt har jeg købt EMS IB-Manager (http://www.ems-hitech.com/ibmanager/download.phtml), som kan erhverves for $115-$495 (alt efter hvad den skal "bundles med"). Jeg kan varmt anbefale denne i "Professional" udgaven ($195), og den kan hentes i et 15-30 dages version hvis du blot vil kigge nærmere på den. Som et alternativ til denne kan man også købe IB Expert (http://www.ibexpert.com/). Hvis du er på udkig efter et gratis alternativ så kig på IBAccess (http://www.ibaccess.org/).

Når du fra Delphi skal tilgå FireBird, så er der igen flere muligheder. Sammen med Delphi (siden version 5 så vidt jeg husker) får du IBX (InterBase Express). Til denne kan du fra Borland's Community hente seneste opdatering (IBX er gratis). Personligt har jeg valgt at anvende IBO (www.ibobjects.com) som er en pakke med "købe-komponenter", og et andet alternativ er FIBPlus (http://www.fibplus.net/) - også "købe-komponenter".
Avatar billede koden12 Nybegynder
27. november 2003 - 09:53 #12
Tak for gode svar.. Men mangler forsat lidt..syntes jeg.. det er undren der plager mig når Dlephi 7 Proff nu han så mange nye muligheder for Database også til www at der ikke findes nogle vejledning...Også på IBConsol mangler der eksempler mm.
Det må da kunne lade sig gøre, da jeg abejdede var et af de største database systemer jeg har set, lavet i Turbo Pascal og meget efektivt.

VH
Koden12
Avatar billede pellelil Nybegynder
27. november 2003 - 15:21 #13
FireBird og InterBase (OpenSource) er gratis produkter, som vedligeholdes af personer som egentlig ikke får nogen betaling for den tid de bruger (nogle få har fået lidt, men det er ikke "noget at skrive hjem om"). Der var startet et initiativ til at lave en egentlig  bog til InterBase men det løb ud i sandet (jeg har dog fundet nogle bøger via nedenstående link). Dermed ikke sagt at der ikke findes informationer. Der findes da masser af information rundt omkring (på nettet) om InterBase, men bare ikke på Dansk og du finder det ikke samlet EET sted. Jeg har dog kendskab til en person der vil lave en sådan hjemmeside, men tror ikke på at du skal regne med at se den før i løbet af første kvartal næste år.

Når det drejer sig om "information" så adskiller InterBase/FireBird sig ikke væsentlig fra eksempelvis MS-SQL (som til sammenligning koster 50.000 for en ubegrænset, enkelt CPU licens). For disse penge får du blot et stykke papir (licensen) hvis du også vil have en installations CD skal du betale yderligere 250 kroner for et media-kit. Stadig har du endnu ikke fået noget dokumentation for pengene. Forskellen er at det nemt af finde bøger om- og få undervisning i MS-SQL. Jeg tror årsagen herfor er at hvis man har betalt 100.000 for at få 2 servere, så vil man også være villig til at betale 15.000 for et kursus og/eller 500 for en bog. Hvorimod hvis man har fået InterBase/FireBird gratis, så vil man knap så villig til at ville bruge de samme penge på kursus/bøger.

Via www.firebirdsql.com kan du finde diverse dokumentation og/eller link til sider hvor du kan finde det (du skal bare "gidde at bruge tiden"). IBConsol er utrolig nem at anvende (du skal blot connecte til en database) men den kræver at du ved noget om SQL (da du selv skal "skrive alt").

Følgende link kan måske kaste lidt mere lys på InterBase/FireBird:
http://www.ibphoenix.com/main.nfs?a=ibphoenix&page=ibp_document
http://www.ibphoenix.com/main.nfs?a=ibphoenix&page=ibp_publications
http://www.interbase-world.com/
http://delphi.about.com/cs/interbase/
Avatar billede borrisholt Novice
27. november 2003 - 15:31 #14
SQL 2000svr koster altså kun 16.000 :-)

jens B
Avatar billede borrisholt Novice
27. november 2003 - 15:32 #15
Avatar billede koden12 Nybegynder
27. november 2003 - 15:34 #16
Det er bare en lille database som alle skal kunne se og de har ingen penge..
En som kan afløse de GAMEL DSI system eller sådan noget..

VH
koden12
Avatar billede borrisholt Novice
27. november 2003 - 15:38 #17
InterBase !
Avatar billede koden12 Nybegynder
27. november 2003 - 15:46 #18
Måske Boris elle ADO ?
Der findes dog ikke noget om hvordan Interbase fungerer..
Har nogle førsøgt sig med den..
Skal den installeres på serveren ?  fx ?

VH
koden12
Avatar billede borrisholt Novice
27. november 2003 - 15:51 #19
ADO er ikke en Database det er en måde at snakke med en Database med !

"Der findes dog ikke noget om hvordan Interbase fungerer" Har du ikke læst pelles indslag ?
¨
Jens B
Avatar billede pellelil Nybegynder
27. november 2003 - 15:57 #20
Borrisholt> Ja 16.000 for en 5 bruger version, men hvis du skal have en version med ubegrænset antal brugere/klineter så er prisen 50.000 (pr. CPU i serveren).

koden12> Ja der er mange er har "forsøgt sig med den" og undertegnet er en af "de lykkelige brugere af interbase" (og jeg vil tilhver en tid foretrække den frem for MS-SQL - ikke kun pga prisen). Den skal installeres på "en server" (det kan for den sags skyld godt være en "MS-2000 Pro." eller en XP-Home/Pro). Den kan endvidere godt installeres på en W95/W98, men med +50 brugere ville jeg nok ikke vælge en af de 2. På hver eneste klient skal du installere IB/FB-klienten. Klienten er en del af "den samme installation" som benyttes til at installere serveren (du skal blot fravælge alt hvad der manuelt "kan vælges"). I store træk er installationen af klienten blot 1 eller 2 DLL'er (alt efter om du bruger FB version 1.0.3 eller 1.5), samt nogle få registreringer i registreringsdatabasen.
Avatar billede pellelil Nybegynder
27. november 2003 - 16:00 #21
Hvis det skal være gratis så brug IBAccess på at opbygge databasen og brug IBX til at "tilgå den" (fra Delphi). Seneste version af IBX kan (som nævnt tidligere) hentes fra Borlands community: http://codecentral.borland.com/codecentral/ccweb.exe/author?authorid=102
Avatar billede koden12 Nybegynder
27. november 2003 - 16:01 #22
Mand hvor besværligt !!!  kan jeg ikke bare lægge en access fil (database) ned på deres bruger drev og så håbe på at de rammer den ..

VH
koden12
Avatar billede borrisholt Novice
27. november 2003 - 16:54 #23
Pelle>> Jeg synes sq ikke vi betaler så meget for den .. Men det skal jeg da undersøge. Fordi vi køber da jævnligt SQL Servere.
Jens B
Avatar billede pellelil Nybegynder
27. november 2003 - 17:56 #24
borrisholt> At betale hos ProConsult (http://www.proconsult.dk/katalog/m_soft/s_soft-b/soft-b60/mol-22800971.html) + 50.000 kroner (dog inkl. moms). Hvis I kan nøjes med "få brugere" så vil det naturlis være billigere med en "standard version" til +7.000 (igen inkl. moms) hvorefter klienterne pr stk. (NL CAL) koster 1.550 (ligeledes inkl. moms). Ikke at forglemme et mediekit til kroner 290,- <G>

At sammenligne med en FireBird server til 0,- og herefter 0,- pr. klient, og mediekit'et kan erstattes med 2 minuters download tid. Hvis man dog vil have "et ordenligt" administrationsværktøj, må vi ryste op med "den nette sum" af 195 USD (ca. 1.250,-).
Avatar billede pellelil Nybegynder
27. november 2003 - 18:02 #25
koden12> 100 brugere til samme Access database: "Good luck". Databaser som Access og Paradox er og bliver "legetøjsdatabaser" (overdrivelse fremmer forståelsen). Ingen tvivl om at man sagtens kan lave systemer med såvel Access som Paradox, men de egner sig ikke til netværkssystemer (flere brugere i samme database). Jeg har stadig en del at gøre med Paradox (i mit daglige arbejde) men jeg ser frem til den dag hvor jeg kan afinstallere den sidste af disse (jeg er SÅ TRÆT af at skulle reparere smadrede databaser, HVER DAG).

Hvorfor ikke bare EEN GANG bruge den tid det tager at sætte dig ind i hvordan FireBird anvendes. Herefter vil du i fremtiden lynhurtig kunne opbygge selv MEGET STORE systemer i en database der i min bog er mindst lige så god som MS-SQL og det vel og mærke til en pris der hedder "gratis".
Avatar billede koden12 Nybegynder
27. november 2003 - 19:42 #26
Pellelil blandt andet fordi jeg ikke kan skrive dll fil den..

VH
koden12
Avatar billede pellelil Nybegynder
28. november 2003 - 08:23 #27
"ikke kan skrive dll fil den" ?
Avatar billede koden12 Nybegynder
28. november 2003 - 11:34 #28
Den består af en række bat filer og det er så det..
Ingen Setup.exe  eller noget som helst ?

VH
koden12
Avatar billede pellelil Nybegynder
28. november 2003 - 11:44 #29
Hvem er "den"? Lad os antage at det er FireBird's installation-program du taler om. I så fald har du hentet den forkerte. Gå til adressen http://sourceforge.net/project/showfiles.php?group_id=9028 herefter skal du "rulle ned" til "Firebird-win32". Alt andet lige så vil jeg tro at FB1.5 er ude i en final version når du "er færdig" med dit program, så jeg vil foreslå at du henter filen "Firebird-1.5.0.4027-RC7-Win32.exe" (hvis du i stedet har hentet "zip-udgaven" kan jeg godt forstå at du er i tvivl). Denne exe-fil er hele installations pakken (det er som nævnt tidligere samme installations-program der anvendes såvel på server som på klienter).
Avatar billede janbb Juniormester
28. november 2003 - 12:24 #30
Det er imponerende at I skriver man kan køre den fra en 'Home edition' - derudover viljeg gerne suppl. med et par bem. fra nedenst. site:

http://www.209software.com/books/wpid/\f0
The most compelling thing about Interbase is that it's thoroughly integrated with the BDE and Delphi*. I have done SELECT * FROM MEMOS WHERE MEMOTEXT LIKE '%SOMESTRING%' in Memo fields using Interbase. Oracle won't do text matches in memo fields, so you have to iterate through the entire DB. Also, with Interbase, it's easy to back up and transmit an Interbase database, data, schema, and all.

It doesn't take excessively long to log in, so CGI apps can be written to access an Interbase DB. It doesn't lose track of indexes, and it's very reliable. There are some other reasons to choose Interbase*, but the one big drawback is this... Most non-Borland developers have never heard of it. Ask a room full of VC++ snobs about Interbase, and they'll shrug at you.
Avatar billede pellelil Nybegynder
28. november 2003 - 12:24 #31
Jeg kom lige i tanke om, at jeg har "noget skriv" jeg lavede for nogle år siden til et par bekendte som skulle igang med InterBase. Det er som sagt ikke helt nyt, så der er sket meget siden (og jeg er i mellemtiden blevet klogere <G>) f.eks. anvender jeg nu FireBird i stedet for InterBase, og i stedet for IBX osv. Men det er alligevel ikke helt "ubrugbart".

Dette "skriv" kan jeg maile (til de der ønsker det), men det kræver selvfølgelig en emailadresse !?
Avatar billede janbb Juniormester
28. november 2003 - 13:44 #32
postmaster@jababa.dk
Avatar billede koden12 Nybegynder
28. november 2003 - 20:49 #33
Jo da jeg installerede den men den er ikke til noget.. den kan kun ses som Aplication.. og selv der kan den intet..
Er det jeres database ekspert ?  : )
Ikke så underligt at det går galt derude..

Koden12
Avatar billede pellelil Nybegynder
28. november 2003 - 21:51 #34
janbb> En FireBird kan stort set installeres på alt fra en Brødrister til en Cray supercomputer (ikke helt, men næsten <G>). Jeg skal med det samme sige at jeg ikke har nogen erfaringer med at køre serveren på W95/W98 men klienterne har ingen problemer på disse. Jeg vil helt klart foretrække en W2K eller XP til at køre server-delen. I udviklings-øjemed har jeg serveren kørende på min egen XP maskine (herhjemme) og på arbejde har jeg den kørende på vores "udviklings server" (W2K Server). Ligeledes i drift kører vi den på en W2K Server.

koden12> I denne tråd har der efterhånden været vendt en del ting, så gør os alle den tjeneste at skrive lidt mere om hvad du mener i stedet for at henvise til "den". Igen gætter jeg på at det er server delen du taler om !?

Når du har installet en FirdBird på en W2K og/eller XP maskiner så er der ikke alverden at se. Højreklik på "Denne Computer" (hvis det er et Dansk OS) og vælg "Adimistrer" (gå herefter ind og kig på "Tjenester"). Her vil du kunne se 2 tjenester der hedder "FireBird Guardian..." og "FireBird Server...". Det er stort set hvad du kan se.

Som standard installeres FB (RC7) i folderen "C:\Programmer\Firebird\Firebird_1_5". Denne har en under-folder ved navn "bin" hvor du finder de "utilities" du kan anvende til at udføre forsk. opgaver (f.eks. "GBAK" som anvendes til backup/restore af databasen). Alle disse er kommandolinie-baseret (det er begrænset hvad man får for 0,- kroner).

Som nævnte (efterhånden et par gange) tidligere så hvis du vil have et GUI til opbygning af databaser kan du vælge IBAccess hvis det skal være gratis eller eksempelvis EMS IB-Manager hvis man vil betale for et bedre produkt.

"Ikke så underligt at det går galt derude...": Hvad går galt, hvor ude ?
Avatar billede janbb Juniormester
29. november 2003 - 03:10 #35
pellelil:Ja let ser det jo ikke ud, men som du siger er det jo heller ikke legetøj og jeg er da glad for der er nogen programlinier at kigge på, selvom jeg kunne have drømt om et lille legetøjseksempel at lægge ud med.Alt det med opbygning og vedligeholdelde skal man jo frem til, men det ville være stimulerende at kunne 'se' databasen 'udefra' som en lille appetitvækker inden man fordybede sig i tungere sager.Hvis du forstår ?.Altså den ddl eller exe-fil, der 'viser' filen 'bare' - kan nok tænke mig at update osv er mere kringlet.
Avatar billede janbb Juniormester
29. november 2003 - 03:57 #36
Fandt ud af at man kan bruge samme metoder som til Paradox-databaser jo - så mit spm var lidt dumt.
Avatar billede pellelil Nybegynder
29. november 2003 - 13:10 #37
Set fra Delphi så adskiller tilgangen til en IB/FB sig ikke væsentlig fra tilgangen til Paradox. Kun på et punkt er der EN STORE forskel - nemlig Transaktionen. Når du (eksempelvis fra Paradox) gennem BDE'en skal oprettes/rette/slette så sørger BDEen for at dine kald pakkes ind i transaktioner. Dette er IKKE tilfældet med IB/FB når du anvender IBX komponenterne. Her skal du selv styre transaktionerne og det er vigtigt at forstå at ALT skal foregå gennem en transaktion. Så når du først "har fanget den" så er IB/FB ikke vanskeligere at bruge end eksempelvis Paradox.

Du kan godt sammen med IB/FB anvende Table baserede komponenter men det er en no-no (læs: gør det ikke). Hvis du er meget doven så lav et Query hvor du blot skriver "select * from tabelnavn" og så er denne lige så hurtigt at oprette i Delphi, dog uden at du får Table'ens "dårligdomme" med. En TIBTable skulle eftersigende medføre 30-40% forøget netværkstraffik i forhold til en TIBQuery (har ikke selv efterprøvet det) selv om dette selecter alle felter. Denne forskelle kan være endnu mindre hvis du i dit program eksempelvis kun har brug for at behandle få af de felter som du har i din tabel (select felt1, felt2, felt3 from tabelnavn where betingelse = 1).

Med hensyn til "DDL" så kan man groft sagt dele SQL op i 2 dele, nemlig "DDL" (Data Definition Language) og "DML" (Data Manipulation Language"). "DDL" er således de "SQL-kald" der benyttes til at opbygge og vedligeholde din databasen (Create Table, Alter Table ...), og "DML" er de "SQL-kald" der benyttes til at behandle de data der findes i databasens tabeller (Insert Into, Delete From ...).

Hvis man vælger at bruge IBConsole så er man nødt til at sætte sig ind i hvordan "DDL" skal anvendes, men man "får hurtig krampe i fingrene" hvis man skal opbygge/vedligeholde en større database. Kig i stedet på IBAccess så kan du via dennes GUI opbygge dine databaser uden at kende alverden til "DDL".
Avatar billede koden12 Nybegynder
29. november 2003 - 14:09 #38
Her står jeg af...
Jeg kan bygge en access database og en Paradox datatbase , men hvor hulen de får de CDS databaser fra det har jeg undret mig over i mange år...
De fylger med når man køber Delphi fx clientdb.cds men hvor laves de.. Jeg har delphi bøger til flere tusinde kroner men ikke et ord om hvor de kommer fra ?

VH
koden12
Avatar billede pellelil Nybegynder
29. november 2003 - 17:41 #39
CDS-filer er TClientDataSets som er gemt i deres binære format. Kig på TClientDataSet's methoder "FileName" og "Save" (så kan du lave dig en CDS fil). Brugen af CDS i Delphi går under betegnelsen "MyBase" men kan kun bruges stand-alone (ikke flerbruger)
Avatar billede janbb Juniormester
29. november 2003 - 20:22 #40
Tak for dine mange råd pellelil - jeg er i hvert fald kommet videre med dette emne ,der har stået som et mysterium for mig i mange år og som det har været tilfældet med andre emner er dette forhåbentlig osse et spm. om 'at få lidt hul på bylden' og tak til koden 12 for hans ofte meget intelligente spm., der falder i en kategori der har min store interesse.
Avatar billede koden12 Nybegynder
29. november 2003 - 23:44 #41
Selv tak Janbb... i min søgen faldt jeg over en Delphi ting (gratis) : ) der kan connect til en MySql som jo er en server ting og til Feler brugere på en gang.. Den ser sådan ud :

Først en class hedder det vist :

unit _libmysq;

{This is a more complete unit to interface with MySQL Server from Delphi
have included the rest of the
functionality in libmysql.dll.
LibMYSQL.dll

To find out more on this get the C API docs from www.tcx.se (makers of MySQL)}

{TODO: Implement as a VCL I dont think I have the knowledge to make it use Delphis
data controls but Ill look into it, I dont think the component will be too hard to
implement in the near future}


interface
const
mysql_errmsg_size=200;
MYSQL_PORT=3306;
LOCAL_HOST='localhost';
MYSQL_UNIX_ADDR='/tmp/mysql.sock';
NAME_LEN=64;
PROTOCOL_VERSION=10;
MYSQL_SERVER_VERSION='3.21.18-beta';
FRM_VER=6;
MYSQL_VERSION_ID=32115;
field_type_decimal=0;
field_type_tiny=1;
field_type_short=2;
field_type_long=3;
field_type_float=4;
field_type_double=5;
field_type_null=6;
field_type_timestamp=7;
field_type_longlong=8;
field_type_int24=9;
field_type_date=10;
field_type_time=11;
field_type_datetime=12;
field_type_enum=247;
field_type_set=248;
field_type_tiny_blob=249;
field_type_medium_blob=250;
field_type_long_blob=251;
field_type_blob=252;
field_type_var_string=253;
field_type_string=254;

type
enum_field_types=byte;
my_bool= shortint;
gptr= pchar;
socket= word;

mysql_status=(mysql_status_ready,mysql_status_get_result,mysql_status_use_result);

pused_mem=^used_mem;
used_mem=record
            next:pused_mem;
            left,size: Cardinal;
          end;

err_proc=procedure;

pmem_root=^mem_root;
mem_root=record
          free,used:pused_mem;
          min_malloc,block_size: Cardinal;
          error_handler:err_proc;
          end;

net=record
      fd: socket;
      fcntl: integer;
      buff,buff_end,write_pos: pchar;
      last_error:array[01..mysql_errmsg_size] of char;
      last_errno,max_packet,timeout,pkt_vnr: integer;
      error,return_errno: my_bool;
      end;

pmysql_field=^mysql_field;
mysql_field=record
            name,table,def: pchar;
            _type: enum_field_types;
            length,max_length,flags,decimals: Cardinal;
            end;
mysql_field_offset= Cardinal;


pmysql_row=^mysql_row;
mysql_row= array[00..$ff] of pchar;



(*********************************************)


pmysql_rows=^mysql_rows;
mysql_rows=record
            next: pmysql_rows;
            data: pmysql_row;
          end;
mysql_row_offset= pmysql_rows;

pmysql_data= ^mysql_data;
mysql_data= record
            rows, fields: Cardinal;
            data: pmysql_rows;
            alloc: mem_root;
            end;

pmysql=^mysql;
mysql= record
        _net: net;
        host,user,passwd,
        unix_socket,
        server_version,
        host_info,
        info,db: pchar;
        port,client_flag,server_capabilities,
        protocol_version,field_count: Cardinal;
        thread_id, affected_rows, insert_id, extra_info:longint;
        status: mysql_status;
        fields: pmysql_field;
        field_alloc: mem_root;
        free_me, reconnect: my_bool;
      end;

pmysql_res=^mysql_res;
mysql_res= record
          row_count: longint;
          field_count, current_field: Word;
          fields: pmysql_field;
          data: pmysql_data;
          data_cursor:pmysql_rows;
          field_alloc:mem_root;
          row: mysql_row;
          current_row: pmysql_row;
          lengths: ^Word;
          handle: ^mysql;
          eof: my_bool;
          end;

const thelib='libmysql.dll';
(*********ALL functions are working unless stated otherwise*************)
{If you can figure why why one of the ones marked bad is not working, please
send me the code to implement it properly}

function mysql_connect( _mysql: pmysql; const host,user,passwd:pchar):pmysql;stdcall;
{Non-functional: dont know why yet: I think you can do without it for now}
function mysql_real_connect(_mysql: pmysql; const host, user, passwd, db:pchar;
port:Cardinal; unix_socket:PChar;clientflag:Cardinal):pmysql;stdcall;
procedure mysql_close( _mysql: pmysql); stdcall;
function mysql_select_db(_mysql:pmysql;const DB: pchar):integer; stdcall;
function mysql_query(_mysql:pmysql;const query: pchar):integer;stdcall;
{Real Query not implemented in current version of libmysql.dll (timestamp:353be33a)}
function mysql_real_query(_mysql:pmysql;const query: pchar;length: Cardinal):integer;stdcall;
function mysql_create_db(_mysql:pmysql; const DB:PChar):integer;stdcall;
function mysql_drop_db(_mysql:pmysql; const DB:PChar):integer;stdcall;
function mysql_shutdown(_mysql: pmysql): Integer; stdcall;
{Although undocumented, I believe this is to reload the permissions table;
documentation calls for a reload function which there is none in libmysql.dll,
so I think this may be a replacement, it takes a Cardinal for options but I cant find out
what those options are since its not documented}
function mysql_refresh(_mysql:pmysql; refresh_options: Cardinal):integer;stdcall;
function mysql_kill(_mysql:pmysql; pid:longint):integer;stdcall;
function mysql_stat(_mysql:pmysql):pchar; stdcall;
function mysql_get_server_info(_mysql:pmysql):PChar;stdcall;
function mysql_get_client_info:PChar;stdcall;
function mysql_get_host_info(_mysql:pmysql):PChar;stdcall;
function mysql_get_proto_info(_mysql:pmysql):Cardinal;stdcall;
function mysql_list_dbs(_mysql:pmysql;wild: pchar):pmysql_res; stdcall;
function mysql_list_tables(_mysql: pmysql; const wild: pchar):pmysql_res; stdcall;
function mysql_list_fields(_mysql: pmysql;const table,wild: pchar):pmysql_res; stdcall;
function mysql_list_processes(_mysql: pmysql):pmysql_res; stdcall;
function mysql_store_result(_mysql:pmysql):pmysql_res; stdcall;
function mysql_use_result(_mysql:pmysql):pmysql_res;stdcall;
procedure mysql_free_result(result:pmysql_res); stdcall;
procedure mysql_data_seek(result:pmysql_res; offset:Cardinal); stdcall;
{Row seek is probably functional if I knew how to test it;
I think its a matter of saving a particular row pointer in a mysql_row_offset struct;
then later make a call to row_seek to restore the data_cursor to that row;
then a fetch_row will return the next row after that???? I have no need for it so you tell me}
function mysql_row_seek(result:pmysql_res; row:mysql_row_offset):mysql_row_offset;stdcall;
{Field Seek is not implemented in current version of libmysql.dll(timestamp:353be33a)}
function mysql_field_seek(result:pmysql_res;offset:mysql_field_offset):mysql_field_offset;stdcall
function mysql_fetch_row(result:pmysql_res):pmysql_row;stdcall;
{I dont think fetch_length is working properly because of the way that I set up the MYSQL_ROW array}
function mysql_fetch_lengths(result:pmysql_res):Cardinal;stdcall;
function mysql_fetch_field(handle: pmysql_res):pmysql_field; stdcall;

implementation
function mysql_connect( _mysql: pmysql; const host,user,passwd:pchar):pmysql;stdcall;external thelib;
function mysql_real_connect(_mysql: pmysql; const host, user, passwd, db:pchar;
port:Cardinal; unix_socket:PChar;clientflag:Cardinal):pmysql;stdcall;external thelib;
procedure mysql_close( _mysql: pmysql); stdcall;external thelib;
function mysql_select_db(_mysql:pmysql;const DB: pchar):integer; stdcall;external thelib;
function mysql_query(_mysql:pmysql;const query: pchar):integer;stdcall;external thelib;
function mysql_real_query(_mysql:pmysql;const query: pchar;length: Cardinal):integer;stdcall;external thelib;
function mysql_create_db(_mysql:pmysql; const DB:PChar):integer;stdcall;external thelib;
function mysql_drop_db(_mysql:pmysql; const DB:PChar):integer;stdcall;external thelib;
function mysql_shutdown(_mysql: pmysql): Integer; stdcall;external thelib;
function mysql_refresh(_mysql:pmysql; refresh_options: Cardinal):integer;stdcall;external thelib;
function mysql_kill(_mysql:pmysql; pid:longint):integer;stdcall;external thelib;
function mysql_stat(_mysql:pmysql):pchar; stdcall;external thelib;
function mysql_get_server_info(_mysql:pmysql):PChar;stdcall;external thelib;
function mysql_get_client_info:PChar;stdcall;external thelib;
function mysql_get_host_info(_mysql:pmysql):PChar;stdcall;external thelib;
function mysql_get_proto_info(_mysql:pmysql):Cardinal;stdcall;external thelib;
function mysql_list_dbs(_mysql:pmysql;wild: pchar):pmysql_res; stdcall;external thelib;
function mysql_list_tables(_mysql: pmysql; const wild: pchar):pmysql_res; stdcall;external thelib;
function mysql_list_fields(_mysql: pmysql;const table,wild: pchar):pmysql_res; stdcall;external thelib;
function mysql_list_processes(_mysql: pmysql):pmysql_res; stdcall;external thelib;
function mysql_store_result(_mysql:pmysql):pmysql_res; stdcall;external thelib;
function mysql_use_result(_mysql:pmysql):pmysql_res;stdcall;external thelib;
procedure mysql_free_result(result:pmysql_res); stdcall;external thelib;
procedure mysql_data_seek(result:pmysql_res; offset:Cardinal); stdcall;external thelib;
function mysql_row_seek(result:pmysql_res; row:mysql_row_offset):mysql_row_offset;stdcall;external thelib;
function mysql_field_seek(result:pmysql_res;offset:mysql_field_offset):mysql_field_offset;stdcall;external thelib;
function mysql_fetch_row(result:pmysql_res):pmysql_row;stdcall;external thelib;
function mysql_fetch_lengths(result:pmysql_res):Cardinal;stdcall;external thelib;
function mysql_fetch_field(handle: pmysql_res):pmysql_field; stdcall;external thelib;

end.


Så noget kode :


unit connect;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, _libmysq;

type
  TForm1 = class(TForm)
    GroupBox1: TGroupBox;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    edtHostname: TEdit;
    edtUsername: TEdit;
    edtPasswd: TEdit;
    edtDatabase: TEdit;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    procedure Button3Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Button1Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  mysqlrec: mysql; //Global mysql struct
  connected: Integer; //Global var to keep track of whether we are connected
implementation

{$R *.DFM}

procedure TForm1.Button3Click(Sender: TObject);
begin
Close;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
    if connected = 1 then
    {Close the Database Connection}
    mysql_close(@mysqlrec);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  host, user, passwd: String;

begin
    host:= edtHostname.Text;
    user:= edtUsername.Text;
    passwd:= edtPasswd.Text;
    {Connect to server}
    mysql_connect(@mysqlrec, PChar(host), PChar(user), PChar(passwd));
    if mysqlrec.status = mysql_status_ready then
    begin
          ShowMessage ('Successfully connected to the Database.');
          connected:= 1; //keep track of connection
          Button2.Enabled:= true;
          Button4.Enabled:= true;
          Button1.Enabled:= false;
    end
    else
        ShowMessage ('Unable to connect to database.');
end;

procedure TForm1.Button4Click(Sender: TObject);
var
  db: String;
  retval: Integer;
begin
    db:= edtDatabase.Text;
    retval:= mysql_select_db(@mysqlrec, PChar(db));
    if retval <> 0 then
        ShowMessage('Error attaching to: ' + db)
    else
        ShowMessage('Successfully attached to ' + db);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
    mysql_close(@mysqlrec);
    ShowMessage('Disconnected from the database.');
    Button1.Enabled:= true;
    Button2.Enabled:= false;
    Button4.Enabled:= false;
    connected:= 0;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
    connected:= 0; //We are not connected to the server
    {Disable the disconnect button till connected}
    Button2.Enabled:= false;
    {Disable the attach to db button till connected}
    Button4.Enabled:= false;
end;

end.

Der er også en dimmer til at connect til en Query


VH
koden12
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester