ODBC- как создать System DataSource?

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
AnDS
Активист
Сообщения: 119
Зарегистрирован: 03 Ноябрь 2005, 9:32

ODBC- как создать System DataSource?

Сообщение AnDS »

я имею ввиду создание источника данных ODBC в "Панель управления-Администрирование".

Хочется автоматически создавать его из программы.
AnDS
Активист
Сообщения: 119
Зарегистрирован: 03 Ноябрь 2005, 9:32

Сообщение AnDS »

Вот кусок кода из Дельфи:

Код: Выделить всё

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,IniFiles;

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
  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    Button2: TButton;
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
type
    TSQLConfigDataSource = function( hwndParent: HWND;
                                   fRequest: WORD;
                                   lpszDriver: LPCSTR;
                                   lpszAttributes: LPCSTR ) : BOOL; stdcall;



procedure TForm1.Button2Click(Sender: TObject);
begin
        Form1.Close;
end;

procedure TForm1.Button1Click(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;
  MyIniFile: TIniFile;
  Path,Name_odbc,Name_db : String;
  Up_cnt : Integer;
begin

  Getdir(0,Path);
  MyIniFile := TIniFile.Create(Path+'\odbc.ini');
  with MyIniFile do
  begin
       Name_odbc := ReadString('Settings', 'Name_odbc', 'Jopa');
       Up_cnt := StrToInt(ReadString('Settings', 'Up_cnt', '0'));
       Name_db := ReadString('Settings', 'Name_db', 'Jopa');
  end;
  MyIniFile.Free;


  Windows.GetModuleFileName( HInstance, ModName, SizeOf(ModName) );
  strHome := ModName;
//  showMessage(strHome);
  while ( strHome[length(strHome)] <> '\' ) do
    Delete( strHome, length(strHome), 1 );
  if Up_cnt>0 Then
     begin
        While Up_cnt >0 do
           begin
              //поднимаемся на уровень вверх
              strHome := Copy(strHome,1,length(strHome)-1);
              while ( strHome[length(strHome)] <> '\' ) do
                 Delete( strHome, length(strHome), 1 );
              up_cnt := up_cnt - 1;
           end;//while
     End;//if
//    showMessage(strHome);
  strFile := strHome + Name_db;   // Тестовая база данных (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='+Name_odbc+#0+
                         'DBQ=%s'+#0+
                         'Exclusive=1'+#0+
                         'Description='+Name_odbc+#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='+Name_odbc+#0+
                           'DBQ=%s'+#0+
                           'Exclusive=1'+#0+
                           'Description='+Name_odbc+#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;



  Form1.Close;

end;

end.
Вот то же самое, но на Кларионе написать хочется. :-)
Денис
Бывалый
Сообщения: 70
Зарегистрирован: 07 Июль 2005, 5:39
Откуда: Хабаровск
Контактная информация:

Сообщение Денис »

А что тебе непонятно в этом коде ?
AnDS
Активист
Сообщения: 119
Зарегистрирован: 03 Ноябрь 2005, 9:32

Сообщение AnDS »

Денис писал(а):А что тебе непонятно в этом коде ?
Ну, с LoadLibrary я не работал еще.

И еще конвертирование типов паскалевских в формат клариона...

Думал, что может кто уже писал что-то подобное -- использовал бы как пример.
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Сообщение Yufil »

AnDS писал(а):
Денис писал(а):А что тебе непонятно в этом коде ?
Ну, с LoadLibrary я не работал еще.

И еще конвертирование типов паскалевских в формат клариона...

Думал, что может кто уже писал что-то подобное -- использовал бы как пример.
Импортируй для начала этот файл в Словарь и посмотри, как будет выглядеть описание файла в Словаре.

А потом залезь в Help и глянь, что такое Prop:Owner, как он задаётся.
lsgsoftware
Ветеран
Сообщения: 311
Зарегистрирован: 08 Июль 2005, 22:04

Сообщение lsgsoftware »

Для MYSQL это решается очень просто - через примитивный батник, который легко запускается через обычный RUN.
AnDS
Активист
Сообщения: 119
Зарегистрирован: 03 Ноябрь 2005, 9:32

Сообщение AnDS »

Воспользовался вот чем:
!Declarations of WinFadeClassType Classes and Types
!Author: Vadim Sinyavksiy, 2004, vadim@softcreator.com

И вот что получилось:
InsideTheGlobalMap:

Код: Выделить всё

    SQLProcType(UNSIGNED,LONG,ULONG,ULONG),BOOL,PASCAL,TYPE

    SQLCallProcByName(*SQLProcType,UNSIGNED,LONG,ULONG,ULONG),BOOL,PROC,NAME('SQLCallProc')
    MODULE('Dummy Module')
      SQLCallProcByAddr(LONG,UNSIGNED,LONG,ULONG,ULONG),BOOL,PROC,NAME('SQLCallProc')
    END

    MODULE('WinAPI')
      LoadLibrary(LONG),LONG,PASCAL,PROC,NAME('LoadLibraryA')
      FreeLibrary(LONG),SIGNED,PASCAL,PROC
      GetProcAddress(LONG,LONG),LONG,PASCAL
    END


Код: Выделить всё

AutoCreateDSN routine
 data
LOC:cstDLLName   CSTRING(100),AUTO
LOC:cstProcName  CSTRING(100),AUTO
LOC:strDriver    CSTRING(100),AUTO
LOC:strAttr      CSTRING(400),AUTO
LOC:DBName       CSTRING(200),AUTO
loc:DLLInstance  LONG
loc:ProcAddress  LONG
loc:Window       &WINDOW
loc:WindowHandle LONG
 code
  loc:Window &= SYSTEM{PROP:Target}
  loc:WindowHandle = loc:Window{PROP:Handle}
  loc:DBName = 'C:\Work\db1.mdb'
  LOC:cstDLLName = 'ODBCCP32.dll'
  loc:DLLInstance = LoadLibrary(ADDRESS(LOC:cstDLLName))
  IF loc:DLLInstance = 0 THEN EXIT.

  LOC:cstProcName = 'SQLConfigDataSource'
  loc:ProcAddress = GetProcAddress(loc:DLLInstance,ADDRESS(LOC:cstProcName))
  IF loc:ProcAddress <> 0 THEN
    loc:strDriver = 'Microsoft Access Driver (*.mdb)'
    loc:strAttr   = 'DSN=TESTFIRM<0>'&|
                    'DBQ='&clip(loc:DBName)&'<0>'&|
                    'Exclusive=1<0>'&|
                    'Description=TestFirm<0><0>'
    a#=SQLCallProcByAddr(loc:ProcAddress,loc:WindowHandle,ODBC_ADD_SYS_DSN,address(loc:strDriver),address(loc:strAttr))
    if a#=0 then message('Ошибка создания DSN (Datasource) !').
  END
  FreeLibrary(loc:DLLInstance)
AnDS
Активист
Сообщения: 119
Зарегистрирован: 03 Ноябрь 2005, 9:32

Сообщение AnDS »

Если loc:WindowHandle заменить на 0 (Ноль), то окно с интерфейсом не будет открываться.

Так что проблему можно называть решенной.

(Или я где-то ошибся?)
Ответить