ODBC- как создать System DataSource?
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
ODBC- как создать System DataSource?
я имею ввиду создание источника данных ODBC в "Панель управления-Администрирование".
Хочется автоматически создавать его из программы.
Хочется автоматически создавать его из программы.
Вот кусок кода из Дельфи:
Вот то же самое, но на Кларионе написать хочется. 
Код: Выделить всё
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.

Импортируй для начала этот файл в Словарь и посмотри, как будет выглядеть описание файла в Словаре.AnDS писал(а):Ну, с LoadLibrary я не работал еще.Денис писал(а):А что тебе непонятно в этом коде ?
И еще конвертирование типов паскалевских в формат клариона...
Думал, что может кто уже писал что-то подобное -- использовал бы как пример.
А потом залезь в Help и глянь, что такое Prop:Owner, как он задаётся.
-
- Ветеран
- Сообщения: 311
- Зарегистрирован: 08 Июль 2005, 22:04
Воспользовался вот чем:
!Declarations of WinFadeClassType Classes and Types
!Author: Vadim Sinyavksiy, 2004, vadim@softcreator.com
И вот что получилось:
InsideTheGlobalMap:
!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)