Am creat o baza de date "testremote" in Firebird cu IB Expert si acum as vrea sa ma conectez prin internet la ea . Ce string de conectare trebuie sa folosesc? Ma poate ajuta cineva ?
Am pe server ip 82.79.123.218, user "SYSDBA" si parola "masterkey".Am atasat si un printscreen-ul cu iregistrarea bazei de date
Multumesc
lcConnectionString="DRIVER=Firebird/InterBase(r) driver;UID=SYSDBA;PWD=masterkey;DBNAME= 82.79.123.218:testremote.fdb"
Nu trebuia la DBNAME pusa toata calea ? Adica "DBNAME= 82.79.123.218:C:\DBFirebird\testremote.fdb" ?
O sa incerc si eu
Am incercat :
DBNAME= 82.79.123.218:testremote.fdb
DBNAME= 82.79.123.218:C:\testremote.fdb
DBNAME= 82.79.123.218:C:\DBFirebird\testremote.fdb
DBNAME= 82.79.123.218:C\DBFirebird\testremote.fdb
Nu ma pot conecta !
Calea bazei de date este "C:\dbfirebird\testremote.fdb" iar tabla se numeste "tabelaremote"
E posibile sa nu fi creat eu baza de date corect? Ma gandesc ca daca am inregistrat-o si am creat si o tabela este ok. Ce parere aveti ?
Am creat baza de date pe server cu IBExpert si am inregistrat-o cum se vede in atasament (parola "masterkey")
Am dezactivat firewall-ul si de pe server si de pe client, la fel si antivirus-ul
Am adaugat in aliases.comf : testremote = c:\dbfirebird\testremote.fdb
De pe client, din fereastra de comenzi aVFP am rulat :
lcConnectionString="DRIVER=Firebird/InterBase(r) driver;UID=SYSDBA;PWD=masterkey;DBNAME=82.79.123.218:testremote"nConnectionHandle = SQLStringConnect(lcConnectionString, .T.)?nConnectionHandle = -1
Am instalat pe client IBExpert si am incercat sa ma conectez la baza de date testremote.fdb de pe server.
Rezultatul pt DB Conection l-am atasat ca nu stiu cum sa ma exprim
Rezultatul pt TCP/IP este cel atasat, dar era normal sa mearga (zic eu) pentru ca am dezactivat si antivirus-ul si firewall-ul de pe ambele calculatoare.
Mentionez ca si la server si la client am Ip-ri publice.
O alta propunere, daca vrei conectare directa, este sa folosesti ZeBeDee ca tunel de comprimare/encriptare a traficuluiE foarte simplu de folosit ( trebuie deschis portul 11965 la firewall )Pe server : zebedee -s localhost:3050Pe client : zebedee 3051:82.79.123.218:3050Conectare : ...DBNAME:localhost/3051:testremote...Lucrul prin tunel comprimat cu ZeBeDee e de preferat, creste si viteza ( comprima cam de 5-8 ori ) si siguranta traficului (nu se pot analiza pachetele pentru parole, date, etc )
Dorin dupa ce ma conectez in varianta clasica(normala), o sa testez si aceasta propunere! Ca idee, acest tunel pe care il creaza ZeBeDee, blocheaza accesul la internet ca si VPN-ul ?
Am reusit Dorine ! Multumesc !
Am luat de pe server acel fisier fbclient.dll din bin si l-am copiat pe calculatorul client. L-am selectat de la "Client Library File " cum mi-ai zis si am reusit sa ma conectez de pe client cu IBExpert ! Mergem mai departe .
Acum am reusit si din ODBC sa ma conectez, dupa ce am adaugat la Client fbclient.dll !
Acum mai ramane sa ma conectez din VFP
Multumesc !
Am reinstalat Serverul Firebird si am vazut ca era implicit bifat "Generate client library as GDS32.DLL for legacy app. Suport ?" L-am lasat bifat si dupa instalare am testat conexiunea de pe client. Mesajul a fost acelas "Client Library is mising or invalid. gds32.dll". Daca din client selectez eu fbclient.dll (fisier pe care l-am copiat de pe server) se conecteaza.
Oricum, asta ma intereseaza mai putin deocamdata. Pe mine ma preseaza conectarea din VFP! Poate ma ajutati cu un exemplu daca aveti timp !
Serverul este online non-stop
Revin ca nu mai am rabdare ...cu un test de conectare
Daca pe server execut, din fereastra de comenzi a VFP, urmatoarea comandda
lcConnectionString="DRIVER=Firebird/InterBase(r) driver;UID=SYSDBA;PWD=masterkey;DBNAME=82.79.123.218:testremote"nConnectionHandle = SQLStringConnect(lcConnectionString, .T.)?nConnectionHandle && = 1
Daca incerc aceeasi comanda, de data asta de pe client, tot din VFP, rezultatul este ?nConnectionHandle && = -1
Mentionez, ca de pe client ma pot conecta cu IBExpert dar si din ODBC, dupa cum se vede in atasament, numai din fox nu reusesc :(
In speranta ca nu v-am disperat deja :)
Va multumesc anticipat
Am copiat pe client, in windows\system32 si in folderul cu aplicatia, fisierul "fbclient.dll".
lcConnectionString="DRIVER=Firebird/InterBase(r) driver;UID=SYSDBA;PWD=masterkey;DBNAME=82.79.123.218:testremote"
nConnectionHandle=SQLStringConnect(lcConnectionString, .T.)
?nConnectionHandle = -1, iar eroarea este cea atasata
Am dezactivat de mult firewall-ul de pe ambele calculatoare
Vezi sa nu fie active 2 ( si cel de le XP )
Asta ce mai inseamna ?
La mine pe client Telnet-ul nu zice nimic ! Ramane doar cursorul.
As reinstala si windows-ul si VFP-ul, dar ma enerveaza ca din odbc si din IBExpert ma pot conecta la server, de unde deduc ca windows-ul nu ar avea probleme (poate ma insel). Sa reinstalez VFP 9.0 ? Ce ma sfatuiti ?
V-as fi anuntat mai devreme dar nu am putut sa accesez site-ul cateva zile! In fine ! Problema este de undeva din fox !
Am reusit sa ma conectez numai daca am creat un executabil ! Tot ce incerc din fereastra de comenzi nu merge, insa nu ma mai intereseaza...sper sa se rezolve dupa ce reinstalez VFP !
Va multumesc mult !
Acum ca am reusit sa fac conexiunea :) ...incepe "distractia" !
Doar doua intrebari daca se poate:
1. Am vazut ca programatorii cu experienta, creaza un camp Primary Key cu Autoincrement - la ce foloseste ?
2. Cum selectez tabela, pentru ca modificarile facute in Grid-ul dintr-un form, sa se reflecte si pe server ? Cursorsetprop?
Va multumesc mult si urati-mi spror la treaba :)
cursor adapter care are SendUpdates=.T. si modificarile se vor duce pe server
Ma puteti ajuta cu un mic exeplu ?
Se poate crea un nou USER(cum este SYSDBA) din fox ?
Eu as merge pe varianta pe care ai folosit-o tu - o singura procedura (in cazul meu este o clasa), care expune o metoda care face trimiterea comenzilor sql. Din form-uri apelez metoda aia, trimitandu-i ca parametru sintaxa sql.
Lucrurile se pot imbunatati aici: nu trimit SINTAXA, ci DENUMIREA instructiunii sql. Concret, intr-o tabela sunt trecute denumirile comenzilor si sintaxele lor. De exemplu "ListaClienti" si "Select * From Clienti". La initializarea aplicatiei, tabela aia e incarcata intr-o colectie (sau array, daca-ti place mai mult), iar metoda care face trimiterea comenzilor sql primeste ca parametru nu codul sql in clar, ci denumirea comenzii. Cauta codul in array si-l trimite pe ala. Chestia asta te ajuta sa modifici sintaxa unei instructiuni, pentru ca o modifici in tabela si cu asta basta - aplicatia habar n-are. Ea trimite denumire comenzii, care nu se modifica.
In alta ordine de idei: proprietatea class a unui obiect este readonly in design si in runtime (e documentat in help). Ca sa faci un form bazat pe o clasa form de-a ta, ai doua variante (eu personal o folosesc pe prima):
#1. Create Form MyForm As MyFormClass From MyClassLibrary
#2. Creezi formul ca de obicei, il salvezi, apoi deschizi class browserul, open, selectezi Form la File of type, cauti formul tau pe disc, il deschizi, in arborele din stanga click cu dreapta pe form / redefine / cauti clasa ta pe disc / ok.
N-am inteles, sincer. De ce sa fie util pentru SELECT si inutil pentru INSERT? pai cand adaugi un camp nou in SELECT trebuie sa pui si un texbox in interfata, ca sa arati valoarea campului. Deci... este exact aceeasi situatie. Iar instructiunea SQL (fie ea select, insert sau update) o modifici intr-un singur loc, in tabela aia de care ziceam. Sa nu uitam ca inserarea unei inregistrari intr-o tabela se poate face in mai multe locuri in program, si ca sa nu scrii codul SQL peste tot (si sa fii nevoit sa-l corectezi peste tot), il stochezi in tabela si-l corectezi acolo.
Nu e adevarat - ar trebui sa mearga si cu ?pMnemonica in loc de ?p2. Verifica-ti codul (daca imediat inainte de insert variabilele alea exista si au valori, si da cu AERROR() ca sa vezi ce eroare iti returneaza comanda INSERT. Problema nu e de la lungimile denumirilor de variabile. In plus, sugestia mea este sa nu folosesti ?thisform.txtDenumire.Value in insert, ci o variabila, exact ca in exemplul tau de mai sus, ala cu ?pMnemonica.
Problema e ca prin ODBC nu ai posibilitatea de control ca si la conexiuni care utilizeaza API Poti la conectare sa specifici parametri respectivi SQLStringConnect("DSN= ... ;ReadOnly=Y;NoWait=Y") Cel mai sigur e sa pui Nowait=Y (au corectat driverul ODBC pentru 2.1 , versiunea .148, nu mai da eroare ) tranzactii automate pentru cele la care vrei read tranzactii manuale pentru cele la care vrei sa faci update pe mai ,multe tabele.
Functioneaza foarte bine.
SET|DECLARE TRANSACTION [LOCAL] [NAME transaction [USING nameUniqueWorkspace]] [READ WRITE | READ ONLY] [WAIT | NO WAIT] [AUTOCOMMIT] [NO_AUTO_UNDO] [[ISOLATION LEVEL] {SNAPSHOT [TABLE STABILITY] or REPEATABLE READ | SERIALIZABLE | READ COMMITTED [[NO] RECORD_VERSION]}] [RESERVING ]; = table [, table :] [FOR [SHARED | PROTECTED] {READ | WRITE}] [, ]