Entwickler-Ecke
Datenbanken - ODBC-Datenquelle automatisch anlegen
FBrust - Di 19.11.02 23:15
Titel: ODBC-Datenquelle automatisch anlegen
Hallo,
mein Programm benötigt eine ODBC-Datenquelle, die eingerichtet sein muss, bevor der Anwender bestimmte Funktionen aufruft.
Nun möchte ich, dass mein Programm
a) prüft, ob diese Quelle exisitert und sie
b) anlegt, falls sie nicht vorhanden ist.
Ich weiss zwar, wie man einen "normalen" BDE-Alias anlegt, aber bei einer ODBC-Quelle weiss ich nicht weiter.
Ich bin auf den Begriff "SqlConfigDataSource" gestossen, finde aber in der Delphi-Hilfe (5 Professional) nichts darüber.
Hat vielleicht jemand einen Tip?
Grüsse
Frank
LCS - Do 21.11.02 10:24
Hi
die eingerichteten Benutzerdatenquellen kannst du aus der Registry lesen unter
Quelltext
1:
| HKEY_CURRENT_USER/Software/ODBC/ODBC.INI-ODBC Data Sources |
Wenn die Datenquelle nicht vorhanden ist, könntest du an dieser Stelle einfach einen neuen Eintrag schreiben und den ensprechenden SubKey mit den notwendigen Daten erzeugen.
Ich hab das mal in einem Programm so gemacht und hat einwandfrei funktioniert.
Gruss Lothar
Cashels - Do 21.11.02 10:52
Hallo,
wie Lothar bereits geschrieben sind werden saemtliche ODBC Datenquellen in der Registry vorgenommen.
@Frank: Solltest du eine Access Datenquelle anlegen wollen, so kann ich dir ne Komponente dazu mailen, die genau diese Einstellungen in der Registry vornimmt.
Gruss,
tom
FBrust - Do 21.11.02 16:23
Hallo Tom,
das wäre super, denn es ist tatsächlich eine Access-Datenquelle, die ich anlegen möchte.
Meine Mailadresse lautet
frank.brust@t-online.de
Vielen Dank im Voraus
Frank
thomasoop - Do 04.11.04 09:55
habe von frank die komponente bekommen
ein Arbeitskollege hat sie gleich unter XP getestet und sich prompt was zerschossen
ich hatte aber vorher die NTRegistry durch Registry ersetzt (unter XP sollte das egal sein)
er hat über die K. einen ODBC eintrag angelegt
der eintrag wurde zwar korrekt in der registry angelegt, wurde aber nicht in der ODBC Umgebung angezeigt
mein kollege hat nun den eintrag manuell aus der registry entfernt (waren ja nur 2 stellen die man im quellcode der K. leicht herauslesen konnte)
nun hat er das problem das, wenn er manuell eine ODBC verbindung anlegen will und den access treiber ausgewählt hat, kein fenster kommt in welchem man die detailinformationen (mdb usw) angeben kann
nach auswahl eines access treibers 'springt' er ohne fehlermeldung raus und nichts wird angelegt
kennt einer das problem?
liegt es an XP?
oder muss man die TNTRegistry verwenden?(man musste die doch nur unter NT verwenden weil es ein Berechtigungsproblem gab, oder nicht?)
gruss
Thomas
KidPaddle - Do 04.11.04 11:54
Anbei einen Code - Ausschnitt, den ich im Netz gefunden und für mich angepasst habe.
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81:
| const ODBC_ADD_DSN = 1; // Add data source ODBC_CONFIG_DSN = 2; // Configure (edit) data source ODBC_REMOVE_DSN = 3; // Remove data source ODBC_ADD_SYS_DSN = 4; // add a system DSN ODBC_CONFIG_SYS_DSN = 5; // Configure a system DSN ODBC_REMOVE_SYS_DSN = 6; // remove a system DSN
cDSNTemplate = 'DSN=BSDEMO' + #0 + 'DBQ=%s' + #0 + 'Exclusive=1' + #0 +'Description=Test Data' + #0 + #0;
type TSQLConfigDataSource = function(hwndParent : HWND; fRequest : WORD; lpszDriver : LPCSTR; lpszAttributes : LPCSTR ) : BOOL; stdcall;
procedure CreateDSN(const aRootDir : String); var pFn : TSQLConfigDataSource; hLib : LongWord; sDriver : String; sAttr : String; sFile : String; bResult : BOOL; begin sFile := aRootDir + 'db\bsdemo.mdb'; // Test Access Rights (Axes = Access) hLib := LoadLibrary('ODBCCP32'); // load from default path if( hLib <> 0) then begin try @pFn := GetProcAddress(hLib, 'SQLConfigDataSource'); if( @pFn <> nil) then begin // Erstelle den Datenquellennamen sDriver := 'Microsoft Access Driver (*.mdb)'; sAttr := Format(cDSNTemplate, [sFile]); bResult := pFn(0, ODBC_ADD_DSN, @sDriver[1], @sAttr[1]); if (not bResult) then begin raise Exception.Create('Create DSN (Datasource) failed!'); end; end else begin raise Exception.Create('Create DSN (Datasource) failed!'); end; finally FreeLibrary( hLib ); end; end else begin raise Exception.Create('Unable to load ODBCCP32.DLL'); end; end;
procedure DeleteDSN(const aRootDir : String); var pFn : TSQLConfigDataSource; hLib : LongWord; sDriver : String; sAttr : String; sFile : String; bResult : BOOL; begin sFile := aRootDir + 'db\bsdemo.mdb'; // Test Access Rights (Axes = Access) hLib := LoadLibrary('ODBCCP32'); // load from default path if( hLib <> 0) then begin try @pFn := GetProcAddress(hLib, 'SQLConfigDataSource'); if( @pFn <> nil) then begin // Erstelle den Datenquellennamen sDriver := 'Microsoft Access Driver (*.mdb)'; sAttr := Format(cDSNTemplate, [sFile]); bResult := pFn(0, ODBC_REMOVE_DSN, @sDriver[1], @sAttr[1]); if (not bResult) then begin raise Exception.Create('Create DSN (Datasource) failed!'); end; end else begin raise Exception.Create('Create DSN (Datasource) failed!'); end; finally FreeLibrary( hLib ); end; end else begin raise Exception.Create('Unable to load ODBCCP32.DLL'); end; end; |
Da bei meiner Problemstellung der DB - Name fest ist, über geben ich nur einen Pfad zu dieser Datei und richte dynamische den DNS Eintrag ein und lösche diesen beim beenden des Programmes.
Gruß
KidPaddle
thomasoop - Do 04.11.04 13:02
Hab gerade die Komponente unter W2K getestet und da geht es einwandfrei.
Will nicht ausschliessen das ein Windows Update da etwas kaputt gemacht hat.
Suche mir jetzt einen WindowsXP Testrechner wo ichs nochmal testen kann.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!