用PB开发多媒体数据库管理系统(二)

用PB开发多媒体数据库管理系统(二),第1张

二 查询系统的制作

制作从键盘输入记录号 可查询到该人的档案记录

①制作查询窗口 步骤为 鼠标点按Window图标 新建一窗口 在窗口中 添加一个DataWindow控件 在DataWindow控件上按鼠标右键 选择并单击Properties快捷菜单项 在在Datawindow object name旁按Browse按钮 选择装入前面制作的aaa数据窗口 调整好窗口的大小 再在窗口上放一SingleLineEdit控件 和一CommandButton按钮控件 点中按钮控件并按右键选择Properties 将其显示文本修改为 查询 按钮名称仍为cb_ 点中按钮控件并按右键选择Script… 输入以下脚本

dw_ settransobject(sqlca)

dw_ retrieve(sle_ text)

关闭并保存 按Save图标保存该窗口 窗口取名为aaa

②将查询窗口连接入test应用程序内 点按Application图标 出现test应用程序 双击test 出现名为w_genapp_frame的窗口图标 这是应用程序为我们提供的主窗口的名字 点按w_genapp_frame不放按右键选edit 出现该主窗口 将一按钮控件放入该窗口 按钮显示的文本可改为 唯一查询 也可省略不改 点中该按钮控件并按右键选择Script… 输入 open(aaa) 保存 点按Application图标 再按script图标 出现应用程序的自动生成的主体脚本 部分内容如下 它的任务是将数据库初始化 相当于win ini 假若不要应用程序的模板 则下面的脚本需自己输入 而使用模板后 现在我们只需将//connect 前面的注释号 // 符号删除即可 除省事外还避免了因为排版引起的下面的程序格式错误 (本人经常因为书中个别字母印刷错 或排版引起的程序格式错误造成程序无法运行而痛心不已 )

sqlca DBMS = ProfileString (ls_startupfile database dbms )sqlca database = ProfileString (ls_startupfile database database )sqlca userid = ProfileString (ls_startupfile database userid )sqlca dbpass = ProfileString (ls_startupfile database dbpass )sqlca logid = ProfileString (ls_startupfile database logid )sqlca logpass = ProfileString (ls_startupfile database LogPassWord )sqlca servername = ProfileString (ls_startupfile database servername )sqlca dbparm = ProfileString (ls_startupfile database dbparm )connect;

现在按Run图标运行该程序 结果如下图 为简化程序 我们只加入了多媒体中的字段 成功后 读者可自已增加动画 声音字段

讨论 假若多媒体的字段和数据个数比较少 也可用变量和函数来解决 如

temp =temp+ bmp p_ picturename=temp ole_ insertfile( sample avi )run( c:\acdsee exe c:\aa bmp normal!)

lishixinzhi/Article/program/SQL/201311/16400

首先你要是用PB提供的数据库接口或者ODBC接口配置数据库连接,配置成功后,PB实际上就可以连接数据库了。修改数据有两种方法: 第一种方式是通过数据窗口的方式,你可以自己创建数据窗口,通过数据窗口,你可以自己写代码通过dw_1update() , co

如果你的版本低于你下载的版本的话就不能打开了。建议用新的版本。可以下载一个pb11安装文件,安装之后看打开pb,看help的about powerbulider 的vesion 有一个版本号,比如 3127 然后下载这个版本的破解文件,按照说明破解就可以使用了,没有任何限制

几个与PB连接数据库相关的问题

1Power script 语言里的事务处理对象怎么理解

PowerBuilder程序与数据库之间传递信息的一个结构变量,共有15个成员你可以详细列表它的所有成员看看它的组成PB的应用程序会初始化一个全局的结构体变量,SQLCA,当然你也可以自定义一个自己的事务对象

1 DBMS string 所使用的数据库管理系统的名字,如Sybase,Oracle,ODBC。

2 Database string 要连接的数据库名字。

3 UserID string 连接数据库所用的用户名。有的DBMS不需要此项。

4 DBPass string 用户连接数据库的口令。

5 Lock string 这是数据库的保护级别,一般不必给出。

6 LogID string 登录到数据库服务器上的用户名,有的DBMS不需要此项,但Sybase和Oracle需要指定这个参数。

7 LogPass string 登录到数据库服务器上的用户口令。这个属性可设可不设,但Sybase和Oracle需要指定口令。

8 ServerName string 数据库服务器名。

9 AutoCommit boolean 指定是否将数据库设置成自动提交所有事务。默认是False,也就是说,必须在应用程序中进行事务管理,并在适当的时候对数据库提交事务。如果选择True,则每个事务都由系统自动提交。

10 DBParm string 用于向数据库传递特殊信息的属性。

11 SQLCode long 指示最近一次SQL *** 作失败或成功。它的取值为: 返回结果 0 无错误。 -1 出现一个错误。 100 没有检索到数据。

12 SQLNRows long 最近一次SQL *** 作影响的行数,数据库不同其含义也不同。

13 SQLDBCode long 数据库错误代码。不同的数据库的含义不同。

14 SQLErrText string 相应于SQLDBCode属性中错误码的文字说明。

15 SQLReturnData string 返回DBMS执行SQL的附加信息,不同的DBMS其值不同。

2我常见到做好的PB程序使用ini文件来控制与数据库连接,可以方便的进行应用程序移植只需修改其中与数据库连接参数即可,我想问这些ini文件只能使用手工编写吗,我见到很多ini文件参数极多不象手写好象是机器生成的,不知道如何生成啊?请大家指教

1、其实PB中在新建---点TOOL----FILE EDIT 可以生成(编辑)INI文件。最直接就是工具栏中的EDIT图标。

2、机器生成代码是:点DATABASE图标-----选择连接方式。如:选 MSS MICROSOFT SQL SERVER 右键-NEW PROFILE 按要求填定一些参数后在--PREVIEW中可以看到代码,把它复制到INI文件中就行了。

3编程经验--PB数据库连接

作者:郭洪建 无法确定网上来源,如有准确首发,请与本站联系

通过这些年的信息系统开发经验,使我对POWERBUILDER的理解更进一步,最近在开发某子系统模块时,遇到了一个奇怪的问题,这里给大家介绍一下

通常在使用PB和数据库管理系统(DBMS)连接时,使用两种方式:

一、开放数据源接口(ODBC)连接

ODBC是通过支持美国微软公司开放服务结构(WOSA,Windows Open Services Architecture)中的一部分在PB 中通过配置 SQLCADBMS=‘ODBC’对象的属性可使应用程序通过ODBC连接到数据库。

ODBC的具体配置包含了数据源、驱动程序类型、缓冲池等各种细节参数。

例子:

SQLCADBMS = "ODBC"

SQLCAAutoCommit = False

SQLCADBParm="C,C"

PWD="',C"

二、专用数据库接口

每个数据库管理系统(DBMS)均提供相应的客户端驱动,为了更好的服务于数据库。

在这里我们使用的是Microsoft sqlserver 2000 的客户端程序。通过设置 SQLCADBMS ="MSS Microsoft SQL Server" 使客户端通过专用数据库接口连接到数据库。

该类接口的参数配置除了服务器名、数据库名、LogId、LogPass外还包含了连接协议等用户验证方式等,可通过服务器端或客户端的配置程序进行配置。

SQLCAdbms= "MSS Microsoft SQL Server" //接口类型

SQLCAdatabase= "master" //数据库

SQLCAuserid= ""

SQLCAdbpass= ""

SQLCAlogid= "sa"

SQLCAlogpass= "xxxx"

SQLCAserverName= "\xxx"//服务器名

SQLCAdbparm= "Commit"

SQLCAautocommit= false

以上介绍的是PB与数据库连接时常用的方法。

往往根据不同的应用环境选择连接方式, 在单机环境下多采用的是ODBC连接,因为在发行环节上相对要容易些。在网络环境下多采用专用数据库连接,这样可以提高系统的可靠性与执行效率。专用数据库的发行环节往往要配上相应DBMS客户端的动态连接库(DLL),并把它

PB与ASA数据库连接问题!

一连接步骤

1添加数据源。WINDOWS98中----我的电脑---控制面版----ODBC数据源32位-----系统DSN---添加---选择你使用的数据库

2在工具条上点击DB PROFILE 选择已建立好的数据库连接,单击EDIT在d出的对话框中选PREVIEW里面就是连接数据库的语句,COPY就OK了。

二DB_profile写法(以lincom的tax例程为例)

taxini

[Database]

DBMS=ODBC

Database=test

DbParm=c

三打包所需文件

参看以下文章:

四容易出现的问题及解决方法

导致ASA数据库无法连接的问题有以下几种:

1、ODBC配置错误。没有配置数据源,数据库的用户名或口令错误等都会导致数据库无法连接。

解决的办法:检查数据源的配置,如果没有在ODBC中配置数据源则按照向导添加数据源即可;口令错误只需改为正确的即可。

2、连接时提示LOG文件错误。这样的问题大多出现在重装系统后、源码移植到其他系统、数据库文件路径改变之后。

解决的办法:在创建ASA数据库的时候不创建LOG文件,如果已经创建了LOG文件则可以利用PB自带的工具Sybase central来去掉LOG文件和数据库文件的关联。 *** 作步骤如下:

a)启动Sybase central在左边的树型目录中选择Utilities;

b)双击右边出现的条目中的change log file settings,直接next;

c)点Browse选择需要去除log文件的数据库文件,选好后next;

d)这里你会看到一些数据库的信息,log文件名,文件大小等。next;

e)去掉Maintin the following transaction log file前面的对勾,Finish;

f)配置ODBC连接数据库就可以了。

3、数据库文件损坏。此类错误一般不常见,可能由于病毒破坏或误 *** 作引起。

解决的办法:如果以前有备份用备份文件覆盖原文件即可,如果没有备份文件就只能重新建库了!

PB8如何使用OLE DB练到ASA数据库

(本文来自sybase网站 翻译 by 金色年华)

原文出处:

Connecting to ASA Server (701 GA) via OLE DB in PowerBuilder 8

Adaptive Server Anywhere includes an OLE DB provider named ASAProv One of the features of ASAProv (dboledb7dll) is that you do not have to deploy ODBC In other words, you can connect to an ASA database either via OLE DB or via OLE DB/ODBC bridge

在pb中通过OLE DB连接到ASA数据库的步骤如下:

在命令提示符下键入如下命令,启动 ASADEMO:

dbsrv7 asademo -x tcpip -n asademo

("asademo" - 你选择运行的数据库 确定你没有正在运行一个同名的数据库,否则会出错)

有两个方法通过 OLE DB 连接到 ASA Server:

1) OLE DB/ODBC bridge

对于这种连接,你必须在数据库参数中,指定有效的 ODBC 数据源,连接的脚本如下:

// Profile asa_oledb

SQLCADBMS = "OLE DB"

SQLCALogPass = "sql"

SQLCALogId = "dba"

SQLCAAutoCommit = False

SQLCADBParm = "PROVIDER='ASAProv',DATASOURCE='asa'"

2) OLE DB (不需要配置 ODBC)

你可以通过一个扩展名为udl的单独的文件,提供连接信息,在OLE DB中访问数据这个文件与 Microsoft DataLink (udl) file 类似 你必须在系统中安装 Datalink API 以便于创建和使用 udl 文件

创建 udl文件的方法:

在当前目录里的空白处单击鼠标右键,选择新建文件,选择 Microsoft Data Link如果没有创建 Microsoft Data Link 的选项,需要创建一个文本文件,然后更改扩展名为 udl双击这个文件,添加连接信息详情请访问msdnmicrosoftcom 搜索 Data Link(此处原文有乱码,具体内容不详)

pb连接MS SQL Server问题!

一连接步骤

1)服务器安装SQL Server并启动,创建数据库。

2)客户机安装SQL Server客户端。

3)启动PB,配置数据源描述(通过直连接口,不建议用ODBC)。

4)连接。

二DB_profile的写法

在ini文件里设置

[Database]

DBMS=MSS Microsoft SQL Server 6x

Database=databasename

UserId=

LogID=

DatabasePassword=

LogPass=

ServerName=

AutoCommit=False

在程序里用profilestring读取

附加资料:ms sql server 配置文件设置

ms sql server 配置文件设置:

dbms="mss"//只须在ini文件中用这个代码便告诉pb使用的ms sql server

Database:所用数据库

LogId:sql server的登陆账号

LogPass=口令

servername:允许数据库服务器连接的计算机名

autocommit:控制pb 是工作在事务处理范围内还是工作在事务处理范围外

dbparm:dbms的专用连接参数

以下参数:

language:在显示错误消息和日期格式时指定要使用的语言,在服务器上必须设置该直

lock:事务处理隔离层

log:文本和图像数据的更新是否应该纪录到事务日志中

systemprocs:系统存储过程和用户定义的存储过程是否显示在各种各样的pb画板中

pbcatalogowner:pb存储中表的缺省者

async:允许在服务器上进行同步 *** 作0:同步,1:异步

dbgettime:当async=1时,使用该参数设置用户在检索行时pb等待来自pb的响应的秒数

cursorlock:release和cursorscroll参数一起使用可设置光标的锁定选项lock,opt,optval,readonly

cursorscroll:设置光标的滚动选项

staticbind:控制pb是否在检索数据前获取dbms中的结果集描述

dbtextlimit:控制返回的文本字段的最大长度而不用将文本作为二进制大型数据对象来处理

appname:设置连接时所使用的应用程序名

host:设置连接似的工作站名

packetsize:设置使服务器向pb传送数据时所设置的包大小

secure:设置是否想使用winnt集成逻辑安全性和安全sql server连接 缺省0使用标准安全性,1集成安全性

PowerBuilder与Oracle的连接

PowerBuilder(PB)和Oracle分别是前端开发工具和RDBMS的主流产品。PB提供了两种与Oracle连接的接口:PowerSoft内置的数据库接口(Native Database Interface)和ODBC接口。本文介绍使用PB60内置Oracle接口的方法,包括数据描述文件的设置、存储过程的调用和存储过程作为数据窗口数据源的 *** 作方法等内容,使用的RDBMS的Oracle 73。

PowerBuilder与Oracle的连接

假定已安装Oracle客户端应用程序。可用Sqlplus或Tnsping等是否能连接到Oracle数据库,确定在SQLNET配置文件中使用的数据库别名(Database Alias,又称服务器名,Server Name)。如有疑问,可在Oracle客户端程序目录下tnsnameora文件中找到。另外保证搜索路径已包括SQLNET应用程序的安装目录(如C:\ORAWIN95\BIN)。

进入PB的Database Profiles画笔,可看到所有已安装的数据库接口(PB60缺省安装的是Oracle 73版的接口,如使用低版本的Oracle,需在安装时指定),选择“O73 Oracle 73”,点击“New”按钮,进入Database Profile Setup对话框。在“Connection”页输入下列信息:

Profile Name:为该Database Profile起一个有意义的名称;

Server:TNS:ServerName,其中ServerName为上述数据库别名(服务器名),如@TNS:ORA73;

Login ID:Oracle数据库中实际的用户名,由于PB初次连接到数据库时要自动建立五个系统表(PowerBuilder Catalog Table;SCATTBL,PBCATCOL,PBCATEDT,PBCATFMT,PBCATVLD,存储表的扩展属性),因此第一个连接到Oracle的用户必须具有建表、给PUBLIC角色授权等权限。例如可用SYSTEM用户进行第一次连接,此后的连接对用户则无特殊要求;

Password:该用户的口令。

设置上述内容后,即可连上Oracle。为优化数据库连接,还可设置下列选项:

Prompt for Database Information:连接时是否提示用户输入用户名和口令;

Generate Trace:启动DB跟踪工具,跟踪连接;

Thread Safe:开发需要多线程环境支持的分布式应用时,选择该项。缺省为未选,适用于非分布应用;

PBDBMS:与存储过程调用方式有关的参数。Oracle为72或更高版本时,清除该选项,此时带IN OUT参数的存储过程可作为数据窗口数据源。72版本以下,选择该项,调用PBDBMSPut-Line建立存储过程的SQL语句,缺省是选中;

Commit on Disconnect:断开连接时,指定提交或回退未提交的事务;

Case Sensitive:连接的Oracle服务器是否区分大小写。注意该项选中时,所有主键、包含主键的表名、外键须全为大写字符。

PowerBuilder Catalog Tables Owner:指定拥有PB系统表的用户,缺省为“SYSTEM”。如果要使用多种显示格式或有效性规则,可以在不同的用户下建立几套系统表;

Table Criteria:指定满足哪些条件的表、视图和同义词可在“Select Tables”对话框中显示出来。例如DEV用户下销售子系统的表都以SALE开头,则可以用SALE%、DEV、“TABLE”、“VIEW”指定只显示DEV用户以SALE开头的表和视图;

Asynchronous:选择该项,可在一个复杂的SQL语句执行过程中,返回第一行结果前,切换到其他 *** 作;

Number of Seconds to Wait:若上一项选中,还可进一步通过该项指定检索数据时,等待数据库响应的时间;

Retrieve Blocking Factor:决定数据窗口对象一次可从数据库取出的记录数;

Number of SQL Staments Cached:PB可将数据窗口对象产生的SQL语句和嵌入式SQL语句保存在SQL语句缓冲区,该参数指定缓冲区为PB保留的SQL语句数目。该数值可由下式计算:SQLCache=服务器OPEN—CURSORS数-5(保留的游标数)-本连接预期使用的最大游标数;

Disable Bind:指定是否将输入变量与SQL语句绑定,此参数影响PB为数据窗口对象生成INSERT语句的方式;

Static Bind:数据窗口对象检索数据前是否检测SELECT语句的合法性;

在Syntax页,还可指定日期、时间的格式等。在Preview页可查看Database Profile设置对应的PowerScript写法。

Oracle存储过程的使用

归纳起来PB60中调用Oracle存储过程有以下四种方法。

方法一:以关键字RPCFUNC声明存储过程;

方法二:以DECLARE PROCEDURE语句声明存储过程;

方法三:以动态SQL语句实现;

方法四:调用函数PBDBMSPut-Line。

一般情况下,方法一能得到较好的运行效率和更完善的功能。因此推荐使用方法一。但是某些类型的存储过程只能使用其他方法。以下重点介绍方法一和方法二。

两种方法比较起来,有以下几点主要区别:

1)方法一适用于具有IN、OUT和IN OUT参数的存储过程,而方法二仅支持IN

PB10连接SQL Server的配置

可能初次使用pb10的朋友无法顺利连接到sql server,一方面没有了mssql server专用接口了,另一方面数据库管理系统(DBMS)换成了“OLE DB”,配置起来有点不顺手!下面就来介绍pb10中用OLE DB连接sql 2000数据库。

在安装pb10的时候选择custom/full方式安装(默认的安装方式不会安装ole db接口),next-》如果你没有安装net则不要选择列表中的ADOnet项。一路next完成安装。

在数据库画板中找到OLE microsoft OLE DB项,在其上右键新建一个配置,在d出的配置窗口中:

profile name:填写配置文件名 //任意即可

provider:选择数据库管理系统类型,这里选择“SQLOLEDB”项

data source:服务器名(和之前的版本不太一样)。可以在下拉列表中选择,也可以填入服务器名或IP地址如:127001等。如果上面的provider不是“SQLOLEDB”则此下拉列表中可能没有选项。

user ID:用户名。我的用户名是默认的sa

password:对应上面user ID的密码,我的密码是空的,所以不填。

到这里你就可以顺利的连接到sql server了。但是连接到哪个数据库呢?上面的参数都没有指明,我也找了半天。不要着急,在Extended里填入 “database=数据库名” 就可以了。(不要引号)

最后的配置文件内容为:

// Profile his

SQLCADBMS = "OLE DB"

SQLCALogId = "sa" //我的用户名是sa

SQLCAAutoCommit = False

SQLCADBParm = "PROVIDER='SQLOLEDB',DATASOURCE='NETMANAGER',PROVIDERSTRING='database=zs'" //我的数据库名是:zs;datasource后面也可以是IP地址:DATASOURCE='127001'

至此就完成了pb10下用OLE DB连接sql server的配置!

在PB中使用FoxPro数据库的方法

重庆工业管理学院 蒋波

---- Power Builder 是十分优秀的用于客户/服务器环境信息管理系统开发工具,其优秀之处不仅是因为可以开发基于客户/服务器模式的系统,而且简单、易学,Power Builder 自身是没有数据库管理系统(DBMS)的,它是首先通过不同的驱动程序联接不同的数据库,再通过这种联接,实现对数据的管理。Power Builder同时随盘附带有一个小型的数据库管理系统:SQL Anywhere,所以用户也可以直接开发用于单机的完整的信息管理系统。

---- 本人以前曾开发过基于FoxPro环境下的数据库系统,但FoxPro的编程太麻烦,不但要处理数据的管理,而且还要花大量的精力处理输入、输出的格式等。但有着可视化编程环境的Power Builder却不同,处理输入、输出是件相当简单的事情,于是,本人偿试用Power Builder来管理以前的数据库。 c在Power Builder系统中,使用FoxPro的数据库有两种方法:一是利用ODBC联接FoxPro数据库;另一种方法是将FoxPro的数据库转换到SQL Anywhere的数据格式。

---- 一、 利用ODBC联接FoxPro数据库

---- 在Power Builder中,直接访问FoxPro数据库只能通过ODBC方式。

---- 在开发环境下,可以直接在PowerBar画板上配置ODBC,联接FoxPro数据库,方法如下:

单击Configure ODBC工具钮

在Installed Drivers目录框中选择:Microsoft Foxpro Driver (dbf)

单击“Create”按钮

命名数据源名、选择版本

取消“使用当前工作目录”选项

单击选定目录,选择被联接数据库所在的目录

确定退出

---- 通过ODBC方式联接的FoxPro的数据库,一定要满足FoxPro的数据库格式,即数据库文件结构必须是:“32字节文件描述若干个32字节的字段描述 结构描述结束符(0D) 记录1,记录2,…… 文件结束符(1A)”。由此看来,传统的DBF数据库文件均可通过该方式联接。对于Visual FoxPro环境下建立的表(Table),其结构与传统的数据库结构是不同的,它在字段描述结束符(0D)与记录之间加上了二百多个字节的内容,但在未纳入VFP的数据库(Dbc)之前,其内容为“00”,此时仍可以通过这种方式联接,一旦纳入数据库中,该段字节已被填上了其它内容,无法再联接。

---- 在Power Builder应用程序中,使用事务处理对象来联接数据库,这种事务处理对象,即有默认的SQLCA,用户也可以自己生成,以方便访问多个数据库。在程序中使用事务处理对象时,一般必须先指明DBMS、DbParm两个属性,对于FoxPro数据库,还必须指明 Database、 userid、servername、几个属性,这一点是与访问其他类型的数据库不同的地方。

sqlcadbms="ODBC" // 指定联接方式ODBC

sqlcadatabase="D:\prg\pubdata" // 指定被联接数据库所在目录

sqlcauserid="public" // 用户识别号,都为 public

sqlcaservername="FOXPRO" // 服务器名:均为FOXPRO

sqlcadbparm="C" //数据源名

connect using sqlca; // 实施联接

……

---- 通过对FoxPro数据库的联接,用户便可以在Power Builder开发环境下、应用程序中使用这些数据库,快速地开发出自己的信息管理系统,实现对这些数据库的维护与管理。

---- 二、 将DBF文件转换为SQL Anywhere 的DB文件格式

---- 在Power Builder环境下,附带有一个数据库系统——SQL Anywhere,在Power Builder中利用它,用户可以直接建立、维护数据库。在SQL Anywhere中,数据库结构虽然与VFP不同,但概念是一致的,即:数据库是系统中相关的各种数据,这些数据又因不同用途组织成不同的表,这些表共同构成数据库,与传统的数据库(DBF)相类比,PB、VFP中的表即是传统意义的数据库,PB、VFP中的数据库类似于传统的数据库(DBF)文件所在的目录。SQL Anywhere中提供了将传统的DBF文件转换为该系统下的数据库文件(DB)中的表的工具。为了实现这一转换,用户必须先建立一个新的表,再将DBF格式的文件内容导入该表中。

---- 对于DBF文件,必须是传统意义上的数据库,如FoxPro、dBase、FoxBASE环境下的数据库文件。该种数据库文件严格遵循“数据文件==数据库结构+数据库记录”这一格式。其结构如下:“32字节文件描述若干个32字节的字段描述 结构描述结束符(0D) 记录1,记录2,…… 文件结束符(1A)”

03 62 0A 07 02 00 00 00 - 81 00 4C

00 00 00 00 00 // 文件描述:时间、长

00 00 00 00 00 00 00 00 - 00 00 00

00 00 00 00 00 度、记录长、记录数

4E 41 4D 45 00 00 00 00 - 00 00 00

43 01 00 00 00 // 第一个字段:名、类

28 00 00 00 00 00 00 00 - 00 00 00<

这是我用来交作业的程序虽然不是自己写的传上来再说了

等我自己的可以用了再传

package jettang;

import javalang;

import javaawt;

import javaawtevent;

import javaxswing;

import javasql;

//////////////////////////////////////////////

//主类

public class STU {

public STU() {

try {

jbInit();

} catch (Exception ex) {

exprintStackTrace();

}

}

public static void main(String args[]) {

new Frm_Main();

}

private void jbInit() throws Exception {

}

}

//主框架,数据库

class Frm_Main implements ActionListener { //throws IOException

public static final int EXIT_ON_CLOSE = 0;

public JFrame frame;

public Container c;

public JMenuBar menuBar;

public JMenu mainMenu1;

public JMenu mainMenu2;

public JMenu mainMenu3;

public JMenuItem subMenu1[] = new JMenuItem[5];

public JMenuItem subMenu2[] = new JMenuItem[7];

public JMenuItem subMenu3[] = new JMenuItem[2];

JButton toolBarButton[] = new JButton[8];

public JToolBar toolBar;

//////////////////////////////////////////////

String strTip[] = {"姓名查询", "添加信息",

"删除", "修改", "修改确认",

"添加确认", "删除确认", "关于产品信息:)"};

//////////////////////////////////////////////

// String id = new String();

String name = new String();

String sex = new String();

String age = new String();

String classid = new String();

String department = new String();

String call = new String();

//////////////////////////////////////////////

Connection con;

ResultSet rs;

Statement st;

// ResultSetMetaData rsmd;

// Vector columnHeads=new Vector();

// Vector rows = new Vector();

// Vector currentRow=new Vector();

///////////////////////////////////////////////

public JLabel classidL = new JLabel("班级");

public JLabel nameL = new JLabel("姓名");

public JLabel sexL = new JLabel("性别");

public JLabel ageL = new JLabel("年龄");

public JLabel departmentL = new JLabel("单位");

public JLabel callL = new JLabel("电话");

public JLabel tittleLabel = new JLabel();

//////////////////////////////////////////////

public JTextField classidT = new JTextField();

public JTextField nameT = new JTextField();

public JTextField sexT = new JTextField();

public JTextField ageT = new JTextField();

public JTextField departmentT = new JTextField();

public JTextField callT = new JTextField();

public JTextArea textT = new JTextArea();

//////////////////////////////////////////////

//////////////////////////////////////////////

public Frm_Main() {

/////////////////////////////////////////////////

frame = new JFrame("学籍管理系统V10");

c = framegetContentPane();

csetLayout(null);

menuBar = new JMenuBar();

toolBar = new JToolBar();

toolBarsetFloatable(false);

framesetJMenuBar(menuBar);

framesetResizable(false);

////////////////////////////////////////////////

mainMenu1 = new JMenu("管理");

String str1[] = {"添加", "删除", "查询", " ", "关闭"};

for (int i = 0; i < 5; i++) {

if (i == 3) {

mainMenu1addSeparator();

} else {

subMenu1[i] = new JMenuItem(str1[i]);

subMenu1[i]addActionListener(this);

mainMenu1add(subMenu1[i]);

}

}

menuBaradd(mainMenu1);

/////////////////////////////////////////////////

mainMenu2 = new JMenu(" *** 作");

String str2[] = {"查询", "添加", "删除", "修改",

"提交修改", "提交添加", "提交删除"};

for (int i = 0; i < 7; i++) {

subMenu2[i] = new JMenuItem(str2[i]);

subMenu2[i]addActionListener(this);

mainMenu2add(subMenu2[i]);

}

menuBaradd(mainMenu2);

/////////////////////////////////////////////////

mainMenu3 = new JMenu("集体查询");

String str3[] = {"按班级", "按单位"};

for (int i = 0; i < 2; i++) {

subMenu3[i] = new JMenuItem(str3[i]);

subMenu3[i]addActionListener(this);

mainMenu3add(subMenu3[i]);

}

menuBaradd(mainMenu3);

////////////////////////////////////////////////

String strToolBar[] = {"查询", "添加", "删除", "修改", "提交修改",

"提交添加", "提交删除", "关于"};

for (int i = 0; i < 8; i++) {

toolBarButton[i] = new JButton(strToolBar[i]);

toolBarButton[i]setToolTipText(strTip[i]);

toolBarButton[i]addActionListener(this);

toolBaradd(toolBarButton[i]);

}

toolBarsetLocation(0, 0);

toolBarsetSize(400, 30);

cadd(toolBar);

////////////////////////////////////////////////

classidLsetLocation(35, 40);

classidLsetSize(40, 20);

//classidLsetFont(new Font("",FontBOLD,12));

cadd(classidL);

classidTsetLocation(90, 40);

classidTsetSize(200, 20);

//classidTsetEnabled(false);

cadd(classidT);

nameLsetLocation(35, 70);

nameLsetSize(40, 20);

cadd(nameL);

nameTsetLocation(90, 70);

nameTsetSize(200, 20);

cadd(nameT);

sexLsetLocation(35, 100);

sexLsetSize(40, 20);

cadd(sexL);

sexTsetLocation(90, 100);

sexTsetSize(200, 20);

cadd(sexT);

ageLsetLocation(35, 130);

ageLsetSize(40, 20);

cadd(ageL);

ageTsetLocation(90, 130);

ageTsetSize(200, 20);

cadd(ageT);

departmentLsetLocation(35, 160);

departmentLsetSize(40, 20);

cadd(departmentL);

departmentTsetLocation(90, 160);

departmentTsetSize(200, 20);

cadd(departmentT);

callLsetLocation(35, 190);

callLsetSize(40, 20);

cadd(callL);

callTsetLocation(90, 190);

callTsetSize(200, 20);

cadd(callT);

/////////////////////////////////////////////////

tittleLabelsetText("----------集体查询结果--------");

tittleLabelsetSize(300, 20);

tittleLabelsetLocation(10, 210);

cadd(tittleLabel);

////////////////////////////////////////////

textTsetSize(400, 300);

textTsetLocation(10, 240);

cadd(textT, 14);

///////////////////////////////////////////////

framesetDefaultCloseOperation(JFrameEXIT_ON_CLOSE);

framesetSize(500, 650);

framesetLocation(200, 200);

framesetVisible(true);

conDB();

}

//以上是框架设计

//JDBC

public void conDB() {

try {

ClassforName("sunjdbcodbcJdbcOdbcDriver");

} catch (ClassNotFoundException e) {

JOptionPaneshowMessageDialog(null, "数据库错误");

}

try {

con = DriverManagergetConnection("jdbc:odbc:jettang", "sa", "");

st = concreateStatement();

} catch (SQLException e) {

JOptionPaneshowMessageDialog(null, "数据库连接失败");

}

}

//关闭连接

public void closeDB() {

try {

stclose();

conclose();

} catch (SQLException e) {

JOptionPaneshowMessageDialog(null, "数据库关闭失败");

}

}

//事件响应

public void actionPerformed(ActionEvent e) {

//////////////////////////////////////////////

if (egetSource() == toolBarButton[7]) {

JOptionPaneshowMessageDialog(null, "当前版本10,designed by qyq & wxm");

}

/////////////////////////////////////////////查询(按姓名)

if (egetSource() == subMenu2[0] || egetSource() == toolBarButton[0] ||

egetSource() == subMenu1[2]) {

String idid = JOptionPaneshowInputDialog("请输入学生姓名");

if (ididtrim() != "") {

String strSQL = "select from stuinfo where name ='" + idid +

"'";

try {

rs = stexecuteQuery(strSQL);

int count = 0;

while (rsnext()) {

classid = rsgetString("classid");

name = rsgetString("name");

department = rsgetString("department");

sex = rsgetString("sex");

age = rsgetString("age");

call = rsgetString("call");

++count;

}

if (count == 0) {

JOptionPaneshowMessageDialog(null, "无此信息");

} else {

classidTsetText(classid);

nameTsetText(name);

sexTsetText(sex);

ageTsetText(age);

callTsetText(call);

departmentTsetText(department);

}

} catch (Exception ex) {

JOptionPaneshowMessageDialog(null, "查询失败");

}

}

}

/////////////////////////////////////////////关闭

if (egetSource() == subMenu1[4]) {

framedispose();

closeDB();

}

/////////////////////////////////////////////添加

if (egetSource() == subMenu1[0] || egetSource() == subMenu2[1] ||

egetSource() == toolBarButton[1]) {

JOptionPaneshowMessageDialog(null, "请输入你添加的信息再点击提交添加键");

classidTsetEnabled(true);

classidTsetText("");

nameTsetText("");

sexTsetText("");

ageTsetText("");

callTsetText("");

departmentTsetText("");

}

/////////////////////////////////////////////提交添加

if (egetSource() == toolBarButton[5] || egetSource() == subMenu2[5]) {

if ((classidTgetText()trim())equals("") ||

(nameTgetText()trim())equals("") ||

(sexTgetText()trim())equals("") ||

(ageTgetText()trim())equals("") ||

(callTgetText()trim())equals("") ||

(departmentTgetText()trim())equals("")) {

JOptionPaneshowMessageDialog(null, "请先点击添加键");

} else {

classid = classidTgetText();

name = nameTgetText();

sex = sexTgetText();

age = ageTgetText();

call = callTgetText();

department = departmentTgetText();

String strSQL =

"insert into stuinfo(classid,name,sex,age,call,department) values('" +

classid + "','" +

name + "','" + sex + "','" + age + "','" + call + "','" +

department + "')";

try {

stexecuteUpdate(strSQL);

} catch (Exception exx) {

JOptionPaneshowMessageDialog(null, "添加失败");

return;

}

JOptionPaneshowMessageDialog(null, "添加成功");

classidTsetText("");

nameTsetText("");

sexTsetText("");

ageTsetText("");

callTsetText("");

departmentTsetText("");

}

}

////////////////////////////////////////////提交修改

if (egetSource() == subMenu2[4] || egetSource() == toolBarButton[4]) {

if ((classidTgetText()trim())equals("") ||

(nameTgetText()trim())equals("") ||

(sexTgetText()trim())equals("")

|| (ageTgetText()trim())equals("") ||

(callTgetText()trim())equals("") ||

(departmentTgetText()trim())equals("")) {

JOptionPaneshowMessageDialog(null, "请先点击修改键");

return;

} else {

classid = classidTgetText();

name = nameTgetText();

sex = sexTgetText();

age = ageTgetText();

call = callTgetText();

department = departmentTgetText();

String strSQL = "update stuinfo set classid='" + classid +

"',sex='" + sex + "',age='" + age + "',call='" +

call + "',department='" + department + "'" +

"where name='" + name + "'";

try {

stexecuteUpdate(strSQL);

} catch (Exception exx) {

JOptionPaneshowMessageDialog(null, "修改失败");

return;

}

JOptionPaneshowMessageDialog(null, "修改成功");

classidTsetText("");

nameTsetText("");

sexTsetText("");

ageTsetText("");

callTsetText("");

departmentTsetText("");

}

}

///////////////////////////////////////////////修改

if (egetSource() == subMenu2[3] || egetSource() == toolBarButton[3]) {

String idid = JOptionPaneshowInputDialog

("请输入你要修改的学生姓名后点击提交修改键确认");

if (ididtrim() != "") {

String strSQL = "select from stuinfo where name ='" + idid +

"'";

try {

rs = stexecuteQuery(strSQL);

int count = 0;

while (rsnext()) {

classid = rsgetString("classid");

name = rsgetString("name");

department = rsgetString("department");

sex = rsgetString("sex");

age = rsgetString("age");

call = rsgetString("call");

++count;

}

if (count == 0) {

JOptionPaneshowMessageDialog(null, "无此信息");

} else {

classidTsetText(classid);

nameTsetText(name);

sexTsetText(sex);

ageTsetText(age);

callTsetText(call);

departmentTsetText(department);

classidTsetEnabled(false);

}

} catch (Exception ex) {

JOptionPaneshowMessageDialog(null, "修改失败");

}

}

}

/////////////////////////////////////////////////删除

if (egetSource() == subMenu2[2] || egetSource() == toolBarButton[2] ||

egetSource() == subMenu1[1]) {

String idDel = JOptionPaneshowInputDialog

("请输入要删除的学生姓名后点击提交删除键确认");

if (idDeltrim() != "") {

String strSQL = "select from stuinfo where name ='" + idDel +

"'";

try {

rs = stexecuteQuery(strSQL);

int count = 0;

while (rsnext()) {

classid = rsgetString("classid");

name = rsgetString("name");

department = rsgetString("department");

sex = rsgetString("sex");

age = rsgetString("age");

call = rsgetString("call");

++count;

}

if (count == 0) {

JOptionPaneshowMessageDialog(null, "无此信息");

} else {

classidTsetText(classid);

nameTsetText(name);

sexTsetText(sex);

ageTsetText(age);

callTsetText(call);

departmentTsetText(department);

classidTsetEnabled(false);

}

} catch (Exception ex) {

JOptionPaneshowMessageDialog(null, "删除失败");

}

}

}

//////////////////////////////////////////////////提交删除

if (egetSource() == toolBarButton[6] ||

egetSource() == subMenu2[6]) {

if ((classidTgetText()trim())equals("") ||

(nameTgetText()trim())equals("") ||

(sexTgetText()trim())equals("") ||

(ageTgetText()trim())equals("") ||

(callTgetText()trim())equals("") ||

(departmentTgetText()trim())equals("")) {

JOptionPaneshowMessageDialog(null, "请先点击删除键");

return;

} else {

name = nameTgetText();

String strSQL = "delete from stuinfo where name='" + name +

"'";

try {

stexecuteUpdate(strSQL);

} catch (Exception exx) {

JOptionPaneshowMessageDialog(null, "删除失败");

return;

}

JOptionPaneshowMessageDialog(null, "删除成功");

classidTsetText("");

nameTsetText("");

sexTsetText("");

ageTsetText("");

callTsetText("");

departmentTsetText("");

}

}

//////////////////////////////////////////////集体查询(按班级)

if (egetSource() == subMenu3[0]) {

classidTsetText("");

nameTsetText("");

sexTsetText("");

ageTsetText("");

callTsetText("");

departmentTsetText("");

if ((classidTgetText()trim())equals("")) {

String idclass = JOptionPaneshowInputDialog("请输入班级");

String strSQL = "select from stuinfo where classid='" +

idclass +

"'";

try {

rs = stexecuteQuery(strSQL);

displayres(rs);

} catch (Exception ex) {

JOptionPaneshowMessageDialog(null, "查询失败");

}

} else {

String idclass = classidTgetText();

String strSQL = "select from stuinfo where classid='" +

idclass +

"'";

try {

rs = stexecuteQuery(strSQL);

displayres(rs);

} catch (Exception ex) {

JOptionPaneshowMessageDialog(null, "查询失败");

}

}

}

////////////////////////////按单位

if (egetSource() == subMenu3[1]) {

classidTsetText("");

nameTsetText("");

sexTsetText("");

ageTsetText("");

callTsetText("");

departmentTsetText("");

if ((departmentTgetText()trim())equals("")) {

String idclass = JOptionPaneshowInputDialog("请输入单位");

String strSQL = "select from stuinfo where department='" +

idclass +

"'";

try {

rs = stexecuteQuery(strSQL);

displayres(rs);

} catch (Exception ex) {

JOptionPaneshowMessageDialog(null, "查询失败");

}

} else {

String idclass = departmentTgetText();

String strSQL = "select from stuinfo where department='" +

idclass +

"'";

try {

rs = stexecuteQuery(strSQL);

displayres(rs);

} catch (Exception ex) {

JOptionPaneshowMessageDialog(null, "查询失败");

}

}

}

}

public void displayres(ResultSet rs1) throws SQLException {

//定位到达第一条记录

boolean moreRecords = rs1next();

//如果没有记录,则提示一条消息

if (!moreRecords) {

JOptionPaneshowMessageDialog(null, "无此记录");

return;

}

try {

//获取数据

getNextRow(rs1);

//刷新Table

cvalidate();

}

catch (SQLException sqlex) {

sqlexprintStackTrace();

}

}

public void getNextRow(ResultSet rs2) throws

SQLException {

int count = 1;

while (rs2next()) {

name = " 姓名:" + rs2getString(1);

age = " 年龄:" + rs2getString(2) + " 单位:";

department = rs2getString(3) + "\n";

textTappend(count + "" + name + age + department);

count++;

}

}

}

很久没用过PB了,网上找了一篇,大致看了一下,应该没什么问题

--转自51CTO论坛

在PowerBuilder里面 *** 作BLOB数据地灵活技术

PowerBuilder提供的BLOB(Binary Large Object)数据类型可以用来处理大型数据,包括图像、大文本、Word文档、二进制文件和多媒体等各种数据,它的长度可以是0~2GB字节,我们利用BLOB类型的变量可以将数据传递给数据库以大字段方式存储。但是用通常的数据窗口技术无法将BLOB类型数据加入到数据库中,也不能将数据库中相应字段的数据提取出来,即使在程序中直接使用UPDATE和SELECT等SQL语句也是无法对BLOB类型数据进行 *** 作的。下面笔者将介绍在PowerBuilder 70中 *** 作BLOB类型数据的技巧。

程序设计原理

在PB中实现BLOB类型数据的入库和查询,主要要用到两条特殊的SQL命令——UPDATEBLOB和SELECTBLOB,首先定位要进行 *** 作的记录,然后使用UPDATEBLOB命令就可以将BLOB类型变量中存放的数据传递给数据库,而使用SELECTBLOB则是将指定记录中的大字段数据传递给BLOB变量。

使用BLOB类型变量获取外界文件的数据内容,还必须借助于PB提供的可视化OLE控制对象,通过它可以将指定的文件内容显示成相应的对象(如BMP),双击它就可以激活相应的OLE服务器应用程序,来编辑修改对象的内容,同时也可以读取对象的数据内容(利用OLE控件的ObjectData属性),给BLOB类型变量赋值。

下面结合一个简单的程序实例,讲述如何处理BLOB数据类型。在这个例子中,BMP将作为一个大字段存储在数据库中。我们选择Microsoft Access 2000作为后台数据库,它的字段类型中包含“OLE对象”类型(如果选择MS SQL Server作为数据库服务器,可以使用TEXT或IMAGE类型字段存放大字段数据),这样就为管理多媒体数据、大文件和提供了支持。

*** 作BLOB字段的实现过程

我们在Access中创建一个新的数据库文件,文件名是bmpmdb,在其中定义BMP数据表bmptable如下:

各字段的其它设置(如字段宽度等),均采用缺省形式即可。

编程前还需要做的一步准备工作是在 *** 作系统的ODBC配置中建立指向bmpmdb数据库的连接,名称定为bmptable。

下面的程序片段实现了数据库的连接,的插入、更新、删除和查询。考虑文章的篇幅,本文只列出与主题相关的程序源码。

1 连接Access数据库

SQLCADBMS = "ODBC"

// SQLCA为全局transaction事务变量

SQLCAAutoCommit = False

SQLCADBParm = "Connectstring='DSN=bmptable;UID=WD='"

CONNECT USING SQLCA;

If SQLCA SQLCode <> 0 Then

MessageBox ("数据库错误", "连接失败!")

Halt close;

End If

2 将BMP存入数据库

integer bmpno,icount

//变量bmpno存放给定的编号

string filepath,filename

blob blb_tmp

//…此处对编号bmpno赋值,例如bmpno=101;可以通过程序实现为d出对话框窗口提供一个编号

//查询指定的编号是否已经存在

icount=0

SELECT COUNT() INTO :icount

FROM bmptable

WHERE bmptablebmpno=:bmpno

USING SQLCA; //:bmpno为给定的编号

if icount>0 then

MessageBox("查询结果",string(bmpno)+" 号已经存在,请输入一个新的编号")

return

end if

//在OLE控制对象ole_1中插入BMP文件

GetFileOpenName("请选择一个需要插入的BMP文件",filepath,filename,"BMP","BMP文件(BMP),BMP")

If Len(filepath)=0 Then

Return

End If

If ole_1InsertFile(filepath)<>0 Then //OLE错误

Return

End If

//新入库

string sql

sql= "INSERT INTO bmptable (bmpno,bmpdata,bmpname) &&

VALUES ("&&

+string(bmpno)+",'','"&&

+filename+"')"

EXECUTE IMMEDIATE :sql;

If SQLCASQLDBCode=0 Then

COMMIT USING SQLCA;

//提交事务

Else

MessageBox("数据库错误","插入失败")

ROLLBACK USING SQLCA;

//事务回滚

Return

End If

Blb_tmp=ole_1ObjectData

UPDATEBLOB bmptable SET bmpdata=:blb_tmp

WHERE bmptablebmpno=:bmpno

USING SQLCA; //更新存放的字段

If SQLCASQLDBCode=0 Then

COMMIT USING SQLCA;

//提交事务

MessageBox("插入成功","入库成功")

Else

MessageBox("数据库错误","更新失败")

ROLLBACK USING SQLCA;

//事务回滚

Return

End If

3 从数据库中删除BMP

UPDATE bmptable SET bmpdata=''

WHERE bmptablebmpno=:bmpno

USING SQLCA;

//bmpno为要删除的编号

If SQLCASQLDBCode=0 Then

COMMIT USING SQLCA;

//提交事务

Else

MessageBox("数据库错误","更新失败")

ROLLBACK USING SQLCA;

//事务回滚

Return

End If

DELETE FROM bmptable

WHERE bmptablebmpno=:bmpno

USING SQLCA;

If SQLCASQLDBCode=0 Then

COMMIT USING SQLCA;

//提交事务

MessageBox("删除成功","删除成功")

Else

MessageBox("数据库错误","删除失败")

ROLLBACK USING SQLCA;

//事务回滚

Return

End If

4 按编号查询信息

//需要提供一个编号存放在变量bmpno中

SetNull(blb_tmp)

SELECTBLOB bmptablebmpdata INTO :blb_tmp

FROM bmptable

WHERE bmptablebmpno=:bmpno

USING SQLCA;

If Not IsNull(blb_tmp) Then

ole_1ObjectData=blb_tmp

//双击OLE控制唤醒OLE服务器即可编辑

End If

使用PB编程时,每次对数据库进行 *** 作后要注意检查返回结果,以保证程序的可靠性。以上程序只是对 *** 作BLOB数据类型的关键技术进行探讨,通过画板设计相应的用户界面,即可形成一个完整的基于Client/Server结构的数据库应用程序。

在 File 菜单中有一个导入工程的菜单项吧!选择导入“ pbw ”的文件进行导入,就可以打开工程了。或者是在库文件中,加入“ pbl ”文件,就可以在类文件导航栏中,打开源码了。

我都N年没有用过PB了,回答不详细,请谅解。

以上就是关于用PB开发多媒体数据库管理系统(二)全部的内容,包括:用PB开发多媒体数据库管理系统(二)、怎么用pb编写程序自动创建ODBC数据源、怎么用pb打开已经存在的源码等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/9539382.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-29
下一篇2023-04-29

发表评论

登录后才能评论

评论列表(0条)

    保存