2007. október 6., szombat

Create a SystemDSN with Delphi-5


Problem/Question/Abstract:

How to create a ODBC SystemDSN with Delphi?

Answer:

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".

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;
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;

    FreeLibrary(hLib);
  end
  else
  begin
    ShowMessage('Unable to load ODBCCP32.DLL');
  end;
end;

Nincsenek megjegyzések:

Megjegyzés küldése