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.