Page 1 sur 1

Ouverture db impossible (réseau)

Publié : mer. 05/avr./2017 20:33
par omega
Bonjour à tous,

J'ai 2 pc installés dans le même bureau (un espace de 2 mètres seulement les sépare).

Au niveau du PC N°1:
J'ai un dossier partagé nommé Data qui contient une base de données nommée fiche.db, le lecteur réseau qui désigne ce partage est z:

Au niveau du PC N°2:
J'ai un programme (test.pb) qui devrait utiliser la base de données fiche.db qui se trouve dans le dossier partagé (sur pc1)
Le problème, c'est que je reçois un message d'erreur indiquant que Ouverture impossible de la base data\fiche.db
Notez que le chemin est récupéré sur un fichier texte nommé fpath.txt.

Où se trouve la source de l'erreur ??

Merci de votre aide

Code : Tout sélectionner

Global Chemin$, Database, Query$, Result

If ReadFile(0, "fpath.txt") 
   chemin$=ReadString(0)
   CloseFile(0)
EndIf

UseSQLiteDatabase()

Dbs$ = chemin$ + "\fiche.db"
If Not OpenDatabase(0, Dbs$, "", "")
   MessageRequester("Erreur", "Ouverture " + Dbs$ + " impossible!")
   End
EndIf

Re: Ouverture db impossible (réseau)

Publié : mer. 05/avr./2017 22:25
par Mindphazer
Et si tu essaies d'ouvrir ta base de données avec le chemin réseau complet, sans passer par le contenu de ton fichier "fpath.txt", ça donne quoi ?

Re: Ouverture db impossible (réseau)

Publié : mer. 05/avr./2017 23:16
par case
que dit DatabaseError() ?

Re: Ouverture db impossible (réseau)

Publié : jeu. 06/avr./2017 6:11
par Marc56
Quel type de base de données ?
Si c'est une base SQLite, elle est multi-utilisateurs; mais en mode écriture, c'est la totalité de la base qui est verrouillée le temps de l'écriture et non pas juste l'enregistrement, ou le champs concerné.

PS. Préférer PostgreSQL pour une base réseau multiutilisateurs, on n'est pas lié au partage réseau Windows et PB gère nativement la connexion à cette base (sans passer par ODBC)

:wink:

Re: Ouverture db impossible (réseau)

Publié : jeu. 06/avr./2017 18:18
par omega
Et si tu essaies d'ouvrir ta base de données avec le chemin réseau complet, sans passer par le contenu de ton fichier "fpath.txt", ça donne quoi ?
Normalement, fpath.txt contient z: qui est l'équivalent de : \\MonPc1\Data, je n'ai pas encore essayé d'ouvrir ma base avec le chemin complet du réseau..
que dit DatabaseError() ?
Quelque chose comme : fichier introuvable
Quel type de base de données ?
format Sqlite, nom de la base: fiche.db, chemin complet: \\MonPc1\Data\fiche.db ( \\MonPc1\Data correspond au lecteur réseau z:)

Re: Ouverture db impossible (réseau)

Publié : lun. 10/avr./2017 17:09
par boby
La règle N°1 d'une base SQL : Ca ne s'ouvre QU'EN local !!! Simple question de sécurité de base...

Si ton client doit avoir besoin d'accéder à ta base SQL se trouvant sur un autre PC, cet autre PC est un serveur qui exécutera la requête demandé en local puis enverras le résultat au PC qui le lui a demandé.

Jamais de la vie on se connecte à une base SQL depuis l'extérieur ! (Oui SQLLite le permet mais c'est pas une raison pour le faire !!!)

Re: Ouverture db impossible (réseau)

Publié : lun. 10/avr./2017 17:22
par falsam
Voila un sujet qui as déja abordé en 2014 Omega :wink:

Je t'avais répondu que tu pouvais utiliser une base de données PostgreSQL au lieu de SQLite.

Exemple avec ce code qui va consulter une table jeux et lister le contenu.

Code : Tout sélectionner

UsePostgreSQLDatabase()

Enumeration
  #Database
EndEnumeration

Global ReqSql.s, Buffer.s

;Connection à la base de données PostgreSQL
If OpenDatabase(#Database, "host=postgresql1.alwaysdata.com port=5432 dbname=falsam_bd01", "falsam_01", "purebasicdemo", #PB_Database_PostgreSQL)
  Debug "Connected to PostgreSQL"
  
  ;Execution d'une requête de sélection
  ReqSql="select * from jeux order by annee asc"
  DatabaseQuery(#Database, ReqSql)
  
  ;Affichage du résultat
  If DatabaseQuery(#Database, ReqSql)
    While NextDatabaseRow(#Database)
      Buffer = GetDatabaseString(#Database, 1)              ; Titre du jeu
      Buffer + " (" + GetDatabaseString(#Database, 2)       ; Editeur
      Buffer + " - " + GetDatabaseLong(#Database, 3) + ")"  ;Année 
      
      Debug Buffer
    Wend
  EndIf  
  
  ;Fermeture de la base de données 
  CloseDatabase(#Database)
  
Else
  Debug "Connection failed: "+DatabaseError()
EndIf
Le debug devrait donnes ce résultat.
Connected to PostgreSQL
Duke Nukem (3D Realms - 1991)
Doom (id Software - 1993)
World of Warcraft (Blizzard Entertainment - 1994)
Blood (GT Interactive - 1997)
Age of Empires (Microsoft - 1997)

Re: Ouverture db impossible (réseau)

Publié : lun. 10/avr./2017 20:53
par omega
Pourtant, j'ai déjà utilisé cette même méthode dans d'autres logiciels et ça marche très bien. Bon, il se n'agit pas de lecture-écriture en même temps sur 2 pc différents, non, ces opérations je les gère à ma façon, le problème réside uniquement au niveau de l'ouverture de la base de données qui pourtant marche bien sur mes anciens logiciels...

Je ne comprends pas pourquoi ça ne marche pas aujourd'hui...

Re: Ouverture db impossible (réseau)

Publié : mar. 11/avr./2017 6:14
par Marc56
Partage de dossier simple ou partage client/serveur ?
Est-ce que ça marche sur le PC qui héberge la base ?
Si oui, est-ce que les sécurités ET les permissions sont bien réglées sur le dossier ET le fichier base ?

(Pour les débutants: Sécurités = droits locaux; Permissions = Droits de partages. En réseau les deux doivent correspondre. Ex: si Sécurité: lecture/écriture mais permission: lecture, alors pas de possibilité d'écrite depuis poste client)

Mais, même si en théorie, SQLite en réseau ça peut marcher, c'est hautement déconseillé.

https://sqlite.org/whentouse.html
Client/Server Applications
If there are many client programs sending SQL to the same database over a network, then use a client/server database engine instead of SQLite. SQLite will work over a network filesystem, but because of the latency associated with most network filesystems, performance will not be great. Also, file locking logic is buggy in many network filesystem implementations (on both Unix and Windows). If file locking does not work correctly, two or more clients might try to modify the same part of the same database at the same time, resulting in corruption. Because this problem results from bugs in the underlying filesystem implementation, there is nothing SQLite can do to prevent it.
A good rule of thumb is to avoid using SQLite in situations where the same database will be accessed directly (without an intervening application server) and simultaneously from many computers over a network.


:wink: