| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1349 人关注过本帖
标题:[求助]如何用代码完成odbc配置?
只看楼主 加入收藏
niute
Rank: 1
等 级:新手上路
帖 子:46
专家分:0
注 册:2006-6-2
收藏
 问题点数:0 回复次数:9 
[求助]如何用代码完成odbc配置?
为了程序有更好的移植性,如何用代码完成odbc配置?
事件起因:我作了个程序,
1。打包后(打包时,建立.dll文件,打包时间很长,难道是代码有问题?可编程状态没问题啊?),启动程序后,输入密码登陆,不好使,无反应!怎么回事啊??????
2。我就换另一种方式打包(不建立.dll文件),在编程机子上运行,没问题;可移植到别的机子上运行(我已经将需要的.dll文件拷贝过去了)程序也能进,就是好象连接不到数据库!
登陆时在ddlb_1.控件里显示不出我的所有管理员名(我已经将ddlb_1显示所有的管理员名的代码写在登陆窗口的open事件中)是没连上数据库吧?
该如何解决呢?斑竹???是必须手写odbc配置的代码???如何写呢?这个程序我是用pb10的odbc配置的。

搜索更多相关主题的帖子: odbc 代码 
2006-08-21 20:32
潇洒老乌龟
Rank: 5Rank: 5
等 级:贵宾
威 望:18
帖 子:407
专家分:0
注 册:2005-12-13
收藏
得分:0 

关于动态注册ASA数据库ODBC数据源

//************************************************************//
// 函数名: //
// 功能: 主要是根据传入的库文件名,自动完成ODBC的配置 //
// 一文件名在ODBC中注册数据源 //
// 输入: //
// ls_filename 文件名称(主要是库文件) //
// ls_dir 文件所在的目录 //
// 返回值: //
// 1 表示自动配置成功 //
// 0 表示自动配置失败 //
// 设计者: Adamswater //
// 完成时间: 2003年10月 //
//************************************************************//
integer li_return //返回值
string ls_filename
integer li_rtn
string ls_root
string ls_root_table

ls_filename = as_filename + ".db"//获得数据库文件名字


ls_root = "HKEY_LOCAL_MACHINE\software\odbc\odbc.ini"
ls_root_table = ls_root + "\" + as_filename
li_return = 1
li_rtn = registryset(ls_root,as_filename,regstring!,"")
if li_rtn= - 1 then
li_return = 0
end if
li_rtn = registryset(ls_root_table,"AutoStop",regstring!,"Yes")
if li_rtn= - 1 then
li_return = 0
end if
li_rtn = registryset(ls_root_table,"Compress",regstring!,"NO")
if li_rtn= - 1 then
return 0
end if
li_rtn = registryset(ls_root_table,"DatabaseFile",regstring!,as_dir + "\"+ls_filename)
if li_rtn= - 1 then
li_return = 0
end if
li_rtn = registryset(ls_root_table,"DatabaseName",regstring!,as_filename)
if li_rtn= - 1 then
li_return = 0
end if
li_rtn = registryset(ls_root_table,"Debug",regstring!,"NO")
if li_rtn= - 1 then
li_return = 0
end if
li_rtn = registryset(ls_root_table,"DisableMultiRowFetch",regstring!,"NO")
if li_rtn= - 1 then
li_return = 0
end if
li_rtn = registryset(ls_root_table,"Driver",regstring!,as_dir + "\"+"dbodbc8.dll")
if li_rtn= - 1 then
li_return = 0
end if
li_rtn = registryset(ls_root_table,"Start",regstring!,as_dir + "\"+"dbeng8.exe -d -c8m")
if li_rtn= - 1 then
li_return = 0
end if
li_rtn = registryset(ls_root_table,"EngineName",regstring!,"ndjwglxt")
if li_rtn= - 1 then
li_return = 0
end if
li_rtn = registryset(ls_root_table,"Integrated",regstring!,"No")
if li_rtn= - 1 then
li_return = 0
end if
li_rtn = registryset(ls_root_table,"PWD",regstring!,"jwglxt")
if li_rtn= - 1 then
li_return = 0
end if
li_rtn = registryset(ls_root_table,"UID",regstring!,"jwglxt")
if li_rtn= - 1 then
li_return = 0
end if
return li_return


乌龟学堂http://www. 承接各种软件开发、系统集成、网络搭建。 QQ:124030710
2006-08-21 22:49
潇洒老乌龟
Rank: 5Rank: 5
等 级:贵宾
威 望:18
帖 子:407
专家分:0
注 册:2005-12-13
收藏
得分:0 

关于动态注册Access数据源

//***********************************************
// 函数名: 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

注:函数中使用到的api函数声明如下,
Function uint GetSystemDirectoryA(ref string dirtext, uint textlen) library "KERNEL32.DLL"


乌龟学堂http://www. 承接各种软件开发、系统集成、网络搭建。 QQ:124030710
2006-08-21 22:49
潇洒老乌龟
Rank: 5Rank: 5
等 级:贵宾
威 望:18
帖 子:407
专家分:0
注 册:2005-12-13
收藏
得分:0 

关于动态注册DBF数据源

//************************************************************//
// 函数名: autosetodbc //
// 功能: 主要是根据传入的库文件名,自动完成ODBC的配置 //
// 一文件名在ODBC中注册数据源 //
// 输入: //
// ls_file 文件名称(主要是库文件) //
// ls_path 文件所在的目录 //
// as_drivedir 驱动程序路径 //
// 返回值: //
// 1 表示自动配置成功 //
// 0 表示自动配置失败 //
// 设计者: Adamswater //
// 完成时间: 2003年10月 //
// //
//************************************************************//
integer li_return //返回值
string ls_filename //库文件名
string ls_fileend //文件的扩展名
string ls_filedir //文件所在的目录
string ls_driver //驱动程序
integer li_rtn
blob lb_value
string ls_root
string ls_root_table

li_return = 1
ls_driver = as_drivedir + +"\vfpodbc.dll"
ls_fileend = right(ls_file,3) //获得文件的扩展名
ls_filename = left(ls_file,pos(ls_file,'.',1) - 1) //获得文件名
ls_filedir = ls_path//left(ls_path,lastpos(ls_path,'\') - 1)
ls_root = "HKEY_LOCAL_MACHINE\software\odbc\odbc.ini"
ls_root_table = ls_root + "\" + ls_filename
if ls_fileend="dbf" then
//先判断是否已经注册过
//当选择的是DBF文件时
li_rtn = registryset(ls_root,ls_filename,regstring!,"")
if li_rtn= - 1 then
return 0
end if
li_rtn = registryset(ls_root_table,"BackgroundFetch",regstring!,"Yes")
if li_rtn= - 1 then
return 0
end if
li_rtn = registryset(ls_root_table,"Collate",regstring!,"Machine")
if li_rtn= - 1 then
return 0
end if
li_rtn = registryset(ls_root_table,"Deleted",regstring!,"Yes")
if li_rtn= - 1 then
return 0
end if
li_rtn = registryset(ls_root_table,"Collate",regstring!,"Machine")
if li_rtn= - 1 then
return 0
end if
li_rtn = registryset(ls_root_table,"Description",regstring!,"")
if li_rtn= - 1 then
return 0
end if
li_rtn = registryset(ls_root_table,"Driver",regstring!,ls_driver)
if li_rtn= - 1 then
return 0
end if
li_rtn = registryset(ls_root_table,"Exclusive",regstring!,"No")
if li_rtn= - 1 then
return 0
end if
li_rtn = registryset(ls_root_table,"Null",regstring!,"Yes")
if li_rtn= - 1 then
return 0
end if
li_rtn = registryset(ls_root_table,"SetNoCountOn",regstring!,"No")
if li_rtn= - 1 then
return 0
end if
li_rtn = registryset(ls_root_table,"SourceDB",regstring!,ls_filedir)
if li_rtn= - 1 then
return 0
end if
li_rtn = registryset(ls_root_table,"SourceType",regstring!,"DBF")
if li_rtn= - 1 then
return 0
end if
else
end if
return li_return


乌龟学堂http://www. 承接各种软件开发、系统集成、网络搭建。 QQ:124030710
2006-08-21 22:49
潇洒老乌龟
Rank: 5Rank: 5
等 级:贵宾
威 望:18
帖 子:407
专家分:0
注 册:2005-12-13
收藏
得分:0 

关于动态注册SQL Server数据源

//***********************************************
// 函数名: gf_setodbc_sqlserver
// 功能: 完成sqlserver数据源的注册功能
// 输入参数:
// as_database 数据库名
// as_server 服务器名

// 返回值:
// true 表示自动配置成功
// false 表示自动配置失败
// 设计者: Adamswater
// 完成时间: 2005年6月
//
//***************************************************
boolean lb_rtn
string ls_root,ls_root_dsn
integer li_rtn
string ls_dsnname

lb_rtn = true
ls_root = "HKEY_LOCAL_MACHINE\software\odbc\odbc.ini"
ls_dsnname = as_database + "_DT"//数据源的名字:数据库名字_DT,当然可以修改
ls_root_dsn = ls_root + "\" + ls_dsnname

li_rtn = registryset(ls_root,ls_dsnname,regstring!,"")
if li_rtn= - 1 then
return false
end if

//指定数据库名字
li_rtn = registryset(ls_root_dsn,"Database",regstring!,as_database)
if li_rtn= - 1 then
return false
end if

//指定驱动程序
li_rtn = registryset(ls_root_dsn,"Driver",regstring!,'C:\WINNT\System32\SQLSRV32.dll')
if li_rtn= - 1 then
return false
end if
li_rtn = registryset(ls_root_dsn,"LastUser",regstring!,'sa')
if li_rtn= - 1 then
return false
end if
li_rtn = registryset(ls_root_dsn,"Server",regstring!,upper(as_server))
if li_rtn= - 1 then
return false
end if
li_rtn = registryset(ls_root_dsn,"Trusted_Connection",regstring!,'Yes')
if li_rtn= - 1 then
return false
end if
return lb_rtn


乌龟学堂http://www. 承接各种软件开发、系统集成、网络搭建。 QQ:124030710
2006-08-21 22:49
潇洒老乌龟
Rank: 5Rank: 5
等 级:贵宾
威 望:18
帖 子:407
专家分:0
注 册:2005-12-13
收藏
得分:0 

在PB程序中实现ODBC数据源的添加

  原著:鹿寒

  思路:主要是利用PB对注册表操作函数RegistryGet()和RegistrySet(),这两个函数以及其他注册表函数在PB的帮助里都有详细说明。
  再就是利用PB的ProfileString()函数读取INI文件中预先定义好的参数。

  写注册表的源程序:
  string ls_sys[],ls_driver[],st_driver,st_path
  integer li_rtn
  ls_me="新星科技股份有限公司(New Star, Inc.)"
  ls_version="2.0"
  ls_sys[1]="HKEY_LOCAL_MACHINE\Software\ODBC\ODBCINST.INI\Sybase SQL Anywhere 5.0"
  ls_sys[2]="HKEY_CURRENT_USER\Software\"+ls_me+"\仓储管理系统\"+ls_version
  ls_sys[3]="HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\ODBC Data Sources"
  ls_sys[4]="HKEY_CURRENT_USER\Software\ODBC\ODBC.INI"
  li_rtn = RegistryGet(ls_sys[1], "Driver", RegString!, st_driver)
  IF li_rtn = -1 THEN
    messagebox("错误","未安装Sybase SQL Anywhere 5.0 !",information!,ok!)
    RETURN
  END IF
  li_rtn = RegistryGet(ls_sys[2], "InstPath", RegString!, st_path)
  IF li_rtn = -1 THEN
    messagebox("错误","读取安装路径出错 !",information!,ok!)
    RETURN
  END IF
  string envfile,ls_source[],ls_drivepath,ls_temp
  integer i
  envfile="regedit.ini"
  ls_source[1]="cl"
  ls_source[2] =ProfileString(envfile,"INI","AutoStop"," ")
  ls_source[3] =ProfileString(envfile,"INI","DatabaseFile"," ")
  ls_source[4] =ProfileString(envfile,"INI","DatabaseName"," ")
  ls_source[5] =ProfileString(envfile,"INI","Description"," ")
  ls_source[6] =ProfileString(envfile,"INI","Driver"," ")
  ls_source[7] =ProfileString(envfile,"INI","PWD"," ")
  ls_source[8] =ProfileString(envfile,"INI","Start"," ")
  ls_source[9] =ProfileString(envfile,"INI","UID"," ")
  li_rtn=RegistrySet(ls_sys[3], ls_source[1] , RegString!, "Sybase SQL Anywhere 5.0")
  IF li_rtn = -1 THEN
    messagebox("错误","读取系统文件或写注册表出错 !",information!,ok!)
    RETURN
  END IF
  ls_sys[4]=ls_sys[4] + "\" + ls_source[1]
  li_rtn=RegistrySet(ls_sys[4], "AutoStop" , RegString!, ls_source[2])
  IF li_rtn = -1 THEN
    messagebox("错误","读取系统文件或写注册表出错 !",information!,ok!)
    RETURN
  END IF
  li_rtn=RegistrySet(ls_sys[4], "DatabaseFile" , RegString!, st_path+"\"+ls_source[3])
  IF li_rtn = -1 THEN
    messagebox("错误","读取系统文件或写注册表出错 !",information!,ok!)
    RETURN
  END IF
  li_rtn=RegistrySet(ls_sys[4], "DatabaseName" , RegString!, ls_source[4])
  IF li_rtn = -1 THEN
    messagebox("错误","读取系统文件或写注册表出错 !",information!,ok!)
    RETURN
  END IF
  li_rtn=RegistrySet(ls_sys[4], "Description" , RegString!, ls_source[5])
  IF li_rtn = -1 THEN
    messagebox("错误","读取系统文件或写注册表出错?!",information!,ok!)
    RETURN
  END IF
  li_rtn=RegistrySet(ls_sys[4], "Driver" , RegString!, st_driver)
  IF li_rtn = -1 THEN
    messagebox("错误","读取系统文件或写注册表出错 !",information!,ok!)
    RETURN
  END IF
  li_rtn=RegistrySet(ls_sys[4], "PWD" , RegString!, ls_source[7])
  IF li_rtn = -1 THEN
    messagebox("错误","读取系统文件或写注册表出错 !",information!,ok!)
    RETURN
  END IF
  ls_temp=st_driver
  i=pos(ls_temp,"\")
  do while i>0
    ls_drivepath=ls_drivepath+left(ls_temp,i)
    ls_temp=right(ls_temp,len(ls_temp)-i)
    i=pos(ls_temp,"\")
  loop
  li_rtn=RegistrySet(ls_sys[4], "Start" , RegString!, ls_drivepath+ls_source[8])
  IF li_rtn = -1 THEN
    messagebox("错误","读取系统文件或写注册表出错 !",information!,ok!)
    RETURN
  END IF
  li_rtn=RegistrySet(ls_sys[4], "UID" , RegString!, ls_source[9])
  IF li_rtn = -1 THEN
    messagebox("错误","读取系统文件或写注册表出错 !",information!,ok!)
    RETURN
  END IF

  regedit.ini文件格式如下:
  [INI]
  AutoStop=yes
  DatabaseFile=Psdemodb.db
  DatabaseName=仓储管理系统
  Description=cl
  Driver=
  PWD=sql
  Start=dbeng50.exe
  UID=dba

  备注:程序中ls_sys[2]变量代表的注册表键值是我通过安装程序制作工具自动生成的,每个人使用的制作安装程序的工具不同,这个键值也许不尽相同。其实用意只是在于取得st_path这个变量,它保存应用程序安装后所在路径,其实也可以用API函数得到,至于使用API函数怎么取得当前程序所在路径就不讲了。


乌龟学堂http://www. 承接各种软件开发、系统集成、网络搭建。 QQ:124030710
2006-08-21 22:50
niute
Rank: 1
等 级:新手上路
帖 子:46
专家分:0
注 册:2006-6-2
收藏
得分:0 
很全面啊!我忘记说用什么数据库了,麻烦斑竹了!非常感谢,一会试试。
你说我的问题是 应该用代码写连接数据源的问题??
2006-08-22 11:12
niute
Rank: 1
等 级:新手上路
帖 子:46
专家分:0
注 册:2006-6-2
收藏
得分:0 

斑竹我没弄明白啊! 好多错误啊!能不能详细的说需要改哪些地方啊?怎么改?初学啊!
今天我在另一台机子上也配置了数据源为什么不好使啊?

2006-08-22 21:19
niute
Rank: 1
等 级:新手上路
帖 子:46
专家分:0
注 册:2006-6-2
收藏
得分:0 
斑竹求救啊!
我在另一台机子上装一边pb就好用了!我到底应该怎么做啊?
我的数据库是access,你给的代码我改了几个地方,错误很多啊 !不懂啊!
能不能给个例子啊?
2006-08-24 19:03
niute
Rank: 1
等 级:新手上路
帖 子:46
专家分:0
注 册:2006-6-2
收藏
得分:0 

斑竹给个回信啊?等着呢
1。你说的api 函数声明,我试过了,怎么有错误呢?
在全局里声明?怎么具体声明呢?

2。ls_syspath = Space( 40 )
//获得操作系统的目录
(40)是什么意思?需要保留? ls_syspath ="c:\windows\system32"对?

[此贴子已经被作者于2006-8-25 18:24:53编辑过]

2006-08-25 18:17
快速回复:[求助]如何用代码完成odbc配置?
数据加载中...
 
   



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

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