|
|
导航: |
论坛 -> DELPHI技术
斑竹:liumazi,sephil |
|
作者: |
|
2004/2/18 20:06:56 |
标题: |
高手们,能不能用程序的方法来设置ODBC? |
浏览:1610 |
|
加入我的收藏 |
楼主: |
能不能用程序的方法来设置ODBC。比如要添加一个数据源等等之类的, 能不能提供一下这方面的材料? 万分感谢!
----------------------------------------------
因为笨,所以问! |
作者: |
bios (阿贡) |
★☆☆☆☆ |
-
|
盒子中级会员 |
|
2004/2/18 20:15:52 |
1楼: |
添加ODBC System DSN 下面这个例子显示了如何加载实现了ODBC 管理功能的DLL(odbccp32.dll)来创建一个Access MDB文件和指向它的ODBC DSN。注意:这里假设DLL和MDB都在当前目录下。 同时,"CREATE_DB"的调用是Access(MS Jet引擎)的专有调用,类似的还有COMPACT_DB和REPAIR_DB等。
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'; // 检查Access权限(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)失败!' );
// 检测/创建同DSN关联的 MDB 文件 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;
--------------------------------------------------------------------------------
以下是在程序中动态创建ODBC的DSN数据源代码: procedure TCreateODBCDSNfrm.CreateDSNBtnClick(Sender: TObject); var registerTemp : TRegistry; bData : array[ 0..0 ] of byte; begin registerTemp := TRegistry.Create; //建立一个Registry实例 with registerTemp do begin RootKey:=HKEY_LOCAL_MACHINE; //设置根键值为HKEY_LOCAL_MACHINE //找到Software\ODBC\ODBC.INI\ODBC Data Sources if OpenKey('Software\ODBC\ODBC.INI \ODBC Data Sources',True) then begin //注册一个DSN名称 WriteString( 'MyAccess', 'Microsoft Access Driver (*.mdb)' ); end else begin//创建键值失败 memo1.lines.add('增加ODBC数据源失败'); exit; end; CloseKey; //找到或创建Software\ODBC\ODBC.INI \MyAccess,写入DSN配置信息 if OpenKey('Software\ODBC\ODBC.INI \MyAccess',True) then begin WriteString( 'DBQ', 'C:\inetpub\wwwroot \test.mdb' );//数据库目录,连接您的数据库 WriteString( 'Description', '我的新数据源' );//数据源描述 WriteString( 'Driver', 'C:\PWIN98\SYSTEM odbcjt32.dll' );//驱动程序DLL文件 WriteInteger( 'DriverId', 25 ); //驱动程序标识 WriteString( 'FIL', 'Ms Access;' ); //Filter依据 WriteInteger( 'SafeTransaction', 0 ); //支持的事务操作数目 WriteString( 'UID', ' );//用户名称 bData[0] := 0; WriteBinaryData( 'Exclusive', bData, 1 ); //非独占方式 WriteBinaryData( 'ReadOnly', bData, 1 ); //非只读方式 end else//创建键值失败 begin memo1.lines.add('增加ODBC数据源失败'); exit; end; CloseKey; //找到或创建Software\ODBC\ODBC.INI \MyAccess\Engines\Jet //写入DSN数据库引擎配置信息 if OpenKey('Software\ODBC\ODBC.INI \MyAccess\Engines\Jet',True) then begin WriteString( 'ImplicitCommitSync', 'Yes' ); WriteInteger( 'MaxBufferSize', 512 );//缓冲区大小 WriteInteger( 'PageTimeout', 10 );//页超时 WriteInteger( 'Threads', 3 );//支持的线程数目 WriteString( 'UserCommitSync', 'Yes' ); end else//创建键值失败 begin memo1.lines.add('增加ODBC数据源失败'); exit; end; CloseKey; memo1.lines.add('增加新ODBC数据源成功'); Free; end; end;
从中您应该可以学会如何更改需要的数据库
----------------------------------------------
|
作者: |
|
2004/2/18 20:23:38 |
2楼: |
那比如我要添加一个sql server 的数据源,该怎么编呢?
----------------------------------------------
因为笨,所以问!
|
作者: |
bios (阿贡) |
★☆☆☆☆ |
-
|
盒子中级会员 |
|
2004/2/18 20:35:46 |
3楼: |
自己认真看吧 不要偷懒!
----------------------------------------------
|
作者: |
zhj (zhj) |
★☆☆☆☆ |
-
|
普通会员 |
|
2004/2/18 20:45:55 |
4楼: |
能不能先翻译一下啊?????
----------------------------------------------
-
|
作者: |
|
2004/2/18 22:56:26 |
5楼: |
bios大哥,能不能注解再详细一点,看不懂!
----------------------------------------------
因为笨,所以问!
|
|