| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1987 人关注过本帖
标题:求助 怎么不通过ODBC直接用代码连接Access数据库
只看楼主 加入收藏
w65305077
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2006-7-19
收藏
 问题点数:0 回复次数:4 
求助 怎么不通过ODBC直接用代码连接Access数据库
在PB中使用代码直接连接ACCESS数据库该怎么写?路径最好是相对路径。谢谢~
搜索更多相关主题的帖子: ODBC 数据库 Access 代码 
2006-07-27 09:28
潇洒老乌龟
Rank: 5Rank: 5
等 级:贵宾
威 望:18
帖 子:407
专家分:0
注 册:2005-12-13
收藏
得分:0 

看看此文对你时候有用?
用代码配置ODBC

  原著:樊春容,摘自《电脑编程技巧与维护》。

  一、 引言
  Powerbuilder是客户端的开发工具,在实际应用中必须与数据库管理系统配合起来才能运行应用程序,它与数据库的连接可以通过ODBC接口实现。在ODBC中配置好数据源后,便可在程序代码中连接数据库并对数据库进行各种操作了。目前的大部分PB参考书都只介绍了ODBC的手工配置方法,而没有介绍如何在代码中进行ODBC的配置,这样当程序最终完成并分发到用户手中后,还需要为用户配置ODBC,显得既麻烦又不符合专业软件的要求。那么,怎样才能在代码中实现对ODBC的配置呢?其实,Windows中所有的ODBC数据源在系统注册表中都有记载,因此只要对注册表中的项目进行相应的修改即可。与ODBC相关的键中,HKEY_LOCAL_MACHINE\Software\ODBC\ODBCINST.INI\ODBCDRIVER中记录了所有已安装的ODBC驱动程序;HKEY_LOCAL_MACHINE\Software\ODBC\ODBCINST.INI中记录了各种ODBC驱动程序的相关信息;HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\ODBC Data Sources记录了各种数据源的类型;HKEY_CURRENT_USER\Software\ODBC\ODBC.INI则记录了各种数据源的详细信息。因此,只要在代码中对这些键进行配置,便可达到手工配置ODBC的目的。

  二、在代码中配置ODBC的实现
  下面以Powerbuilder内置的Sybase SQL Anywhere 5.0数据库为例(其他版本类似)介绍ODBC的代码配置方法。
  1、找出数据库驱动程序及相关文件
  首先找到相应的数据库驱动程序,这些文件可以在注册表的HKEY_LOCAL_MACHINE\Software\ODBC\ODBCINST.INI下相应键中找到。如Sybase SQL Anywhere5.0为dbeng50.EXE,WOD50T.DLL,以及一些其他相关的动态链接库,此例中为Dbl50t.dll,Wl50ent.dll,Wtr50t.dll,Wodbc.gid,Wtr50t.dll。这些文件必须与最终的可执行程序一起安装到用户的计算机上,可以与应用程序放在一起,也可以放在一个特定的目录下(本例为Windows的system目录下)。在调试时可先将这些文件复制到指定的目录下。
  2、在程序中用代码配置ODBC
  在应用的open事件中对ODBC配置的代码如下:
  Ulong ul_num
  Int answer,answer1,answer2,answer3,answer4,answer5,ansapp
  String ls_driver,ls_start,ls_location,apppath,db_path,odbcstr
  //获取操作系统的system目录,并保存到ls_location变量
  answer=RegistryGet(“KYEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Setup”,”SysDir”,RegString!ls_location)
  IF answer = -1 THEN
    Messagebox(‘错误’,’应用程序无法获取Windows的系统目录,系统统将终止运行!’,Stopsign!)
    RETURN
  END IF
  //判断Sybase SQL Anywhere5.0的驱动程序是否正确安装
  ls_driver=ls_location+’\WOD50T.DLL’
  ls_start=ls_location+’\dbeng50.EXE’
  IF NOT (FileExists(ls_driver) AND FileExists(ls_start)) THEN
    Messagebox(‘错误’,’系统中没有安装SQL Anywhere的驱动程序,系统将终止运行!’,StopSign!)
    RETURN
  END IF
  //设置ODBC\ODBCINST.INI\ODBC DRIVERS
  answer=RegistrySet(‘ HKEY_LOCAL_MACHINE\Software\ODBC\ODBCINST.INI\ODBCDRIVER’,’Sybase SQL Anywhere 5.0’,RegString!,’Installed’)
  IF answer = -1 THEN
    Messagebox(‘错误’,’应用程序无法设置ODBC DRIVERS,系统将终止运行!’,StopSign!)
    RETURN
  END IF
  //设置ODBC\ODBCINST.INI\
  answer1=RegistrySet(‘ HKEY_LOCAL_MACHINE\Software\ODBC\ODBCINST.INI\Sybase SQL Anywhere 5.0’,’CPTimeout’,RegString!,’not pooled’)
  answer2=RegistrySet(‘ HKEY_LOCAL_MACHINE\Software\ODBC\ODBCINST.INI\Sybase SQL Anywhere 5.0’,’Driver’,RegString!,ls_driver)
  answer3=RegistrySet(‘ HKEY_LOCAL_MACHINE\Software\ODBC\ODBCINST.INI\Sybase SQL Anywhere 5.0’,’Setup’,RegString!,ls_driver)
  IF answer1 = -1 OR answer2 = -1 OR answer3 = -1 THEN
    Messagebox(‘错误’,’应用程序无法设置ODBCINST.INI,系统将终止运行!’,StopSign!)
    RETURN
  END IF
  //设置ODBC DATA SOURCE名称(anysql为数据源名)
  answer=RegistrySet(‘ HKEY_LOCAL_MACHINE\Software\ODBC\ODBCINST.INI\ODBC Data Sources’,’  anysql’,RegString!,’Sybase SQL Anywhere 5.0’)
  IF answer = -1 THEN
    Messagebox(‘错误’,’应用程序无法设置ODBC DATA SOURCE名称,系统将终止运行!’,StopSign!)
    RETURN
  END IF
  //获取应用程序的安装路径(ybinput为应用程序安装到用户计算机上后在注册表中注册的应用程序名,yibiao.db为应用程序的数据库名,与应用程序在同一目录下,anysql为数据源名)
  ansapp = RegistryGet(“KYEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\App Paths\ybinput”,”Path”,RegString!app_path)
  IF ansapp = -1 THEN
    Messagebox(‘错误’,’应用程序无法获取安装路径名,系统将终止运行!’,StopSign!)
    RETURN
  ELSE
    db_path=app_path+’yibiao.db’
  END IF
  //设置ODBC.INI的细节
  answer1 = RegistrySet(‘HKEY_current_user\software\odbc\odbc.ini\anysql’,’driver’,RegString!,ls_driver)
  answer2 = RegistrySet(‘HKEY_current_user\software\odbc\odbc.ini\anysql’,’start’,RegString!,ls_start)
  answer3 = RegistrySet(‘HKEY_current_user\software\odbc\odbc.ini\anysql’,’autostop’,RegString!,’yes’)
  answer4 = RegistrySet(‘HKEY_current_user\software\odbc\odbc.ini\anysql’,’DataBaseFile’,RegString!,db_path)
  answer5 = RegistrySet(‘HKEY_current_user\software\odbc\odbc.ini\anysql’,’DataBaseName’,RegString!,’yibiao’)
  IF answer1 = -1 OR answer2 = -1 OR answer3 = -1 OR answer4 = -1 OR answer5 = -1 THEN
    Messagebox(‘错误’,’应用程序无法设置ODBC.INI细节,系统将终止运行!’,StopSign!)
    RETURN
  END IF
  odbcstr = ’dsn=anysql;databasename=yibiao;databasefile=’+db_path
  sqlca.dbms = ’odbc’
  sqlca.databse = ’yibiao’
  sqlca.dbparm = ”connectstring=’”+odbcstr+”;uid=dba;pwd=sql’”
  connect using sqlca;
  open(w_main)


乌龟学堂http://www. 承接各种软件开发、系统集成、网络搭建。 QQ:124030710
2006-07-27 22:28
w65305077
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2006-7-19
收藏
得分:0 
谢谢,这文章我拿去看了啊~
2006-07-28 14:38
潇洒老乌龟
Rank: 5Rank: 5
等 级:贵宾
威 望:18
帖 子:407
专家分:0
注 册:2005-12-13
收藏
得分:0 

//***********************************************
// 函数名: gf_setodbc_access
// 功能: 完成access数据源的注册功能
// 输入参数:
// as_database 数据库名
// (即Access数据库文件名字,不含扩展名)
// as_path 数据库文件所在的目录
// 返回值:
// true 表示自动配置成功
// false 表示自动配置失败
// 设计者: Adamswater
// 完成时间: 2005年6月
//***************************************************
boolean lb_rtn
string ls_root,ls_root_dsn,ls_root_Jet,ls_root_Engines
integer li_rtn
string ls_dsnname,ls_dbfullname,ls_driver,temp,ls_version
string ls_syspath
environment env

integer rtn

ls_syspath = Space( 40 )
//获得操作系统的目录
GetSystemDirectoryA(ls_syspath,60)
ls_driver = ls_syspath + "\odbcjt32.dll"
lb_rtn = true
ls_root = "HKEY_LOCAL_MACHINE\software\odbc\odbc.ini"
//数据源名字为:文件名字+“_DT”
ls_dsnname = as_database + "_DT"
ls_root_dsn = ls_root + "\" + ls_dsnname
ls_root_Engines = ls_root_dsn + "\" + "Engines"
ls_root_Jet = ls_root_Engines + "\" + "Jet"
ls_dbfullname = as_path + "\" + as_database + ".mdb"
//注册数据源的名字
li_rtn = registryset(ls_root,ls_dsnname,regstring!,"")
if li_rtn= - 1 then
return false
end if
//注册数据库名字
li_rtn = registryset(ls_root_dsn,"DBQ",regstring!,ls_dbfullname)
if li_rtn= - 1 then
return false
end if
//注册数据库驱动程序
li_rtn = registryset(ls_root_dsn,"Driver",regstring!,ls_driver)
if li_rtn= - 1 then
return false
end if

//注册其它项
li_rtn = registryset(ls_root_dsn,"FIL",regstring!,"MS Access;")
if li_rtn= - 1 then
return false
end if
li_rtn = registryset(ls_root_dsn,"Description",regstring!,"条形码打印程序")
if li_rtn= - 1 then
return false
end if
li_rtn = registryset(ls_root_dsn,"UID",regstring!,"")
if li_rtn= - 1 then
return false
end if
li_rtn = registryset(ls_root_dsn,"DriverId", RegULong!,25)
if li_rtn= - 1 then
return false
end if
li_rtn = registryset(ls_root_dsn,"SafeTransactions", RegULong!,0)
if li_rtn= - 1 then
return false
end if
//注册"Engines"项
li_rtn = registryset(ls_root_dsn,"Engines",regstring!,"")
if li_rtn= - 1 then
return false
end if
//注册"Jet"项
li_rtn = registryset(ls_root_Engines,"Jet",regstring!,"")
if li_rtn= - 1 then
return false
end if
//注册"Jet"项的各个子项
li_rtn = registryset(ls_root_Jet,"ImplicitCommitSync",regstring!,"")
if li_rtn= - 1 then
return false
end if
li_rtn = registryset(ls_root_Jet,"UserCommitSync",regstring!,"Yes")
if li_rtn= - 1 then
return false
end if
li_rtn = registryset(ls_root_Jet,"MaxBufferSize", RegULong!,2048)
if li_rtn= - 1 then
return false
end if
li_rtn = registryset(ls_root_Jet,"PageTimeout", RegULong!,5)
if li_rtn= - 1 then
return false
end if
li_rtn = registryset(ls_root_Jet,"Threads", RegULong!,3)
if li_rtn= - 1 then
return false
end if
return lb_rtn


乌龟学堂http://www. 承接各种软件开发、系统集成、网络搭建。 QQ:124030710
2006-07-29 15:21
fgypblt
Rank: 1
等 级:新手上路
帖 子:67
专家分:0
注 册:2006-6-27
收藏
得分:0 
hello沙发一下

2006-07-29 15:24
快速回复:求助 怎么不通过ODBC直接用代码连接Access数据库
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.027411 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved