//*************************************************** //目的:读取驱动程序位置 //参数:AName--要读取的数据库驱动类型的标志(自己可以任意定制) //*************************************************** Function ReadODBCDriver(AName: String):String; var registerTemp: TRegistry; s:string; begin registerTemp:=TRegistry.Create; if AName='Access' then begin with registerTemp do begin RootKey:=HKEY_LOCAL_MACHINE; if OpenKey('Software\ODBC\ODBCINST.INI\Microsoft Access Driver (*.mdb)',True) then begin s:=ReadString('Driver'); ReadODBCDriver:=ReadString('Driver'); CloseKey; Free; Exit; end; end; end; registerTemp.Free; ReadODBCDriver:=''; end;//**************************************************** //目的:建立数据库驱动程序并配置 //参数:AName--要建立的ODBC数据库别名 // APath--要连接的数据库路径名称 // ADriver--ODBC驱动名称,由系统获取 //**************************************************** Function CreateMsAccess(AName: String; APath: String; ADriver: String):Boolean; var registerTemp:TRegistry; bData:array[0..0] of byte; begin if ADriver='' then begin //ShowMessage('读取ODBC驱动程序失败,请重新安装ODBC!'); CreateMsAccess:=False; Exit; end;
registerTemp:=TRegistry.Create; CreateMsAccess:=True; with registerTemp do begin RootKey:=HKEY_LOCAL_MACHINE; if OpenKey('Software\ODBC\ODBC.INI\ODBC Data Sources',True) then begin //注册一个DSN名称--AName WriteString(AName,'Microsoft Access Driver (*.mdb)'); end else begin CreateMsAccess:=False; Exit; end; CloseKey;
//写入DSN配置信息 if OpenKey('Software\ODBC\ODBC.INI\'+AName,True) then begin //数据库目录,连接你的数据库 WriteString('DBQ',APath);
bData[0]:=0; //非独占方式 WriteBinaryData('Exclusive',bData,1); //非只读方式 WriteBinaryData('ReadOnly',bData,1); end else begin CreateMsAccess:=False; Exit; end; CloseKey;
//写入DSN数据库引擎配置信息 if OpenKey('Software\ODBC\ODBC.INI\'+AName+'\Engines\Jet',True) then begin WriteString('ImplicitCommitSync','Yes'); //缓冲区大小 WriteInteger('MaxBufferSize',512); //页超时 WriteInteger('PageTimeout',10); //支持的线程数目 WriteInteger('Threads',3);
WriteString('UserCommitSync','Yes'); end else begin CreateMsAccess:=False; Exit; end; CloseKey; Free; end; end;
修改注册表可以
本文以access为例
需要文件 odbcinst.h(bcb或vc的include目录) odbccp32.dll(winnt\system32\目录) implib.exe(通过dll生成lib库) coff2omf.exe (将coff库转化为omf库)首先将上面文件拷贝到工程目录,
执行下面命令:
implib.exe odbccp32.lib odbccp32.dll
coff2omf Odbccp32.lib下面程序的功能为当应用程序启动时,动态添加/修改一个指向当前目录的,名为test的系 统数据源。
新建一个工程,在工程主文件(含有winmain函数)中添加
#include <odbcinst.h>
USELIB("odbccp32.lib");//lib在工程当前目录修改后的代码如下;
file://---------------------------------------------------------------------------#include <vcl.h>
#include <odbcinst.h>#pragma hdrstop
USEFORM("main.cpp", Form1);
file://工程的其他单元申明.....
USELIB("odbccp32.lib");
file://---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{Application->Initialize();
AnsiString Data,DataPath,dbpath;
unsigned char temp[255];//接收转化后的连接字符串
LPSTR ch;//字符串指针相当于char *
DataPath=GetCurrentDir();//获取当前目录
Data=DataPath+"\\test.mdb\b";//假定当前数据库为test.mdb
dbpath="DSN=test\bDBQ="+Data+"DEFAULTDIR="+DataPath+"\b\b";
file://构造odbc连接字符串,test为数据源名,非法字符先用\b代替ch=dbpath.c_str();//将AnsiString转化为字符串
int i=0;
while(*ch!='\0')//查找并替换非法字符,并装入字符数组
{if(*ch=='\b')
*ch='\0';
temp[i]=*ch;
ch++;
i++;
}
if(::SQLConfigDataSource(NULL,ODBC_ADD_SYS_DSN,(LPSTR)"Microsoft Access Driver (*.mdb)\0",(LPSTR)temp))//修改或添加数据源,如果成功,程序正常启动
{Application->Title = "动态设定odbc数据源";Application->CreateForm(__classid(TForm1), &Form1);Application->Run();
}
else
{
ShowMessage("数据库设定失败!");
Application->Terminate();
}
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
return 0;
}
file://---------------------------------------------------------------------------
SQLConfigDataSource(NULL,ODBC_ADD_SYS_DSN,(LPSTR) 配置ODBC
var
Reg : TRegistry;
SysDir : PChar;
SystemDir : String;
AppDir : String;
begin
Reg := TRegistry.Create;
with Reg do
begin
Try
GetMem(SysDir,255);
GetSystemDirectory(SysDir,255);
SystemDir := String(SysDir);
FreeMem(SysDir);
AppDir := ExtractFilePath(Application.ExeName);
RootKey:=HKEY_LOCAL_MACHINE;
if OpenKey('Software\ODBC\ODBC.INI\ODBC Data Sources',True) then
WriteString( 'Cpic', 'Microsoft Access Driver (*.mdb)' );
CloseKey;
if OpenKey('Software\ODBC\ODBC.INI\Cpic',True) then
begin
WriteString( 'DBQ', AppDir + 'DataBase\CPIC.MDB' );
WriteString( 'Driver', SystemDir + '\odbcjt32.dll' );
WriteInteger( 'DriverId', 25 );
WriteString( 'FIL', 'Ms Access;' );
WriteInteger( 'SafeTransaction', 0 );
WriteString( 'UID', '' );
end;
CloseKey;
if OpenKey('Software\ODBC\ODBC.INI\Cpic\Engines\Jet',True) then
begin
WriteString( 'ImplicitCommitSync', '' );
WriteInteger( 'MaxBufferSize', 2048 );
WriteInteger( 'PageTimeout', 5 );
WriteInteger( 'Threads', 3 );
WriteString( 'UserCommitSync', 'Yes' );
end;
CloseKey;
Free;
except
Application.MessageBox('系统初始化失败!','提示',0+64);
CloseKey;
Free;
exit;
end;
end;
end;
regedit /s ODBC_9x.reg
procedure TFrmSet.SpeedButton4Click(Sender: TObject);
var ODBC_1,ODBC_2:Tregistry;
begin
if Trim(Edit3.Text)='' then
begin
Application.MessageBox('ODBC名称不能为空值,请重新填写!','提示',MB_OK+MB_IConinformation);
Exit;
end;
if Trim(Edit4.Text)='' then
begin
Application.MessageBox('请确定Fox文件所在的位置!','提示',MB_OK+MB_IConinformation);
Exit;
end;
try
ODBC_1:=Tregistry.Create;
ODBC_1.RootKey:=HKEY_LOCAL_MACHINE;
ODBC_1.CreateKey('Software\ODBC\ODBC.INI\'+Trim(edit3.Text));
ODBC_1.OpenKey('Software\ODBC\ODBC.INI\'+Trim(edit3.Text),false);
ODBC_1.WriteString('Backgroundfetch','Yes');
ODBC_1.WriteString('Collate','Machine');
ODBC_1.WriteString('Deleted','yes');
ODBC_1.WriteString('Description','');
ODBC_1.WriteString('Driver','C:\WiNNT\SYStems32\vfpodbc.dll');
ODBC_1.WriteString('Exclusive','NO');
ODBC_1.WriteString('NULL','Yes');
ODBC_1.WriteString('SetNoCountOn','NO');
ODBC_1.WriteString('SourceDB',Trim(ExtractFileDir(Edit4.Text)));
ODBC_1.WriteString('SourceType','DBF');
ODBC_2:=Tregistry.Create;
ODBC_2.RootKey:=HKEY_LOCAL_MACHINE;
ODBC_2.OpenKey('Software\ODBC\ODBC.INI\ODBC Data Sources',true);
ODBC_2.WriteString(Trim(Edit3.Text),'Microsoft FoxPro VFP Driver (*.dbf)');
Application.MessageBox('配置ODBC成功!','提示',MB_OK+MB_Iconinformation);
except
Application.MessageBox('配置ODBC出现错误,请重新配置!','提示',MB_OK+MB_Iconerror);
Exit;
end;
end;
一个简单的例子
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;
// strfile:=extractfilepath(application.ExeName)+'2002.dbf';
strfile:=extractfileDIR(application.ExeName); self.Caption:=strfile;
hLib := LoadLibrary( 'ODBCCP32' );
if( hLib <> NULL ) then
begin
@pFn := GetProcAddress( hLib, 'SQLConfigDataSource' );
if( @pFn <> nil ) then
begin
messagebox(handle,'test','succ',mb_ok);
strDriver := 'Microsoft FoxPro VFP Driver (*.dbf)';
strAttr := Format( 'DSN=myTEST'+#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( '创建DBF文件失败!' );
FreeLibrary( hLib );
end;
end;end;
//目的:读取驱动程序位置
//参数:AName--要读取的数据库驱动类型的标志(自己可以任意定制)
//***************************************************
Function ReadODBCDriver(AName: String):String;
var
registerTemp: TRegistry;
s:string;
begin registerTemp:=TRegistry.Create;
if AName='Access' then
begin
with registerTemp do
begin
RootKey:=HKEY_LOCAL_MACHINE;
if OpenKey('Software\ODBC\ODBCINST.INI\Microsoft Access Driver (*.mdb)',True) then
begin
s:=ReadString('Driver');
ReadODBCDriver:=ReadString('Driver');
CloseKey;
Free;
Exit;
end;
end;
end;
registerTemp.Free;
ReadODBCDriver:=''; end;//****************************************************
//目的:建立数据库驱动程序并配置
//参数:AName--要建立的ODBC数据库别名
// APath--要连接的数据库路径名称
// ADriver--ODBC驱动名称,由系统获取
//****************************************************
Function CreateMsAccess(AName: String; APath: String; ADriver: String):Boolean;
var
registerTemp:TRegistry;
bData:array[0..0] of byte;
begin if ADriver='' then
begin
//ShowMessage('读取ODBC驱动程序失败,请重新安装ODBC!');
CreateMsAccess:=False;
Exit;
end;
registerTemp:=TRegistry.Create;
CreateMsAccess:=True;
with registerTemp do
begin
RootKey:=HKEY_LOCAL_MACHINE;
if OpenKey('Software\ODBC\ODBC.INI\ODBC Data Sources',True) then
begin
//注册一个DSN名称--AName
WriteString(AName,'Microsoft Access Driver (*.mdb)');
end
else
begin
CreateMsAccess:=False;
Exit;
end;
CloseKey;
//写入DSN配置信息
if OpenKey('Software\ODBC\ODBC.INI\'+AName,True) then
begin
//数据库目录,连接你的数据库
WriteString('DBQ',APath);
//数据源描述 --任意修改??????????
WriteString('Description','Nsky Access DataBase'); //驱动程序DLL文件
WriteString('Driver',ADriver); //驱动程序标志
WriteInteger('DriverId',25); //Filter依据
WriteString('FIL','Ms Access;'); //支持的事务操作数目
WriteInteger('SafeTransaction',0); //用户名称
WriteString('UID',''); //用户密码--可以修改定制??????????
WriteString('PWD','nsky');
bData[0]:=0;
//非独占方式
WriteBinaryData('Exclusive',bData,1); //非只读方式
WriteBinaryData('ReadOnly',bData,1);
end
else
begin
CreateMsAccess:=False;
Exit;
end;
CloseKey;
//写入DSN数据库引擎配置信息
if OpenKey('Software\ODBC\ODBC.INI\'+AName+'\Engines\Jet',True) then
begin
WriteString('ImplicitCommitSync','Yes');
//缓冲区大小
WriteInteger('MaxBufferSize',512); //页超时
WriteInteger('PageTimeout',10); //支持的线程数目
WriteInteger('Threads',3);
WriteString('UserCommitSync','Yes');
end
else
begin
CreateMsAccess:=False;
Exit;
end;
CloseKey;
Free;
end; end;