Connections à différente base de données

Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 - 16 avril 2007 à 12:48
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 - 17 avril 2007 à 11:50
Bonjours


On me demande de me connecté à une base quel que
sois le type de la base (MySQL, Postgres, Oracle, ...) je me demande donc command
faire ça? Sachant que ça ne plais pas que je fasse une classe par type de base (ce que j'avais pensé au départ).
Donc ... Bà je ne sais pas trop command faire.
<!--[if gte vml 1]><v:shapetype
id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t"
path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f">
<v:stroke joinstyle="miter"/>
<v:formulas>
<v:f eqn="if lineDrawn pixelLineWidth 0"/>
<v:f eqn="sum @0 1 0"/>
<v:f eqn="sum 0 0 @1"/>
<v:f eqn="prod @2 1 2"/>
<v:f eqn="prod @3 21600 pixelWidth"/>
<v:f eqn="prod @3 21600 pixelHeight"/>
<v:f eqn="sum @0 0 1"/>
<v:f eqn="prod @6 1 2"/>
<v:f eqn="prod @7 21600 pixelWidth"/>
<v:f eqn="sum @8 21600 0"/>
<v:f eqn="prod @7 21600 pixelHeight"/>
<v:f eqn="sum @10 21600 0"/>
</v:formulas>
<v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/>
<o:lock v:ext="edit" aspectratio="t"/>
</v:shapetype><v:shape id="_x0000_i1025" type="#_x0000_t75" alt="" style='width:11.25pt;
height:11.25pt'>
<v:imagedata src="file:///C:/DOCUME~1/Vincent/LOCALS~1/Temp/msoclip1/01/clip_image001.gif"
o:href="http://www.vbfrance.com/imgs2/smile.gif"/>
</v:shape><![endif]--><!--[if !vml]--><!--[endif]-->
J'ai fini par avoir une idée et je vous la soumet (pour connaître votre avie )
<!--[if gte vml 1]><v:shape id="_x0000_i1026" type="#_x0000_t75"
alt="" style='width:11.25pt;height:11.25pt'>
<v:imagedata src="file:///C:/DOCUME~1/Vincent/LOCALS~1/Temp/msoclip1/01/clip_image002.gif"
o:href="http://www.vbfrance.com/imgs2/smile_big.gif"/>
</v:shape><![endif]--><!--[if !vml]--><!--[endif]-->
Dans un premier temps je récup tout les nom de driver odbc dispo (oui driver
pas connections, je préfère, en faite je ne sais pas pourquoi mais j'ai
toujours fais comme ça)

Je remplie un combo box avec tout ça et demande à mon utilisateur d'en
sélectionné un et de me rentré un login/password.

Je récup alors les nom de base dispo et demande une sélection (heeee, ça je ne
sais pas si c’est possible, se connecté à un serveur sans se connecté à une
base ???)

De là je sais logiquement dialogué avec ma base. (récup de nom de tables, de
champ, type de donnée, …)


Alors 3 Questions :

1) Que pensez vous de cette façon de faire ?

2) Quel type de base de donnée existe t'il (MySQL, SQL Serveur, Postgres,
Oracle, Access, ???) ?

3) Y à t'il des changement avec les requête suivant les base (exemple d'une
requête Postgres : « SELECT "Champ1","Champ2" FROM
"NomSchema"."NomTable" », oui les " sont
important ainsi que le NomSchema, à moins que quel qu’un sache s’en
débarrasser)


Merci




Amicalement

10 réponses

cs_Nicko11 Messages postés 1141 Date d'inscription mercredi 7 mars 2007 Statut Membre Dernière intervention 19 septembre 2007 3
16 avril 2007 à 14:06
Salut Mr Postgres,

je croyais que ton tuteur voulais que Postgres. Donc finalement il change d'avis comme ca.

Pour ma part, je pense que seul la connexions change mais pas les requetes (a confirmer) mais par contre, je comprend pas ton histoire de recuperer les bases dispo. Tu veux dire par la, recherche de nom de base, de type de bases, de l'emplacement des bases ?
0
Big200148 Messages postés 149 Date d'inscription mardi 30 septembre 2003 Statut Membre Dernière intervention 23 juillet 2009
16 avril 2007 à 14:08
utilise le design pattern Abstract Factory
0
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
16 avril 2007 à 15:30
En faite non il veut TOUTE BASE DE DONNEES compatible, il voulais me faire faire des testes sur PostGres, mais j'ai moi aussi les infos au compte goute ce qui me fatigue un peut (même un peut plus ).
Quand je parle de bases dispo c'est en faite le nom de la base par exemple dans postgres (ou MySQL ou même un autre) je peut avoir plussieur base de données donc je pensais récup le nom dze toute les base (ça dois forcément être possible car par exemple "pgAdmin III" le fais pour postgres)
Exemple :

Amicalement
0
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
16 avril 2007 à 15:34
Si les requêtes change mais c'est vrais que à mon avie ce n'est que pour quelque base de données.

Exemple :
Selection dans MySQL : <SELECT * FROM table>
Selection dans Postgres : <SELECT * FROM "schema"."table"> oui les " sont important si non erreur

Amicalement
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
16 avril 2007 à 15:36
Si d'autre subtilité sont à mettre dans la requête
suivant les base pourriez vous me dire les quel je ne pense pas prendre le
temps de vraiment toute les tester.






Amicalement
0
cs_Nicko11 Messages postés 1141 Date d'inscription mercredi 7 mars 2007 Statut Membre Dernière intervention 19 septembre 2007 3
16 avril 2007 à 15:57
Si trop de differences apparaissent, tu devras t'orienter vers un switch case.

Quand tu dis compatible, ok mais avec quoi, VB, le driver choisi, la connexion utilisée. En plus, je vois pas l'intéret car il te faudrait recopier toutes tes bases autant de fois qu'ils existes de types de bases. Ton tuteur veux faire une etude comparative ou il est paranos et veux prevoir toutes les possibilités de bases qui existent.
0
cs_Nicko11 Messages postés 1141 Date d'inscription mercredi 7 mars 2007 Statut Membre Dernière intervention 19 septembre 2007 3
16 avril 2007 à 15:58
En plus, il suffut que ta base devienne securisée (groupe d'utilisateurs) pour que cela change une bonne partie de la Connecting String.
0
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
16 avril 2007 à 16:49
<!--[if gte vml 1]><v:shapetype
id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t"
path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f">
<v:stroke joinstyle="miter"/>
<v:formulas>
<v:f eqn="if lineDrawn pixelLineWidth 0"/>
<v:f eqn="sum @0 1 0"/>
<v:f eqn="sum 0 0 @1"/>
<v:f eqn="prod @2 1 2"/>
<v:f eqn="prod @3 21600 pixelWidth"/>
<v:f eqn="prod @3 21600 pixelHeight"/>
<v:f eqn="sum @0 0 1"/>
<v:f eqn="prod @6 1 2"/>
<v:f eqn="prod @7 21600 pixelWidth"/>
<v:f eqn="sum @8 21600 0"/>
<v:f eqn="prod @7 21600 pixelHeight"/>
<v:f eqn="sum @10 21600 0"/>
</v:formulas>
<v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/>
<o:lock v:ext="edit" aspectratio="t"/>
</v:shapetype><v:shape id="_x0000_i1025" type="#_x0000_t75" alt="" style='width:24pt;
height:24pt'/><![endif]-->
<!--[if !vml]-->
<!--[endif]-->Heeeeeee, en faite je crois qu'il est un peut
parano (houlà, c'est qui connais quand même mon pseudo dans ce form<!--[if gte vml 1]><v:shape
id="_x0000_i1026" type="#_x0000_t75" alt="" style='width:11.25pt;height:11.25pt'>
<v:imagedata src="file:///C:/DOCUME~1/Vincent/LOCALS~1/Temp/msoclip1/01/clip_image002.gif"
o:href="http://www.vbfrance.com/imgs2/smile_blush.gif"/>
</v:shape><![endif]--><!--[if !vml]--><!--[endif]-->, heeee désol si tu lit ça, oui on se tutoie). En ce moment je suis en
train d'écrire un code pour lire dans la base de registre tout les driver odbc
dispo (c'est là : "HKEY_LOCAL_MACHINE/SOFWARE/ODBC/ODBCINST.INI/ODBC Drivers")
ensuite je crée une connections avec un select case. Je teste si la chaîne Postgres
est présente dans mon nom de driver (var NomDriver) et dans ce cas j'ajoute un
nom de schéma (qui faudra que je récup) ou non, et d'autre subtilité au niveau
requête si besoin suivant les bases.


Pourrais tu me dire (Nicko11) ce qui change dans la connecting string dans le
cas d'une base sécurisée.

Ma chaîne de connections c'est ça (pour le moment en tout cas) :

"Driver={" & NomDriver & "};Server=" & Serveur
& ";Port=5432;Database=" & NomBaseDeDonnées &
";UID=" & Login & ";PWD=" & PassWord

Par contre je veux bientôt retirer ça : <Database=" &
NomBaseDeDonnées &> pour récup la liste des bases disponible mais en
faite je ne sais même pas si c'est comme ça que ça marche

Heeeeeee, j'ais également vue qu'il été possible de connecté par provider mais là je n'ai jamais fais de 'truc' dans le genre.
Amicalement
0
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
17 avril 2007 à 11:44
La récup de tout les driver ODBC est faite (très inspiré, même très très inspiré, d'un 'truc'
trouvé sur ce forum mais je ne sais plus où merci quand même). Le code (si ça intéresse quelqu'un) est à la fin de ce post (PS1)


Par contre maintenant c'est la mer-- il ne faux RIEN en dur dans mon programme,
soit :

    1) Le nom des bases dois être récup en code (séléction par l'utilisateur)

    2) Le nom des schémas (pour PostGres et peut être d’autre)
idem

    3) Le nom des tables idem (ça c'est bon, merci Nico11, je le
re-post en PS2)

    4) Le nom et type des champs idem (à mettre en relation avec
des données utilisable par mon prog par ini, l'utilisation n'est pas trop là question pour le momand)



<!--[if !supportEmptyParas]-->







Ma question :


Je n’arrive à rien par rapport au nom de base dispo sur un serveur
quelqu’un à un idée ?


<hr size="2" width="100%" />


PS1 (à collé tout seul dans un module):





Private Declare Function RegOpenKeyEx Lib "advapi32.dll" _

    Alias "RegOpenKeyExA" _

    (ByVal hKey As Long, _

    ByVal lpSubKey As String, _

    ByVal ulOptions As Long, _

    ByVal samDesired As Long, phkResult As Long) As Long


Private Declare Function RegEnumValue Lib "advapi32.dll" _

    Alias "RegEnumValueA" _

    (ByVal hKey As Long, _

    ByVal dwIndex As Long, _

    ByVal lpValueName As String, _

    lpcbValueName As Long, _

    ByVal lpReserved As Long, _

    lpType As Long, _

    lpData As Any, _

    lpcbData As Long) As Long


Private Declare Function RegCloseKey Lib "advapi32.dll" _

    (ByVal hKey As Long) As Long


Private Const HKEY_CLASSES_ROOT = &H80000000

Private Const HKEY_CURRENT_USER = &H80000001

Private Const HKEY_LOCAL_MACHINE = &H80000002

Private Const HKEY_USERS = &H80000003

Private Const ERROR_SUCCESS = 0&

Private Const SYNCHRONIZE = &H100000

Private Const STANDARD_RIGHTS_READ = &H20000

Private Const STANDARD_RIGHTS_WRITE = &H20000

Private Const STANDARD_RIGHTS_EXECUTE = &H20000

Private Const STANDARD_RIGHTS_REQUIRED = &HF0000

Private Const STANDARD_RIGHTS_ALL = &H1F0000

Private Const KEY_QUERY_VALUE = &H1

Private Const KEY_SET_VALUE = &H2

Private Const KEY_CREATE_SUB_KEY = &H4

Private Const KEY_ENUMERATE_SUB_KEYS = &H8

Private Const KEY_NOTIFY = &H10

Private Const KEY_CREATE_LINK = &H20

Private Const KEY_READ = ((STANDARD_RIGHTS_READ Or _

                  KEY_QUERY_VALUE Or _

                  KEY_ENUMERATE_SUB_KEYS Or _

                  KEY_NOTIFY) And _

                  (Not SYNCHRONIZE))


Private Const REG_DWORD = 4

Private Const REG_BINARY = 3

Private Const REG_SZ = 1


Public Function LireDriverODBCDansBaseDeRegistre(ByVal CaracSeparation As String) As String

Dim Tempon As String

Dim lngKeyHandle As Long

Dim lngResult As Long

Dim lngCurIdx As Long

Dim strValue As String

Dim lngValueLen As Long

Dim lngData As Long

Dim lngDataLen As Long

Dim strResult As String


   lngResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, _

           "SOFTWARE\ODBC\ODBCINST.INI\ODBC Drivers", _

            0&, _

            KEY_READ, _

            lngKeyHandle)


   If lngResult <> ERROR_SUCCESS Then

       MsgBox "Cannot open key"

       Exit Function

   End If


   lngCurIdx = 0

   Do

      lngValueLen = 2000

      strValue = String(lngValueLen, 0)

      lngDataLen = 2000


      lngResult = RegEnumValue(lngKeyHandle, _

                               lngCurIdx, _

                               ByVal strValue, _

                               lngValueLen, _

                               0&, _

                               REG_DWORD, _

                               ByVal lngData, _

                               lngDataLen)

      lngCurIdx = lngCurIdx + 1


   If lngResult = ERROR_SUCCESS Then

      strResult = Left(strValue, lngValueLen)

      Tempon Tempon & IIf(Tempon "", "", CaracSeparation) & strResult

   End If


   Loop While lngResult = ERROR_SUCCESS

   Call RegCloseKey(lngKeyHandle)

   LireDriverODBCDansBaseDeRegistre = Tempon

End Function



<hr size="2" width="100%" />


PS2 (ajouté la référance



"Microsoft ADO ext 2.8. for DLL and security"





):





Public Function LieTable(ByRef ma_connexion As ADODB.Connection, ByVal CaracSéparation As String) As String
Dim bdd As New ADOX.Catalog
Dim Tableau As ADOX.Table
Dim Tempon As String
    Set bdd.ActiveConnection = ma_connexion

    For Each Tableau In bdd.Tables       Tempon Tempon & IIf(Tempon "", "", CaracSéparation) & Tableau.Name
    Next
   

LieTable = Tempon



End Function












Amicalement
0
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
17 avril 2007 à 11:50
Heeeeeee, je viens de faire un petit bricolage de
ma fonction LieTable. Un huitième de poile plus rapide. Voilà le code :

<hr size="2" width="100%" />


Public Function LieTable(ByRef ma_connexion As ADODB.Connection, ByVal CaracSéparation As String) As String
Dim bdd As New ADOX.Catalog
Dim Tableau As ADOX.Table
Dim Tempon As String
    Set bdd.ActiveConnection = ma_connexion

    For Each Tableau In bdd.Tables
       Tempon = Tempon & CaracSéparation & Tableau.Name
    Next
    If Tempon <> "" Then
        LieTable = Right(Tempon, Len(Tempon) - Len(CaracSéparation))
    Else
        LieTable = ""
    End If
End Function



<hr size="2" width="100%" />
Amicalement
0
Rejoignez-nous