Autor Beitrag
FBrust
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 30
Erhaltene Danke: 2



BeitragVerfasst: Di 19.11.02 23:15 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1305
Erhaltene Danke: 1

WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
BeitragVerfasst: Do 21.11.02 10:24 
Hi
die eingerichteten Benutzerdatenquellen kannst du aus der Registry lesen unter
ausblenden 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

_________________
Der BH ist für die Brust, der Plan ist für'n Ar...
Cashels
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 167



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 30
Erhaltene Danke: 2



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 29


D5 + D6 Enterprise
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 351

WinXP,Linux
D7 Prof, XE7
BeitragVerfasst: Do 04.11.04 11:54 
Anbei einen Code - Ausschnitt, den ich im Netz gefunden und für mich angepasst habe.

ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 29


D5 + D6 Enterprise
BeitragVerfasst: 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.