uniGUI for C++ builder网站开发之ORACLE数据库访问与操作
(中行雷威 于2018.2.15除夕夜)
(同一个世界,同一个梦想,交流学习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狗年除夕夜,研究一下如何实现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)》
本案例源代码:http://download.csdn.net/download/dlboy2018/10252230
一、设计目标
利用uniGUI和uniDAC开发一个样例程序,实现对数据库的查询、添加、删除和修改。
二、程序设计
1、新建项目
File->New->Other,选择Application Wizard创建新项目,名字叫webDataDemo
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、界面设计
(图1)MainForm窗口
(图2)MainModule窗口
新建的项目默认有MainForm、MainModule、ServerModule三个窗口,其中MainForm是主窗口。上图即为MainForm和MainModule窗口
1)MainForm上放一个UniPanel1:Align属性alTop
2)UniPanel1上放一个UniContainerPanel1:Align属性alTop
3)UniContainerPanel1上放UniLabel1、UniLabel2、UniLabel3三个标签控件,放UniEdit1、UniEdit2、UniEdit3三个输入控件
4)UniPanel1上放四个UniButton,分别为新建、添加、删除、修改按钮。
5)在MainModule(非MainForm上,上图未更新)放置一个UniConnection数据库连接控件、一个OracleUniProvider数据库驱动控件。
6)MainForm上放一个UniDBGrid表格显示控件、两个UniQuery数据库访问控件、一个UniDataSource数据源控件。
7)UniDBGrid控件的Align属性alClient、DataSource属性UniDataSource1
8)UniDataSource1的DataSet属性UniQuery1
9)UniQuery1的Connection属性MainModule.UniConnection1(UniQuery1专门用于关联表格查询显示数据)
10)UniQuery2的Connection属性MainModule.UniConnection1(UniQuery2专门用于增删改数据)
11)MainModule窗口上的UniConnection1的LoginPrompt属性False、ProviderName属性Oracle
5、代码实现
在Main.cpp开头定义全局变量mySql,rowId。
#include <vcl.h>
#include <uniGUIVars.hpp>
#pragma hdrstop
AnsiString mySql,rowId;
AnsiString stuName,stuAge,stuSex;
#include "Main.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="127.0.0.1:1521:ORCL";
try
{
UniConnection1->Connect();
}
catch(...)
{
ShowMessage("连接数据库失败!");
}
}
2)显示表数据
该功能在MainForm窗口OnActivate激活事件中实现
void __fastcall TMainForm::UniFormActivate(TObject *Sender)
{
MainForm激活事件
//清除输入框内容
UniEdit1->Clear();
UniEdit2->Clear();
UniEdit3->Clear();
//初始显示表格数据
UniQuery1->Close();
UniQuery1->SQL->Clear();
mySql="select stu_name,stu_age,stu_sex,rowid from student";
UniQuery1->SQL->Add(mySql);
UniQuery1->Open();
}
3)新建按钮功能
点击新建按钮,清空各个输入框内数据,第一个输入项聚焦.
void __fastcall TMainForm::UniButton1Click(TObject *Sender)
{
//新建
UniEdit1->Clear();
UniEdit2->Clear();
UniEdit3->Clear();
UniEdit1->SetFocus();
}
4)添加记录
void __fastcall TMainForm::UniButton2Click(TObject *Sender)
{
添加
if(UniEdit1->Text.IsEmpty())
{
ShowMessage("姓名不能为空!");
UniEdit1->SetFocus();
return;
}
if(UniEdit2->Text.IsEmpty())
{
ShowMessage("年龄不能为空!");
UniEdit2->SetFocus();
return;
}
if(UniEdit3->Text.IsEmpty())
{
ShowMessage("性别不能为空!");
UniEdit3->SetFocus();
return;
}
UniQuery2->Close();
UniQuery2->SQL->Clear();
mySql="insert into student values(:p1,:p2,:p3)";
UniQuery2->SQL->Add(mySql);
UniQuery2->ParamByName("p1")->Value=UniEdit1->Text;
UniQuery2->ParamByName("p2")->Value=UniEdit2->Text;
UniQuery2->ParamByName("p3")->Value=UniEdit3->Text;
UniQuery2->ExecSQL();
if(UniQuery2->RowsAffected>0)
{
ShowMessage("添加成功!");
UniQuery1->Refresh();
}
else
{
ShowMessage("添加失败!");
}
}
5)删除选中记录
void __fastcall TMainForm::UniButton3Click(TObject *Sender)
{
删除选中记录
if(UniQuery1->Active && UniQuery1->RecNo>0)
{
UniQuery1->Delete();
UniQuery1->Refresh();
}
}---------------------------------------------------------------------------
6)选择记录
在UniDBGrid1的OnCellClick事件中添加代码,当选中记录时,记录选中记录的各个变量值。主要是记录选中的行号rowid,用做修改记录的唯一性条件。
void __fastcall TMainForm::UniDBGrid1CellClick(TUniDBGridColumn *Column)
{
表格选中记录
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;
UniEdit1->Text=stuName;
UniEdit2->Text=stuAge;
UniEdit3->Text=stuSex;
}
}
7)修改记录
void __fastcall TMainForm::UniButton4Click(TObject *Sender)
{
//修改记录
if(UniEdit1->Text.IsEmpty())
{
ShowMessage("姓名不能为空!");
UniEdit1->SetFocus();
return;
}
if(UniEdit2->Text.IsEmpty())
{
ShowMessage("年龄不能为空!");
UniEdit2->SetFocus();
return;
}
if(UniEdit3->Text.IsEmpty())
{
ShowMessage("性别不能为空!");
UniEdit3->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=UniEdit1->Text;
UniQuery2->ParamByName("p2")->Value=UniEdit2->Text;
UniQuery2->ParamByName("p3")->Value=UniEdit3->Text;
UniQuery2->ParamByName("p4")->Value=rowId;
UniQuery2->ExecSQL();
if(UniQuery2->RowsAffected>0)
{
ShowMessage("修改成功!");
UniQuery1->Refresh();
}
else
{
ShowMessage("修改失败!");
}
}
三、运行结果
编译程序后,在窗口右下角任务栏将出现一个紫色小图标(坐标:横3纵1),该图标即为你开发后运行起来的web服务器(重新编译前请右键点击该图标,选择shutdown先关闭服务器)。
启动浏览器,输入服务器地址http://localhost:8077回车就可以登录访问你开发的web网站了,运行效果如下:
另外,如果你不喜欢这种窗口的感觉,想要让程序运行后将普通窗口的边框融于浏览器中请将ServerModule的mainFormDisplayMode设置为mfPage(mfWindow为窗口显示模式,如上图),设置后效果如下:
怎么样?表格左下角自动带翻页功能,一切的一切实现起来都要比java web开发简单的太多太多,效果不错吧!
四、求助
uniGUI下窗口之间的调用我一直没弄明白,哪位兄台如果弄明白了麻烦到我的QQ群里告诉我,十分感谢。
五、后记
各位,爆竹声声辞旧岁、小狗汪汪迎新春,c++buider的魅力真的是超乎你的想象,国内也小有在用的人群,只可惜互联网上的帖子和书籍太少了,再热闹的迎春晚会也难以抵挡我撰写这篇精品博文的欲望,谨以此篇犒赏一直热衷于c++builder的粉丝们。另外,据互联网消息,c++builder的开发商易博龙正在筹划收购uniGUI控件,让我们翘首以待吧!