powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Как программно удалить системный DSN?
6 сообщений из 6, страница 1 из 1
Как программно удалить системный DSN?
    #32401497
deth2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.
Вообще я знаю, что для этого нужно использовать функцию SQLConfigDataSource с параметром SQL_REMOVE_SYSTEM_DSN(вроде так). В любом случае второй параметр функции должен быть равен 6.
Но у меня не получается этого сделать. Уважаемые мастера в чём проблема?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
unit sysdsn;

interface
uses
   SysUtils, Variants,forms, Classes,ADODB, DB, DBTables, windows, utils,dialogs;

Type
TProcSQLInstallerError = function( iError : WORD;var pfErrorCode: DWORD;lpszErrorMsg : pchar;
                                   cbErrorMsgMax : DWORD; var pcbErrorMsg : WORD) : WORD;stdcall;
TProcSQLConfigDataSource = function(hwndParent: HWND;
                                    fRequest: WORD; lpszDriver: PChar;
                                    lpszAttributes: PChar): BOOL; stdcall;
TSystemDSN = class
  public
  function CreateSystemDSN(APathToDataBase : string;
                                    AName : string;
                                    ADescription : string) : boolean;
  function DestroySystemDSN(AName : string; APathToDataBase : string;ADescription : string) : boolean;
end;

implementation
function TSystemDSN.CreateSystemDSN(APathToDataBase : string;
                                    AName : string;
                                    ADescription : string) : boolean;

var
  ODBCLibHandle : THandle;
  ProcedureAddress : pointer;
  Success : boolean;
begin
  Result := False;
  ODBCLibHandle := LoadLibrary('ODBCCP32.DLL');
  if BOOL(ODBCLibHandle) then begin
    ProcedureAddress := GetProcAddress(ODBCLibHandle, 'SQLConfigDataSource');
    if (BOOL(ProcedureAddress)) then begin
      Success := TProcSQLConfigDataSource(ProcedureAddress)(
           0 ,  4 ,'Microsoft Access Driver (*.mdb)',PChar(
          'DSN='+AName+# 0  +
          'DESCRIPTION='+ADescription+# 0  +
          'DBQ=' + APathToDataBase + # 0 # 0 ));
      if Success then begin
        Result := True;
        FreeLibrary(ODBCLibHandle);
      end;
    end;
  end;
end;
function TSystemDSN.DestroySystemDSN(AName : string; APathToDataBase : string;ADescription : string) : boolean;
var
  ODBCLibHandle : THandle;
  ProcedureAddress : pointer;
  Success : boolean;
  errmsg : array[ 0 .. 1000 ] of char;
begin
  Result := False;
  ODBCLibHandle := LoadLibrary('ODBCCP32.DLL');
  if BOOL(ODBCLibHandle) then begin
    ProcedureAddress := GetProcAddress(ODBCLibHandle, 'SQLConfigDataSource');
    if (BOOL(ProcedureAddress)) then begin
      Success := TProcSQLConfigDataSource(ProcedureAddress)(
           0 ,  6 ,'Microsoft Access Driver (*.mdb)',PChar(
          'Exclusive=1'# 0 +
          'DSN='+AName+# 0 # 0 ));
      //ProcedureAddress := GetProcAddress(ODBCLibHandle, 'SQLInstallerError')
      //TProcSQLInstallerError(ProcedureAddress)(
      if Success then begin
        Result := True;
        FreeLibrary(ODBCLibHandle);
      end;
    end;
  end;
end;
end.
...
Рейтинг: 0 / 0
Как программно удалить системный DSN?
    #32403006
Zmiter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я конечно не в курсе твоей программы, которая вроде на Дельфи, к которому плохо отношусь, но System DSN в реестре находиться здесь HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI

Получаешь массив DSN-ов с помощью функции чтения ключа реестра(как она у тебя там наз-ся), находишь нужный и удаляешь.
...
Рейтинг: 0 / 0
Как программно удалить системный DSN?
    #32403250
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сам не пробовал, но есть такая тема

--------------------------------------------------------------------------------

Создаём SystemDSN при помощи Delphi 5.
Автор: Olivio Moura

Совместимость: Delphi 5 (или выше)

Этот пример показывает один из способов создания ODBC драйвера для доступа к файлу Access MDB. Подобная операция применима к большинству файлов баз данных. Естевственно, Вам потребуется MDB файл, для того, чтобы связать его с DSN.

Далее следует сам пример:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
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;
...
Рейтинг: 0 / 0
Как программно удалить системный DSN?
    #32403323
Ой Вэй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что не так?
Не транслируется, не линкуется, не грузит функцию/библиотеку, вылет при вызове функции, функция возвращает 0 (тогда что возвращает SQLInstallerError()), вылет, DSN не удаляется?
...
Рейтинг: 0 / 0
Как программно удалить системный DSN?
    #32403479
deth2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, возвращает 0 и DSN не удаляется!
...
Рейтинг: 0 / 0
Как программно удалить системный DSN?
    #32404012
Ой Вэй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MSDN:
When SQLConfigDataSource returns FALSE, an associated *pfErrorCode value can be obtained by calling SQLInstallerError.

Что даёт SQLInstallerError()?
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Как программно удалить системный DSN?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]