Как создать новый DSN из программы?
01.01.2007
type TSQLConfigDataSource = function(hwndParent: Integer; fRequest: Integer; lpszDriverString: string; lpszAttributes: string): Smallint; stdcall; function SQLConfigDataSource(hwndParent: Integer; fRequest: Integer; lpszDriverString: string; lpszAttributes: string): Integer; stdcall; var func: TSQLConfigDataSource; OdbccpHMODULE: HMODULE; begin OdbccpHMODULE := LoadLibrary('c:\WINDOWS\SYSTEM\odbccp32.dll'); if OdbccpHMODULE = 0 then raise Exception.Create(SysErrorMessage(GetLastError)); func := GetProcAddress(OdbccpHMODULE, PChar('SQLConfigDataSource')); if @func = nil then raise Exception.Create('Error Getting adress for SQLConfigDataSource' + SysErrorMessage(GetLastError)); Result := func(hwndParent, fRequest, lpszDriverString, lpszAttributes); FreeLibrary(OdbccpHMODULE); end; procedure TForm1.Button1Click(Sender: TObject); begin if SQLConfigDataSource(0, 1, 'Microsoft Excel Driver (*.xls)', Format('DSN=%s;DBQ=%s;DriverID=790', ['MyDSNName', 'c:\temp\temp.xls'])) <> 1 then ShowMessage('Cannot create ODBC alias'); end;
PS. Ecли вы собираетесь работать с этим DSN через BDE, то надо закрыть и открыть Session, иначе он не будет доступен.
Взято с Vingrad.ru https://forum.vingrad.ru
Этот пример показывает один из способов создания ODBC драйвера для доступа к файлу Access MDB. Подобная операция применима к большинству файлов баз данных. Естевственно, Вам потребуется MDB файл, для того, чтобы связать его с DSN.
const ODBC_ADD_DSN = 1; // Добавляем источник данных ODBC_CONFIG_DSN = 2; // Конфигурируем (редактируем) источник данных ODBC_REMOVE_DSN = 3; // Удаляем источник данных ODBC_ADD_SYS_DSN = 4; // Добавляем системный DSN ODBC_CONFIG_SYS_DSN = 5; // Конфигурируем системный DSN ODBC_REMOVE_SYS_DSN = 6; // удаляем системный 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'; // Тестовая база данных (Axes = Access) hLib := LoadLibrary( 'ODBCCP32' ); // загружаем библиотеку (путь по умолчанию) if( hLib <> NULL ) then begin @pFn := GetProcAddress( hLib, 'SQLConfigDataSource' ); if( @pFn <> nil ) then begin // начинаем создание 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( 'Ошибка создания DSN (Datasource) !' ); // 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( 'Ошибка создания MDB (файла базы данных) !' ); end; FindClose( srInfo ); end; FreeLibrary( hLib ); end else begin ShowMessage( 'Невозможно загрузить ODBCCP32.DLL' ); end; end;
Взято из https://forum.sources.ru