DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: a1871584487
今日帖子: 9
在线用户: 13
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 wealsh (工作狂人) ★☆☆☆☆ -
盒子活跃会员
2003/11/22 10:02:31
标题:
ADO+Access问题.. 浏览:1910
加入我的收藏
楼主: 要在 系统DSN添加 数据源 ,程序才能用,有什么办法让它自动完成吗?
----------------------------------------------
-
作者:
男 bios (阿贡) ★☆☆☆☆ -
盒子中级会员
2003/11/22 10:25:49
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;

从中您应该可以学会如何更改需要的数据库 

----------------------------------------------
按此在新窗口浏览图片
按此在新窗口浏览图片
作者:
男 zzy720529 (zzy) ★☆☆☆☆ -
普通会员
2003/11/22 11:01:01
2楼: 你可以直接在ADOConnection的ConnectionString中加入*.mdb文件的路径来访问数据库,不一定要用ODBC的DSN。
----------------------------------------------
-
作者:
男 zsredmoon (=^@^=) ★☆☆☆☆ -
盒子活跃会员
2003/11/22 11:15:34
3楼: 利用'Provider=Microsoft.Jet.OLEDB.4.0;'
----------------------------------------------
按此在新窗口浏览图片
=^@^=
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行89.84375毫秒 RSS