(3)uniGUI for C++ builder手机应用开发之ORACLE数据库访问与操作

(中行雷威 于2018.2.17)

(同一个世界,同一个梦想,交流学习C++Builder XE10,传承c++builder的魅力!欢迎各地朋友加入我的QQ群484979943、860634510、299497712,进群密码“BCB”,同时也请将该群号广为宣传,希望能够广集各方高手,共同进步。)

 

本人主笔的国内第一本uniGUI教学资料已诞生,分为cbuilder和delphi两个版本,买代码送手册,需要的朋友可以加入我的QQ技术交流群484979943、860634510、299497712给我(群主)留言。资料简介:https://blog.csdn.net/dlboy2018/article/details/88923832

    最喜欢的就是放大假,最闲不住的也是放大假,每个假期都想鼓捣点什么,也都能鼓捣出点什么。前不久开始研究uniGUI控件,一个牛逼的所见即所得WEB开发工具,uniGUI支持delphi和c builder,但是貌似为delphi而生,用官方的说辞那就是“支持c builder,但是未经过严格测试”。c builder和uniGUI的合作案例少之又少,翻墙无数所获无几。继2018狗年除夕夜之作业之后,大年初二,又研究测试了一下uniGUI如何开发一个基于手机浏览器的应用以实现对oracle数据库的直接访问,分享各位。

【说明】

本文基于uniGUI控件和uniDAC两个控件开发出一个基于手机浏览器的数据访问演示WEB程序,实现了对ORACLE数据库的访问。千万别混淆,uniGUI和uniDAC是两个东西:

1、uniGUI是WEB开发控件,官网http://www.unigui.com/,他的安装与配置详见本博客的文章《(1)uniGUI for C++ builder网站开发之uniGUI控件安装和你好世界》

2、uniDAC是万能数据库访问控件,官网https://www.devart.com/unidac/,他的安装与配置详见本博客的文档《UniDAC701 for XE10.2.2 tokyo( c++builder)的安装说明(win7 32 or 64)》

3、本程序使用的uniGUI1.0.0.1424为官方试用版,MainmForm的Caption属性修改之后运行时无法生效,也许是非正版导致。但是其它功能实现都不受影响。

本案例源代码:http://download.csdn.net/download/dlboy2018/10252631

一、设计目标

利用uniGUI和uniDAC开发一个基于手机浏览器的样例程序,实现对数据库的查询、添加、删除和修改。

二、程序设计

1、新建项目

File->New->Other,选择Application Wizard创建新项目,名字叫mobileDataDemo

yes即可。

2、设置参数

Project-》Options,分别设置includePath和libPath,

1)includePath:

添加我的uniGUI目录:C:\Program Files (x86)\Embarcadero\Studio\19.0\uniGUI

添加我的uniDAC目录:C:\Program Files (x86)\Embarcadero\Studio\19.0\Unidac\Include\Delphi25\Win32

2)libPath

添加我的uniGUI目录:C:\Program Files (x86)\Embarcadero\Studio\19.0\uniGUI

添加我的uniDAC目录:C:\Program Files (x86)\Embarcadero\Studio\19.0\Unidac\Lib\Delphi25\Win32

3)取消动态库连接

4)取消动态包连接

3、创建数据库表student

演示程序共三个字段,分别是姓名、年龄、性别.

4、界面设计

电脑web应用和手机web应用开发所使用的uniGUI控件不在同一组,手机应用uniGUI控件组不是uniGUI standard组,而是uniGUI Mobile Standard组,各个控件的名称都在原来的uni后面增加了一个m,详见下图右下角。

(图1)MainmForm窗口

(图二)MainModule窗口

新建的项目默认有MainmForm、MainModule、ServerModule三个窗口,其中MainmForm是主窗口。上图即为MainmForm和MainModule窗口。

1)MainmForm上放一个UnimPanel1:Align属性alTop

2)UnimPanel1上放一个UnimContainerPanel1:Align属性alTop

3)UnimContainerPanel1上放UnimLabel1、UnimLabel2、UnimLabel3三个标签控件,放UnimEdit1、UnimEdit2、UnimEdit3三个输入控件

4)UnimPanel1上放四个UnimButton,分别为新建、添加、删除、修改按钮。

5)在MainModule窗口上(而非MainForm窗口,上图MainForm窗口未更新)放置一个UniConnection数据库连接控件、一个OracleUniProvider数据库驱动控件。

6)MainmForm窗口引用MainModule.h文件,MainmForm上放一个UnimDBGrid表格显示控件、两个UniQuery数据库访问控件、一个UniDataSource数据源控件。

7)UnimDBGrid控件的Align属性alClient、DataSource属性UniDataSource1

8)UniDataSource1的DataSet属性UniQuery1

9)UniQuery1的Connection属性MainModule.UniConnection1(UniQuery1专门用于关联表格查询显示数据)

     UniQuery2的Connection属性MainModule.UniConnection1(UniQuery2专门用于增删改数据)

10)MainModule上的UniConnection1的LoginPrompt属性False、ProviderName属性Oracle

 

5、代码实现

在Main.cpp开头定义全局变量mySql,rowId,stuName,stuAge,stuSex

 

#include <vcl.h>
#include <uniGUIVars.hpp>
#pragma hdrstop

AnsiString mySql,rowId;
AnsiString stuName,stuAge,stuSex;


#include "Mainm.h"
#include "MainModule.h"

 

 

1)连接数据库

该功能在MainModule的OnCreate事件中实现

void __fastcall TUniMainModule::UniGUIMainModuleCreate(TObject *Sender)
{
//连接数据库
UniConnection1->Disconnect();
UniConnection1->ProviderName="Oracle";
UniConnection1->SpecificOptions->Add("direct=true");
UniConnection1->Username="system";
UniConnection1->Password="oracle";
UniConnection1->Server="192.168.1.88:1521:ORCL";
try
    {
    UniConnection1->Connect();
    }
catch(...)
    {
    ShowMessage("连接数据库失败!");
    }

}

 

 

在MainmForm窗口OnBeforeShow事件中实现数据显示

void __fastcall TMainmForm::UnimFormBeforeShow(TObject *Sender)
{
MainmForm激活事件

//清除输入框内容
UnimEdit1->Clear();
UnimEdit2->Clear();
UnimEdit3->Clear();

//初始显示表格数据
UniQuery1->Close();
UniQuery1->SQL->Clear();
mySql="select stu_name,stu_age,stu_sex,rowid from student";
UniQuery1->SQL->Add(mySql);
UniQuery1->Open();
if(UniQuery1->RecordCount>0)
    {
    UnimDBGrid1->Columns->Items[0]->Width=120;
    UnimDBGrid1->Columns->Items[1]->Width=120;

    UnimDBGrid1->Columns->Items[2]->Width=150;

    TStringGrid(UnimDBGrid1).DefaultRowHeight=10;//   调整表格所有行高为30    手机下不管用
    TStringGrid(UnimDBGrid1).RowHeights[1]=10;      //   调整表格列标题高度为30 手机下不管用

    }

}
//---------------------------------------------------------------------------

2)新建按钮功能

点击新建按钮,清空各个输入框内数据.

void __fastcall TMainmForm::UnimButton1Click(TObject *Sender)
{
//新建
UnimEdit1->Clear();
UnimEdit2->Clear();
UnimEdit3->Clear();

UnimEdit1->SetFocus();//手机浏览器下没作用
}

3)添加记录

void __fastcall TMainmForm::UnimButton2Click(TObject *Sender)
{
添加
if(UnimEdit1->Text.IsEmpty())
    {
    ShowMessage("姓名不能为空!");
    UnimEdit1->SetFocus();
    return;
    }
if(UnimEdit2->Text.IsEmpty())
    {
    ShowMessage("年龄不能为空!");
    UnimEdit2->SetFocus();
    return;
    }
if(UnimEdit3->Text.IsEmpty())
    {
    ShowMessage("性别不能为空!");
    UnimEdit3->SetFocus();
    return;
    }

UniQuery2->Close();
UniQuery2->SQL->Clear();
mySql="insert into student values(:p1,:p2,:p3)";
UniQuery2->SQL->Add(mySql);
UniQuery2->ParamByName("p1")->Value=UnimEdit1->Text;
UniQuery2->ParamByName("p2")->Value=UnimEdit2->Text;
UniQuery2->ParamByName("p3")->Value=UnimEdit3->Text;
UniQuery2->ExecSQL();
if(UniQuery2->RowsAffected>0)
    {
    ShowMessage("添加成功!");
    UniQuery1->Refresh();
    }
else
    {
    ShowMessage("添加失败!");
    }
}
//---------------------------------------------------------------------------

 

4)删除选中记录

void __fastcall TMainmForm::UnimButton3Click(TObject *Sender)
{
删除选中记录
if(UniQuery1->Active && UniQuery1->RecNo>0)
    {
    UniQuery1->Delete();
    UniQuery1->Refresh();
    }
}------------------------------------------------------------------------

5)选择记录

在UnimDBGrid1的OnClick事件中添加代码,当选中记录时,记录选中记录的各个变量值。主要是记录选中的行号rowid,用做修改记录的唯一性条件。

void __fastcall TMainmForm::UnimDBGrid1Click(TObject *Sender)
{
表格选中记录
stuName="";
stuAge="";
stuSex="";
rowId="";
if(UniQuery1->Active && UniQuery1->RecNo>0)
    {
    stuName=UniQuery1->FieldByName("stu_name")->AsString;
    stuAge=UniQuery1->FieldByName("stu_age")->AsString;
    stuSex=UniQuery1->FieldByName("stu_sex")->AsString;
    rowId=UniQuery1->FieldByName("rowid")->AsString;

    UnimEdit1->Text=stuName;
    UnimEdit2->Text=stuAge;
    UnimEdit3->Text=stuSex;

    }
}
//---------------------------------------------------------------------------

 

6)修改记录

void __fastcall TMainmForm::UnimButton4Click(TObject *Sender)
{
//修改记录
if(UnimEdit1->Text.IsEmpty())
    {
    ShowMessage("姓名不能为空!");
    UnimEdit1->SetFocus();
    return;
    }
if(UnimEdit2->Text.IsEmpty())
    {
    ShowMessage("年龄不能为空!");
    UnimEdit2->SetFocus();
    return;
    }
if(UnimEdit3->Text.IsEmpty())
    {
    ShowMessage("性别不能为空!");
    UnimEdit3->SetFocus();
    return;
    }
UniQuery2->Close();
UniQuery2->SQL->Clear();
mySql="update student set stu_name=:p1,stu_age=:p2,stu_sex=:p3 where rowid=:p4";
UniQuery2->SQL->Add(mySql);
UniQuery2->ParamByName("p1")->Value=UnimEdit1->Text;
UniQuery2->ParamByName("p2")->Value=UnimEdit2->Text;
UniQuery2->ParamByName("p3")->Value=UnimEdit3->Text;
UniQuery2->ParamByName("p4")->Value=rowId;
UniQuery2->ExecSQL();
if(UniQuery2->RowsAffected>0)
    {
    ShowMessage("修改成功!");
    UniQuery1->Refresh();
    }
else
    {
    ShowMessage("修改失败!");
    }
}
//---------------------------------------------------------------------------

 

三、运行结果

编译程序后,在窗口右下角任务栏将出现一个紫色小图标(坐标:横3纵1),该图标即为你开发后运行起来的web服务器(重新编译前请右键点击该图标,选择shutdown先关闭服务器)。

启动你的手机浏览器,输入服务器地址http://192.168.1.88:8077/m 回车就可以登录访问你开发的web网站了,运行效果如下:

另外,UnimDBGrid的属性里面有WebOptions,子属性FetchAll设定是否全部读取数据、Paged属性设置是否分页显示、PageSize属性设置每页显示的记录条数。若果将FetchAll设定为true,每页记录数设定为3,Paged设定为true,则运行效果如下图:

怎么样?一切的一切实现起来都要比java web开发简单的太多太多,效果不错吧!

四、求助

PC下uniGUI窗口之间的调用截止目前,我一直没弄明白,哪位兄台如果弄明白了麻烦到我的QQ群里告诉我,十分感谢。

五、后记

各位,爆竹声声辞旧岁、小狗汪汪迎新春,c++buider的魅力真的是超乎你的想象,国内也小有在用的人群,只可惜互联网上的帖子和书籍太少了,再热闹的迎春晚会也难以抵挡我撰写这篇精品博文的欲望,谨以此篇犒赏一直热衷于c++builder的粉丝们。另外,据互联网消息,c++builder的开发商易博龙正在筹划收购uniGUI控件,让我们翘首以待吧!

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值