用access数据库做一个安装程序,急
你最好把你需要的所有文件(EXE,DLL等。)在自己程序的安装文件夹里,不在系统目录里,这样方便移动,还要注册数据源。
我有一个自动注册ODBC数据源的例子,就是注册的ACCESS数据库。虽然不是PB8,但都一样,就拿PB8里的那个当DLL文件。
外部公共函数(全局外部函数)
//获取当前路径
公共函数Long GetCurrentDirectoryA(Long nBufferLength,ref string lpBuffer)库“kernel 32”;
//获取年份的农历表示。
函数long MyFormatLunarYear(long iYear,ref string text)库“calendar.dll”
//获取一天的农历表示
函数long MyGetLunarDate(long iYear,long iMonth,long iDay,ref long iLunarYear,ref long iLunarMonth,ref long iLunarDay)库“calendar.dll”
//获取某一天的农历节气序号。
函数long getjieqi(long iYear,long iMonth,long iDay)库“calendar.dll”
1、海上日计划. ini
/*
Run_flag:表示系统是否第一次运行,0为第一次,以便系统判断是否创建新的数据源。
Dsn_def:默认数据源
Week_month:表示起始输入界面是以周还是月的形式显示,1-月;两周
Icon_flag:指示运行时是否显示在最小化的界面中。1-是0-否。
Iuser:上次登录的用户id。
Idiff:上次登录区别(公司、家庭、其他)
*/
[公共]
begin_year=2001
结束年份=2005年
year_step=1
month_step=1
Curr_path=D:\pb\ day?Pai \pbl
week_month=1
[ini]
ini_flag=1
run_flag=1
dsn_def=dsn_sdp
icon_flag=0
iuser=jdh
idiff=1
2、ue_ini()返回(无)
//设置默认数据源
如果len(trim(profileString(" sea day plan . ini "," ini "," dsn_def "," ")))=0则
setprofileString(" sea day plan . ini "," ini "," dsn_def "," dsn_sdp ")
如果…就会结束
3、ue_outo_set_odbc()返回(无)
/*自动设置odbc数据源
在odbc相关的关键字中:
HKEY _本地_机器\软件\ ODBC \ odbcinst.ini \ ODBCDriver记录所有安装的ODBC?驾驶员
HKEY _本地_机器\软件\ ODBC \ odbcinst.ini记录各种ODBC?关于驱动程序的信息。
HKEY _当前_用户\软件\ odbc \ odbc.ini \ ODBC数据源记录各种数据源的类型。
HKEY _当前_用户\软件\ odbc \ odbc.ini记录了各种数据源的详细信息*/
字符串ls_sys[]
ls _ sys[1]= " HKEY _ LOCAL _ MACHINE \ Software \ ODBC \ ODBC inst。INI\ODBC驱动程序"
ls _ sys[2]= " HKEY _ LOCAL _ MACHINE \ Software \ ODBC \ ODBC inst。INI "
ls _ sys[3]= " HKEY _当前用户\软件\ODBC\ODBC。INI\ODBC数据源"
ls _ sys[4]= " HKEY _当前用户\软件\ODBC\ODBC。INI "
//确定系统中是否安装了Access。
字符串ls_install
RegistryGet(ls_sys[1]," Microsoft Access驱动程序(*。mdb)",RegString!,ls_install)
if trim(ls _ install)& lt;& gt“安装”然后
Messagebox("错误","未安装Microsoft Access驱动程序")
停止
如果…就会结束
//获取当前路径
字符串最小二乘路径
ls _ curr_path = profile string(" sea day plan . ini "," public "," curr _ path ","")
如果len(trim(ls_curr_path))=0,则
Messagebox ("Error ","系统初始化当前路径文件出错!")
停止
如果…就会结束
//获取默认数据源名称
字符串ls_dsn
ls _ DSN = profile string(" sea day plan . ini "," ini "," dsn_def ","")
如果len(trim(ls_dsn))=0,则
Messagebox ("Error ","系统出现数据源初始化文件错误!")
停止
如果…就会结束
//修改注册表
RegistrySet(ls_sys[3],ls_dsn,RegString!,“Microsoft Access驱动程序(*。MDB)")//记录数据源类型。
RegistrySet(ls _ sys[4]+" \ "+ls _ DSN," DBQ ",RegString!,ls _ curr _ path+" \ sea _ day _ plan . MDB ")//记录数据源的详细信息。
registry set(ls _ sys[4]+" \ "+ls _ DSN," Driver ",RegString!,“C:\WINDOWS\SYSTEM\odbcjt32.dll”)
registry set(ls _ sys[4]+" \ "+ls _ DSN," FIL ",RegString!,“MS Access”)
RegistrySet(ls _ sys[4]+" \ "+ls _ DSN," PWD ",RegString!,“sql”)
registry set(ls _ sys[4]+" \ "+ls _ DSN," UID ",RegString!,“dba”)
ulong lu_driverid,lu_SafeTransactions
lu_driverid=25
lu_SafeTransactions=0
registry set(ls _ sys[4]+" \ "+ls _ DSN," DriverId ",Regulong!,lu_driverid)
registry set(ls _ sys[4]+" \ "+ls _ DSN," SafeTransactions ",Regulong!,lu_SafeTransactions)
4.公开竞赛
打开(w_ver_promp)
如果profilestring("sea day plan.ini "," ini "," run_flag "," ")="0 "那么
//获取当前路径
字符串ls _当前路径
long ll_length=50
int li_rtn
字符串ls_dsn="dsn_sdp "
Li _ RTN = getcurrentdirectorya(ll _ length,refls _ current _ path)//放入ue_ini事件出错。
如果li_rtn=0,则
Messagebox("访问失败","应用程序目录访问失败,请重新安装")
停止
如果…就会结束
setProfileString(" sea day plan . ini "," public "," curr_path ",ls_current_path)
//初始化
this.triggerevent("ue_ini ")
//初始化注册表
this . trigger event(" UE _ auto _ set _ odbc ")
如果…就会结束
//获取默认数据源
ls _ DSN = profile string(" sea day plan . ini "," ini "," dsn_def ","")
如果len(trim(ls_dsn))=0,则
Messagebox ("Error ","系统出现数据源初始化文件错误!")
停止
如果…就会结束
//配置数据源
SQLCA。DBMS = "ODBC "
SQLCA。自动提交=假
SQLCA。db parm = " connect string = ' DSN = "+ls _ DSN+";UID = dbaPWD=sql ' "
使用sqlca连接;
如果SQLCA。SQLCode & lt& gt那么0
MessageBox("数据库连接失败","无法连接到数据库,可能的原因"+SQLCA。SQLErrText)
返回
如果…就会结束
关闭(w_ver_promp)
打开(w_main)
打开(w_promp)
//清除数据库
如果isvalid(w_promp ),则
w _ promp . dw _ 1 . object . t _ 1 . text = "正在加载数据,请稍候..."
如果…就会结束
w_main.triggerevent("ue_new ")
setProfileString(" sea day plan . ini "," ini "," run_flag "," 1 ")
关闭(带提示)
打开(w_test)
*******************
//窗口自动居中
环境乐_环境
int li_ReturnCode
这个。SetRedraw(False) //获取屏幕分辨率?
Li _ return code = get environment(le _ envir)//将窗口移动到屏幕中央。
if li _ ReturnCode & lt& gt1然后//失败
这个。SetRedraw(true)
返回
如果…就会结束
Li _ return code = this . move((PixelsToUnits(le _ envir。屏幕宽度,XPixelsToUnits!)-这个。Width)/2,(PixelsToUnits(le_envir。屏幕高度,YPixelsToUnits!)-这个。高度)/2)
如果li_ReturnCode=1那么这个。SetRedraw(true)
我懒得排版。看着它。