How to get connect via ODBC and get list of DSN?

I am using ADO right now and I like a way to connect to ODBC database as well.  How would I go about to doing this?  
Also, how can I get a list of DSN?

Examples appreciated.

TIA

K
KhakiAsked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

geobulCommented:
Hi,

Use 'Microsoft OLE DB Provider for ODBC Drivers' in your connection string. The basic connection string looks like:
Provider=MSDASQL.1;Persist Security Info=False;Data Source=dBASE Files
where 'dBASE Files' is your DSN.

Regards, Geo
geobulCommented:
About getting a list of DSN entries from the registry:

User DSN: read subkeys in HKEY_CURRENT_USER\SOFTWARE\ODBC\ODBC.INI
System DSN: read values in HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI\ODBC Data Sources

Regards, Geo
geobulCommented:
One correction:
User DSN: read values in HKEY_CURRENT_USER\SOFTWARE\ODBC\ODBC.INI\ODBC Data Sources

The code is:

type
  TForm1 = class(TForm)
    lbDSN: TListBox;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

uses Registry;

// get list of user and system DSN
procedure DSNList(DSNList: TStrings);
var
  i: integer;
  sl: TStringList;
begin
 sl := TStringList.Create;
 try
  DSNList.Clear;
  with TRegistry.Create do begin
    try
      // System DSN
      RootKey := HKEY_LOCAL_MACHINE;
      if OpenKey('\SOFTWARE\ODBC\ODBC.INI\ODBC Data Sources', False) then begin
        GetValueNames(sl);
        if sl.Count > 0 then begin
          for i := 0 to sl.Count - 1 do begin
            DSNList.Add(sl[i]);
          end;
        end;
      end;
      // User DSN
      sl.Clear;
      RootKey := HKEY_CURRENT_USER;
      if OpenKey('SOFTWARE\ODBC\ODBC.INI\ODBC Data Sources', False) then begin
        GetValueNames(sl);
        if sl.Count > 0 then begin
          for i := 0 to sl.Count - 1 do begin
            DSNList.Add(sl[i]);
          end;
        end;
      end;
    finally
      Free;
    end;
  end;
 finally
   sl.Free;
 end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  DSNList(lbDSN.Items);
end;

end.

Regards, Geo

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
Become a Certified Penetration Testing Engineer

This CPTE Certified Penetration Testing Engineer course covers everything you need to know about becoming a Certified Penetration Testing Engineer. Career Path: Professional roles include Ethical Hackers, Security Consultants, System Administrators, and Chief Security Officers.

geobulCommented:
I forgot to close the keys:

...
    if OpenKey('\SOFTWARE\ODBC\ODBC.INI\ODBC Data Sources', False) then begin
        GetValueNames(sl);
        if sl.Count > 0 then begin
          for i := 0 to sl.Count - 1 do begin
            DSNList.Add(sl[i]);
          end;
        end;
        CloseKey; // add this line here and one for the other key also
      end;

Regards, Geo
TheLeaderCommented:
"geobul" you did not leave a gap in your answer ;)
good work
[not tested, just Mind_Compiler]
wilmsoftCommented:
Give this a try... it  uses DBTables (at least in version 6)


try
  { fill a list box with alias names for the user to select from }
  Session.GetAliasNames(ComboBox1.Items);
except
exit;
end;//try.. execept
KhakiAuthor Commented:
geobul and all,
 Thanks to all who answer.  I am just going to test out the answer first.

K
geobulCommented:
Thank you TheLeader :-)

wilmsoft,
TSession requires BDE to be installed and working ! Khaki is using ADO (i.e. no BDE), so that will not be a desired solution I think.

Regards, Geo
wilmsoftCommented:
I guess I miss understood the question... I thought he DIDN'T want to use the ADO....

SO, here is how you do connect to a list of DSN via ODBC using the ADO.

try
ADOConnection1.ConnectionString := PromptDataSource(Handle, Edit1.Text);
ADOConnection1.GetTableNames(Listbox1.Items,false);
execpt
end;
KhakiAuthor Commented:
Thanks!
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Delphi

From novice to tech pro — start learning today.