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;
Feliratkozás:
Megjegyzések küldése (Atom)
Nincsenek megjegyzések:
Megjegyzés küldése