Create DSN on runtime in D6

opreacatalin
opreacatalin used Ask the Experts™
on
Does anyone know how to create ODBC DSN on runtime in Delphi 6?
Comment
Watch Question

Do more with

Expert Office
EXPERT OFFICE® is a registered trademark of EXPERTS EXCHANGE®

Author

Commented:
It's somehow urgent...
The following site has info on doing it in VB.

http://support.microsoft.com/default.aspx?scid=KB;en-us;q184608

It looks like it's just a matter of setting certain registry values -- not hard to do at runtime.

(If you try this, I'd love to know how it works out, since I'll need to do something similar soon.)
Introduction to R

R is considered the predominant language for data scientist and statisticians. Learn how to use R for your own data science projects.

Commented:
A simple example I seem to re-post regularly is as follows.
For non-MSAccess databases you only need a single call
and can ignore the DBQ stuff.

For future reference, you'd probably get more/better response
in the borland.public.delphi.database.desktop ng. to this sort
of question...


(* NOTE: THIS EXAMPLE IS NOT COMPLETE !!! *)

(*
  This example shows one way to load the ODBC
  Administrator's DLL (ODBCCP32.DLL) to create
  an Access MDB file and ODBC DSN pointing at
  it.  Note that it assumes current directory
  for both the DLL and the MDB, but the DLL
  will be found if in the WinSys directory which
  is where it normally is anyway.

  Similar operation applies to most driver types,
  with some modifications. eg: Access requires
  the MDB file to exist so you can hook the DSN
  to it.

  Note also that the "CREATE_DB" call is an Access
  special (MS Jet Engine) and has other variants
  like COMPACT_DB and REPAIR_DB. For a full list
  see either the Jet Engine Programmers Guide or
  the MSDN and search for "CREATE_DB".

  This was originally written in MSVC6 and was
  ported to Delphi 5.

  Full documentation can be found in the MSDN
  at http://msdn.microsoft.com/.
*)

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

type
  TSQLConfigDataSource = function( hwndParent: HWND;
                                   fRequest: WORD;
                                   lpszDriver: LPCSTR;
                                   lpszAttributes: LPCSTR ) : BOOL; stdcall;


procedure Form1.FormCreate(Sender: TObject);
var
  pFn: TSQLConfigDataSource;
  hLib: LongWord;
  strDriver: string;
  strHome: string;
  strAttr: string;
  strFile: string;
  fResult: BOOL;
  ModName: array[0..MAX_PATH] of Char;
  srInfo : TSearchRec;
  hRegLib: HMODULE;
begin
  Windows.GetModuleFileName( HInstance, ModName, SizeOf(ModName) );
  strHome := ModName;
  while ( strHome[length(strHome)] <> '\' ) do
    Delete( strHome, length(strHome), 1 );
  strFile := strHome + 'TestData.MDB';   // Test Access Rights (Axes =
Access)
  hLib := LoadLibrary( 'ODBCCP32' );    // load from default path
  if( hLib <> NULL ) then
  begin
    @pFn := GetProcAddress( hLib, 'SQLConfigDataSource' );
    if( @pFn <> nil ) then
    begin
      // force (re-)create DSN
      strDriver := 'Microsoft Access Driver (*.mdb)';
      strAttr := Format( 'DSN=TestDSN'+#0+
                         'DBQ=%s'+#0+
                         'Exclusive=1'+#0+
                         'Description=Test Data'+#0+#0,
                         [strFile] );
      fResult := pFn( 0, ODBC_ADD_SYS_DSN, @strDriver[1], @strAttr[1] );
      if( fResult = false ) then ShowMessage( 'Create DSN (Datasource)
failed!' );

      // test/create MDB file associated with DSN
      if( FindFirst( strFile, 0, srInfo ) <> 0 ) then
      begin
        strDriver := 'Microsoft Access Driver (*.mdb)';
        strAttr := Format( 'DSN=TestDSN'+#0+
                           'DBQ=%s'+#0+
                           'Exclusive=1'+#0+
                           'Description=Test Data'+#0+
                           'CREATE_DB="%s"'#0+#0,
                           [strFile,strFile] );
        fResult := pFn( 0, ODBC_ADD_SYS_DSN, @strDriver[1], @strAttr[1] );
        if( fResult = false ) then ShowMessage( 'Create MDB (Database file)
failed!' );
      end;
      FindClose( srInfo );

      end;

    (* MASSIVE SNIP *)

    FreeLibrary( hLib );
  end
  else
  begin
    ShowMessage( 'Unable to load ODBCCP32.DLL' );
  end;
  StatusClockTimer.Enabled := true;
end;


Best Regards

Cesario

Author

Commented:
Thank you very much.

Commented:
Thanx for the Points

Cesario

Do more with

Expert Office
Submit tech questions to Ask the Experts™ at any time to receive solutions, advice, and new ideas from leading industry professionals.

Start 7-Day Free Trial