范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

11。Lazarus数据库编程9。ZeosDBO与FireBird综合示例

  9.ZeosDBO与FireBird综合示例9.1关于 FireBird
  Firebird是一个开源的关系数据库,提供了大部分SQL-99标准的功能,可以运行在Windows、linux和多种Unix操作系统上。Firebird提供良好的并发性,高效的执行,强大的语言支持存储过程和触发器。从1981年起,它已经被许多商业公司运用于许多的产品系统中。
  Firebird 和原 Borland 的 InterBase 有着相同的血脉,其作为一个开源项目遵循 InterBase Public License V.1.0 on 25 July, 2000 协议。
  FireBird 数据库的特点: Firebird是一个真正的关系数据库,支持存储过程、视图、触发器、事务等大型关系数据库的所有特性; Firebird支持SQL92的绝大部分命令,并且支持大部分SQL99命令,新版Firebird 2.0对SQL99的支持更完整; Firebird源码基于成熟的商业数据库 Interbase,有良好的稳定性,与Interbase有良好的兼容性; 不用考虑授权费用(免费),不用担心将来有一天你或你的客户因为使用盗版而被数据库开发商告上法庭; 发布简易,安装文件只有几M,且高度可定制,客户端的分发也很简单,只需一个DLL文件; Firebird 还具有一个嵌入式服务器版本,不用安装,直接运行,基于单机开发首选; Firebird的运行效率非常高; 具备高度可移植性,可在Linux、Unix、MacOS、Windows、Solaris 系统下运行,而且数据库格式完全一致,不用修改; 开发环境支持良好,Delphi、C++Builder不用通过 ODBC 连接,直接用原生开发接口开发出基于 Firebird 的程序;除此之外,对于 Java、Python、.NET、PHP 都具有良好的支持。
  FireBird 数据库软件有三种套件,支持不同作业平台(windows系列、linux、freebsd 等...) Super Server  - 无法直接存取数据库档案,必须透过socket来和服务器沟通 Classic  - 直接存取数据库的档案,多个程序可以同时存取一个档案, 类似于 vfp、dbase embedded  - 专为小型应用系统使用的嵌入式数据库 (pda)
  另外,新版的 FireBird 数据库软件还支持 Android ARM32、 Android ARM64、 Mac OS X。 9.2 FireBird 开发示例
  本节示例:实现对一张数据表的 CRUD 操作,通过两个窗体,其中主窗体展现数据,表单窗体用于录入和修改数据。数据准备如下: create table c_dep (     dep_id varchar(64) primary key,     dep_name varchar(16) ); insert into c_dep (dep_id, dep_name) values ("yfb", "研发部"); insert into c_dep (dep_id, dep_name) values ("xsb", "销售部"); insert into c_dep (dep_id, dep_name) values ("jszcb", "技术支持部"); insert into c_dep (dep_id, dep_name) values ("cwb", "财务部"); insert into c_dep (dep_id, dep_name) values ("xzb", "行政部");  create table d_dep_staff (     staff_id varchar(64) primary key,     dep_id varchar(64),     name varchar(32),     sex varchar(8),     birthday date,     edu_level varchar(16),     school varchar(64),     speciality varchar(32),     native_place varchar(256) );  INSERT INTO d_dep_staff (staff_id, dep_id, name, sex, birthday, edu_level, school, speciality, native_place) VALUES(uuid_to_char(gen_uuid()), "yfb", "张三", "女", "1981-9-10", "本科", "内蒙古大学", "经济管理", "内蒙古乌兰察布市集宁区");  INSERT INTO d_dep_staff (staff_id, dep_id, name, sex, birthday, edu_level, school, speciality, native_place) VALUES(uuid_to_char(gen_uuid()), "xsb", "刘五", "男", "1978-7-11", "本科", "内蒙古大学", "计算机科学与技术", "内蒙古鄂尔多斯市东胜区");  INSERT INTO d_dep_staff (staff_id, dep_id, name, sex, birthday, edu_level, school, speciality, native_place) VALUES(uuid_to_char(gen_uuid()), "xzb", "弓九", "女", "1983-3-10", "本科", "内蒙古科技大学", "计算机科学与技术", "内蒙古呼和浩特市托克托县");
  在数据表设计上,我比较习惯于主键使用 UUID,这个习惯也是受近几年的分布式数据库的影响而形成的。在 FireBird 中,对于 UUID 在支持包括如下函数: CHAR_TO_UUID (ascii_uuid) GEN_UUID () UUID_TO_CHAR (uuid)
  如: select char_to_uuid("A0bF4E45-3029-2a44-D493-4998c9b439A3") from rdb$database -- returns A0BF4E4530292A44D4934998C9B439A3 (16-byte string) select char_to_uuid("A0bF4E45-3029-2A44-X493-4998c9b439A3") from rdb$database -- error: -Human readable UUID argument for CHAR_TO_UUID must -- have hex digit at position 20 instead of "X (ASCII 88)"  select gen_uuid() from rdb$database -- returns e.g. 017347BFE212B2479C00FA4323B36320 (16-byte string)  select uuid_to_char(x"876C45F4569B320DBCB4735AC3509E5F") from rdb$database -- returns "876C45F4-569B-320D-BCB4-735AC3509E5F" select uuid_to_char(gen_uuid()) from rdb$database -- returns e.g. "680D946B-45FF-DB4E-B103-BB5711529B86" select uuid_to_char("Firebird swings!") from rdb$database -- returns "46697265-6269-7264-2073-77696E677321"9.3 Lazarus 应用程序示例9.3.1 界面设计
  主窗体界面如下图:
  表单窗体界面如下图:
  9.3.2 数据模块
  数据模块组件声明代码: TDataModule1 = class(TDataModule)     // 数据库组件     ZConnection1: TZConnection;     ZQuery1: TZQuery;     // 字段定义     ZQuery1_BIRTHDAY: TDateField;     ZQuery1_DEP_ID: TStringField;     ZQuery1_DEP_NAME: TStringField;     ZQuery1_EDU_LEVEL: TStringField;     ZQuery1_NAME: TStringField;     ZQuery1_NATIVE_PLACE: TStringField;     ZQuery1_SCHOOL: TStringField;     ZQuery1_SEX: TStringField;     ZQuery1_SPECIALITY: TStringField;     ZQuery1_STAFF_ID: TStringField;   private    public    end;
  数据库组件属性设置:
  组件
  属性
  值
  ZConnection1
  Protocol
  firebird
  HostName
  127.0.0.1
  Port
  3050
  User   sysdba   Password   ***   Database   E:workspace_of_lazarusDEMODB.FDB   Connected   True   ZQuery1   Connection   ZConnection1   SQL   SELECT staff_id, s.dep_id, name, sex, birthday, edu_level, school, speciality, native_place, d.dep_name FROM d_dep_staff s left join c_dep d on s.dep_id = d.dep_id   Active   True 9.3.3 主窗体组件   主窗体组件声明代码如下: TForm1 = class(TForm) // CRUD 按钮 Button1: TButton; Button2: TButton; Button3: TButton; Button4: TButton; // 数据库组件 DataSource1: TDataSource; DBGrid1: TDBGrid; // 数据导航组件 DBNavigator1: TDBNavigator; // 按钮及数据导航组件容器 Panel1: TPanel; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure DBGrid1DblClick(Sender: TObject); private public end;   主窗体数据库组件的属性:   组件   属性   值   DataSource1   DataSet   DataModule1.ZQuery1   DBNavigator1   DataSource   DataSource1   VisibleButtons   [nbFirst,nbPrior,nbNext,nbLast]   Align   alRight   DBGrid1   DataSource   DataSource1   Options   dgRowSelect=True   Align   alClient 9.3.4 表单窗体组件   表单窗体组件声明代码: TForm2 = class(TForm) // 确定、取消按钮 Button1: TButton; Button2: TButton; // 数据编辑组件 SpecialityEdit: TEdit; SchoolEdit: TEdit; EduLevelComboBox: TComboBox; BirthdayDateTimePicker: TDateTimePicker; DepComboBox: TComboBox; NameEdit: TEdit; NativePlaceEdit: TEdit; SexRadioGroup: TRadioGroup; // 数据标签组件 GroupBox1: TGroupBox; GroupBox2: TGroupBox; GroupBox3: TGroupBox; GroupBox4: TGroupBox; GroupBox5: TGroupBox; GroupBox6: TGroupBox; GroupBox7: TGroupBox; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure FormActivate(Sender: TObject); private public isNew: Boolean; // 标识是否为新建数据记录 end; 9.3.5 主窗体功能实现代码   代码如下: uses unit2, unit3; { TForm1 } procedure TForm1.Button1Click(Sender: TObject); begin // 新建 Form2.isNew := True; if Form2.ShowModal = mrOk then begin DataModule1.ZQuery1.Refresh; end; end; procedure TForm1.Button2Click(Sender: TObject); begin // 编辑 if DataModule1.ZQuery1.BOF then if DataModule1.ZQuery1.RecordCount > 0 then DataModule1.ZQuery1.First else Exit; if DataModule1.ZQuery1.EOF then if DataModule1.ZQuery1.RecordCount > 0 then DataModule1.ZQuery1.Last else Exit; Form2.isNew := False; if Form2.ShowModal = mrOk then begin DataModule1.ZQuery1.Refresh; end; end; procedure TForm1.Button3Click(Sender: TObject); var Query: TZQuery; begin // 删除 if DataModule1.ZQuery1.BOF then if DataModule1.ZQuery1.RecordCount > 0 then DataModule1.ZQuery1.First else Exit; if DataModule1.ZQuery1.EOF then if DataModule1.ZQuery1.RecordCount > 0 then DataModule1.ZQuery1.Last else Exit; Query := TZQuery.Create(Self); try Query.Connection := DataModule1.ZConnection1; Query.Close; Query.SQL.Text := "DELETE FROM d_dep_staff where staff_id = :staffId"; Query.Params.ParamByName("staffId").AsString := DataModule1.ZQuery1_STAFF_ID.Value; Query.ExecSQL; except on D: EDatabaseError do MessageDlg("Error", "A database error has occurred. Technical error message: " + D.Message, mtError, [mbOK], 0); end; Query.Destroy; DataModule1.ZQuery1.Refresh; end; procedure TForm1.Button4Click(Sender: TObject); begin // 刷新 DataModule1.ZQuery1.Refresh; end; procedure TForm1.DBGrid1DblClick(Sender: TObject); begin // 双击修改 Button2Click(Sender); end; 9.3.6 表单窗体功能实现代码   代码如下: uses unit2; { TForm2 } procedure TForm2.Button1Click(Sender: TObject); begin // 取消 ModalResult := mrCancel; end; procedure TForm2.Button2Click(Sender: TObject); var Query: TZQuery; index: Integer; depId: String; begin // 确定 if NameEdit.Text = "" then begin MessageDlg("提示", "请输入姓名!", mtError, [mbOK], 0); Exit; end; if DepComboBox.ItemIndex < 0 then begin MessageDlg("提示", "请选择所在部门!", mtError, [mbOK], 0); Exit; end; index := DepComboBox.ItemIndex; depId := PAnsiString(DepComboBox.Items.Objects[index])^; Query := TZQuery.Create(Self); try Query.Connection := DataModule1.ZConnection1; Query.Close; if isNew then begin Query.SQL.Text := "INSERT INTO d_dep_staff (staff_id, dep_id, name, sex, birthday, edu_level, school, speciality, native_place) VALUES(uuid_to_char(gen_uuid()), :depId, :name, :sex, :birthday, :eduLevel, :school, :speciality, :nativePlace)"; Query.Params.ParamByName("depId").AsString := depId; Query.Params.ParamByName("name").AsString := NameEdit.Text; if SexRadioGroup.ItemIndex = 0 then Query.Params.ParamByName("sex").AsString := "男" else Query.Params.ParamByName("sex").AsString := "女"; Query.Params.ParamByName("birthday").AsDate := BirthdayDateTimePicker.Date; Query.Params.ParamByName("eduLevel").AsString := EduLevelComboBox.Text; Query.Params.ParamByName("school").AsString := SchoolEdit.Text; Query.Params.ParamByName("speciality").AsString := SpecialityEdit.Text; Query.Params.ParamByName("nativePlace").AsString := NativePlaceEdit.Text; Query.ExecSQL; end else begin Query.SQL.Text := "UPDATE d_dep_staff SET dep_id=:depId, name=:name, sex=:sex, birthday=:birthday, edu_level=:eduLevel, school=:school, speciality=:speciality, native_place=:nativePlace WHERE staff_id=:staffId"; Query.Params.ParamByName("depId").AsString := depId; Query.Params.ParamByName("name").AsString := NameEdit.Text; if SexRadioGroup.ItemIndex = 0 then Query.Params.ParamByName("sex").AsString := "男" else Query.Params.ParamByName("sex").AsString := "女"; Query.Params.ParamByName("birthday").AsDate := BirthdayDateTimePicker.Date; Query.Params.ParamByName("eduLevel").AsString := EduLevelComboBox.Text; Query.Params.ParamByName("school").AsString := SchoolEdit.Text; Query.Params.ParamByName("speciality").AsString := SpecialityEdit.Text; Query.Params.ParamByName("nativePlace").AsString := NativePlaceEdit.Text; Query.Params.ParamByName("staffId").AsString := DataModule1.ZQuery1_STAFF_ID.Value; Query.ExecSQL; end; except on D: EDatabaseError do MessageDlg("Error", "A database error has occurred. Technical error message: " + D.Message, mtError, [mbOK], 0); end; Query.Destroy; ModalResult := mrOk; end; procedure TForm2.FormActivate(Sender: TObject); var Query: TZQuery; index: Integer; begin // 初始化部门选项 try Query := TZQuery.Create(Self); Query.Connection := DataModule1.ZConnection1; Query.Close; Query.SQL.Text := "SELECT dep_id, dep_name FROM c_dep"; Query.Open; DepComboBox.Items.Clear; while not Query.EOF do begin DepComboBox.Items.AddObject( Query.FieldByName("dep_name").AsString, TObject(NewStr(Query.FieldByName("dep_id").AsString)) ); Query.Next; end; except on D: EDatabaseError do MessageDlg("Error", "A database error has occurred. Technical error message: " + D.Message, mtError, [mbOK], 0); end; // 初始化数据项 if isNew then begin NameEdit.Text:=""; SexRadioGroup.ItemIndex:=0; SchoolEdit.Text:=""; SpecialityEdit.Text:=""; NativePlaceEdit.Text:=""; end else with DataModule1 do begin NameEdit.Text:=ZQuery1_NAME.Value; if ZQuery1_SEX.Value = "男" then SexRadioGroup.ItemIndex:=0 else SexRadioGroup.ItemIndex:=1; index := DepComboBox.Items.IndexOf(ZQuery1_DEP_NAME.Value); DepComboBox.ItemIndex:=index; BirthdayDateTimePicker.Date := ZQuery1_BIRTHDAY.Value; EduLevelComboBox.Text := ZQuery1_EDU_LEVEL.Value; SchoolEdit.Text := ZQuery1_SCHOOL.Value; SpecialityEdit.Text:=ZQuery1_SPECIALITY.Value; NativePlaceEdit.Text:= ZQuery1_NATIVE_PLACE.Value; end; end;

美国Magico魔域M2音箱(相关视频已上传)魔域M2音箱,高1143宽457深445毫米娇巧身驱,绽放着惊人能量!大编辑作品面前,丝豪没有半点胆怯懦者表现,谈笑之间没有半点凌乱,从容应对。小身驱如何有如此爆发力?没有坚固身驱400元档的有趣好玩又实用的数码产品有哪些?说到有趣我可来精神了啊!这题我会。作为没什么用处但是稀奇古怪物件的收纳者,偶尔还是会碰见一些既有用还有趣的东西的。就拿数码产品来说,前段时间买了一个制冷的手机散热器,那打游戏的时候2022年3月买手机,牢记三不碰原则,大概率选到满意的机器导读2022年3月买手机,牢记三不碰原则,大概率选到满意的机器朋友们在春节期间买手机一定比较纠结,临近春节期间很多新款手机上新并且还有很多之前的手机处理,这段时间再加上大家的换机需35年手机变迁史从板砖型到智能化的发展现在智能手机已经成为了人们日常生活中不可缺少的一部分。几乎每个人至少拥有一部属于自己的手机。但事实上,手机并不是生来就是现在的模样。因为在科技发展的过程中,手机设计也经历了翻天覆地曾经的爆款机型,现在的廉价手机,这三款配置你看如何手机市场上的机型更新换代的伐越来越快,曾经的爆款机型到现在的廉价手机,其配置与性能是否还足够未来使用呢?带着疑问,我们再一次解开这三款手机神秘的面纱。小米Civi小米Civi发布于CBA大爆冷!领头羊主场狂输23分,吞赛季第4败,敲响警钟北京时间3月1日,CBA常规赛第三阶段重燃战火,辽宁男篮迎战青岛男篮,郭艾伦和韩德君此役缺阵,辽宁首节就挖下18分大坑,上半场最多落后了22分,辽宁在第三节一度将分差缩小到分位数,哄娃神器!不回缩的迷你杯子蛋糕戚风一直都是烘焙界的万人迷,口感柔软,组织细腻家里有小朋友的一定要试试这款迷你杯子蛋糕,小小的一口一个超级可爱,也可以根据自己喜欢的口味做成抹茶巧克力味等等,妥妥的哄娃神器!还特别乌克兰劲旅主帅逃出基辅,讲述惊魂24小时!葡萄牙名帅也已脱身俄乌紧张局势对足球界的影响不只限于俄罗斯的国家队和俱乐部,还包括在乌克兰的外籍足球人士。顿涅茨克矿工队的42岁意大利籍主教练罗贝托德泽尔比讲述了自己在逃离乌克兰之前经历的惊魂24小击败皇马5个月后,谢里夫警长主帅回乌克兰参加战斗在欧洲冠军联赛战胜皇家马德里的五个月后,谢里夫警长主帅尤里维尔尼杜布回到了他的家乡乌克兰,并加入乌克兰军队。维尔尼杜布出生于乌克兰北部城市日托米尔,他决定从执教摩尔多瓦足球队的工作家要干净,人要简单我不是一个特别勤快的人,一个星期两三次认真打扫家。每个人认真的标准不一样,像以前有个邻居,她的标准是一天不打扫卫生觉得家里脏得受不了,所以她每天都是晚上等孩子睡了开始全屋打扫,孩子徒步走世界第五十九章南去埃及埃及不是计划中的行程。在英国伦敦,我国驻英国大使馆的同志们提醒我说按你现在的路线由罗马尼亚俄罗斯一线回国,就只能算是经过亚洲美洲欧洲三大洲,跨世纪环球徒步采风的份量相对会轻很多。大
露营研学夜游茶旅新玩法带动黔南国庆游热潮国庆7天长假,在黔南玩转这些新花样!露营研学房车夜游随着绿博园落地黔南都匀,各类新兴景点的接连建成,2020年中国天眼正式开放运营,夜游经济的持续发展,黔南文旅不断发展出新道。国庆政策加力,为制造业高质量发展添动能新华社北京9月30日电题政策加力,为制造业高质量发展添动能新华社记者王雨萧吴雨张辛欣制造业是实体经济的根基。针对市场主体当前困难较大等情况,近日召开的国务院常务会议进一步加大纾困政只要你过得比我好有一种牵挂寄托温暖,有一首歌还不算老。因为关爱而流行传唱,因为和善而心生美好。把一种祝福遥寄给知己,让一个时代如沐春潮。只要你过得比我好,只要你过得比我好过得比我什么事都难不倒所有遇见懂你的人茫茫人海中,能够遇见一个真正读懂你,理解你的人,是人生最大的幸运!你的一言一行,举手投足,对方心领神会。读懂你的心思,赞赏你的坚强,理解你的辛酸,触摸你的灵魂,抚慰你的孤独。欣赏对信用卡是福还是祸我19岁用信用卡,第一张卡在京东钱包申请的,网络申请额度并不高只有3000。当时收到卡也并没有激活。因为申请的是上海银行,当时下意识以为上海银行,是不是只有上海才有的银行,后来因为涨价热气刚过,又1类商品或将迎来降价?如今降幅如何?引言在疫情肆虐的那段时期,因为实行了更加严格的防疫政策,所以市场上一度出现了一种涨价潮。很多商家坐地提价,将自己的商品价格提升。不过,随着疫情形势的稳定,这种涨价热气已经过去,随之片仔癀从一药难求到卖不出去,都是炒作惹的祸小药丸也有大力量,医药产品属特定商品种类,除特殊情况下,一般价格波动不大。但片仔癀的价格却在近两年里经历了大起与大落。去年片仔癀的价格突飞猛涨,单粒价格达到了千元以上,并出现多渠道美联储激进加息引发全球加息潮来源人民网人民日报海外版美国全国商业经济协会8月22日发布的问卷调查结果显示,七成受访者对美联储在不引发衰退的前提下把通胀降至目标水平没有信心。图为近日在美国蒙特贝洛一家超市内拍摄反弹不会来得那么快都一起来凿底股市这半个月来节节败退,失守了一个又一个的阵地,可谓是没有最低只有更低,阴跌不止,屡创新低,截至节前最后一个交易日,上证指数收在3024点,盘中又创了近期的新低3021我们能否找到最大和最小的恒星美国趣味科学网站9月24日发表题为宇宙中最大和最小的恒星是哪个?的文章,作者是伊索贝尔惠特科姆。全文摘编如下就恒星而言,太阳引起很多人的关注。不仅是因为地球上的生命都围绕着太阳生存一个躺不平大叔的投资心路(1)生活让我无法躺平,也不再有选择,只能走上投资这条艰险之路,希望改变生活,给孩子以更好的未来,也希望韭菜也有长成大葱的那一天。记录自己的投资心路,希望自己能始终将投资坚持下去,因为这