GTK_在网络计费用户管理系统的应用_第1页
GTK_在网络计费用户管理系统的应用_第2页
GTK_在网络计费用户管理系统的应用_第3页
GTK_在网络计费用户管理系统的应用_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第25卷第 4期微 计 算 机 应 用Vol. 25, No. 4 2004年7月MICROCOMPUTERAPPLICAT IONSJul. , 2004 本文于 2003- 12- 23 收到, 2004- 04- 26收到修改稿。 GTK+ 在网络计费用户管理系统的应用 池海红 刘焱海 ( 哈尔滨工程大学自动化学院 哈尔滨 150001) 摘要: 本文介绍了在 Linux 平台下,利用 GTK + 开发网络计费管理系统时访问数据库 M ySQL 的方法, 以及获取数据库中用户信息的一些应用技术。实践结果表明了本文设计方法的 有效性。 关键词: Linux GTK+ MySQL Appli

2、cation of GTK+ to Developing Network Accounting Managemeut System CHI Haihong, LIU Yanhai (Automation College, Harbin Engineering University, Harbin, 150001, China) Abstract: In this paper, the methods of developing database MySQL using GTK+for network ac - counting system are presented, and key tec

3、hniques accessing user information in database are discussed. Practice result shows that the accounting system provided by this paper is effective. Key words: Linux, GTK+ , MySQL 1 引言 在 Linux 下开发网络计费用户管理系统, 目前采用的仍是 Client/ Server 架构。在开发中 应注意两个问题。 从数据库需求的角度来开发应用程序。选择 MySQL 数据库首先是因为 它对用户访问的控制非常出色, 可以基

4、于用户名、表名和客户机名任意授予或废除权限; 其 次,从对外接口而言, MySQL 支持 C 语言,它提供的 C API 代码是随 MySQL 分发的, 包 含在 MySQLclient 库中并且允许 C 程序存取数据库。其客户 API 大都使用 MySQLclient 库 与MySQL 服务器通信。 在 Linux 下开发 GUI 程序应采用什么样的图形库。Gtk+ ( GIMP Tool Kit,GIMP 工具包) 是一个用于创造图形用户接口的图形库, 它是基于 LGPL 授权的,用 Gtk+ 开发软件不需要授权费或版权费。Gtk+ 包中包含了 Gdk, 由于 Gdk 是对 低级窗口函数的

5、包装 ( 对 X window 系统来说就是 Xlib) , 因此 Gtk+ 是对底层的 X Window 系统库 Xlib 的简化。基于上述特点, Gtk+ 现在已广泛用于开发 Linux 的图形用户界面。对 本项目而言,更重要意义在于它的语言内核是 C 语言, 与 MySQL 的 C 语言访问接口可以直 接挂钩,很方便地对数据库进行任何操作。 2 应用 GTK+ 210 开发 MySQL数据库 建立用户管理系统首先要创建数据库。运用 GT K+ 210 作 MySQL 的底层开发,首先程 序中必须包含有 MySQL 的头文件, 其次, MySQL 客户端程序都要链接其中的 mysqlcli

6、ent 动态链接库, 必须把文件 libmysqlclient1So112 复制到目录/ usr/ lib 下。最后在编译的时候必 须链接上它的库文件。 要创建数据库就得先与数据库连接, 使用 MySQL 提供的接口函数:连接数据库。这是 一个核心函数,它连接到服务器并返回一个指向该连接处理程序的指针。MYSQL*mysql- real-connect ( MYSQL *conn,char * host-name,char * user-name,char * password, char * db-name, unsigned int port-num, char * socket-name

7、, unsigned int flags) 其中, 第 1 个参数是初始化的MYSQL 结构,这个结构代表MySQL 数据库的句柄 ( 操作对象) ,一般 用它的指针形式, 几乎所有与 MySQL 相关的操作都用到它,用函数 mysql-init 来对它进行 初始化, 得出的结构是 init-connect; 第 2 个参数是一个 IP 地址或者主机名,这里用的本地 主机的名称为 / localhost0; 第 3 个参数是用户名称标记, 这里用 NULL 表示当前用户;第 4 个参数是用户的口令, 即密码, 这跟 MySQL 系统管理的设置有关, 如果单机测试运行, 则 将口令设置为 NUL

8、L;第5 个参数是要选用的数据库名,如指定的话, 此数据库被打开; 第 6个参数指定 0,表示使用默认的端口;第 7 个参数为 NULL;第 8 个参数通常设置为 0。 此函数如果执行成功的话, 将返回一个 MYSQL* 的数据库连接句柄,否则返回 NULL, 据 此可以判断是否与数据库服务器连接成功。 数据库连接成功后就能够进行数据库的创建了。创建该数据库的核心代码就是使用了 MySQL 的底层接口函数 mysql-query ( ) ,将 CREATE DATABASE xxxx 命令直接发给数据 库。这个函数也是操作数据库的核心函数, 其完整的函数原型为 mysql-query ( MY

9、SQL * conn,char * query-string) , 如果给定一个指定为空终结串的查询, 这个函数就将该查询发 送到服务器中运行。该串不包含二进制数据, 尤其是不包含空字节,mysql-query ( ) 将空 字节解释为查询的结束。mysql-query ( ) 运行成功时返回零, 失败时返回非零值。一个成 功的查询是服务器合法接受的并且运行无错的查询。部分核心代码如下: sprintf( query-buf,d CREATE DATABASE % s d, db - name) ; if(mysql-query(init-connect, query-buf)=0) crea

10、te-message-dialog( GTK-MESSAGE-INFO, g- locale-to-utf8(/ 成功 创建 数据库!0, - 1, NULL, NULL, NULL) ; else create-message-dialog( GTK-MESSAGE-ERROR, g-locale-to-utf8(d数据库创建出错!d, - 1, NULL, NULL, NULL) ; 其中 dbname 在这里就是所要创建的数据库名称。同样,创建数据表和往数据库中写数 据、删除数据都是使用 mysql-query 这个函数,将相应的命令发给数据库,这就是由于 Gtk + 210 C 语言的

11、语言内核所带来的对 MySQL 数据库操作上的方便之处。 3 应用 GTK+ 210 获取数据库中的用户信息 本文所给出的网络计费用户管理系统是为管理员服务的,它可以显示本地区所有用户的 基本注册信息和网费交纳情况。在日常事务管理中, 管理员可以看到本地区的所有用户信 息,可查询是否有用户欠费,或者网络服务即将到期, 这样就可以通过自动电话欠费催缴子 417第 4 期微 计 算 机 应 用 系统, 通知用户缴费, 或者对逾期不缴者,实施断其宽带服务的功能。在设计管理员管理界 面时, 使用了 3 个新的控件: ( 1) 日历控件 ( GtkCalenda) , 它用来显示当前的日期,这样可以与用

12、户的最后一次缴 费日期进行比较, 来得出用户已经耗用的网费以及网资余额,进而判断用户是否欠费。首先 定义 3 个全局变量,分别是 year、month 和 date,都是 guint 类型,分别代表年、月、日。 在主函数中生成日历控件, 并将它装载入主窗体: calendar= gtk-calendar-new( ); gtk-box-pack-start( GTK-BOX(hbox), calendar, FALSE, FALSE, 5) ; 然后使用该控件自身的函数将当前日期取出, 并存入先前定义的 3 个变量之中: gtk-calendar-get-date(GTK-CALENDAR(

13、calendar), 这 3 个变量的第一个作用是显示当前日期, 由于在日历控件的函数中, 月份是从 0 到 11,所以在具体使用的时候必须加 1, 代码如下: sprintf(date-buf,d% d- - % d- - % d d, year, month+ 1, date); label =gtk-label-new(date-buf); gtk-box-pack-start( GTK-BOX(hbox), label, FALSE, FALSE, 5) ; 上述代码是将 3 个 guint 变量转换成字符串,用 label 控件显示出来,并同时装载入主窗 体。第二个作用就是与从 My

14、SQL 数据库取出的用户的最后一次缴费的日期进行运算,得出 用户的网费余额。由于数据库里的日期是用字符串格式存储的,因此不能直接用来跟 year、 month、date3 个变量进行运算,需要进行类型转换。这里就用到了 C 语言的库函数 atoi ( ) 。 ( 2) 用户信息要用 GtkClist 列表控件显示,从数据库中读出的用户数据必须全部存入该 控件默认的数组中, 定义为const gchar * new-row,分别是 / 编号0、/ 姓名0、/ 开户日期0、 / IP 地址0、/ 联系电话0、/ 开户已存网资0、/ 网资余额0、/ 用户密码0 和 / 欠费与否0。其 中 / 网资余

15、额0、/ 欠费与否0 不是数据库预存的, 而是由软件运行期计算出的。在实现这些 功能的核心代码中用到了 3 个数据库的底层接口函数: mysql-store-result ( MYSQL * conn) , 它跟在一个成功查询的后面,返回结果集并将其存储在客户机中。如果该查询不返 回任何数据或出现错误,则返回 NULL。当 mysql-store-result ( ) 返回 NULL 时,调用 mysql-field-coun ( ) 或错误报告函数中的一个来确定结果集是否不是所期望的,或是否出 现了错误。当处理完结果集后, 将其传递到 mysql-free-result ( ) 中进行释放。

16、本程序先建 立了一 个成 功连 接 init-connect,然 后将 该结果 集存 储在 res; mysql-num-fields ( MYSQL-RES, * res-set) ,返回结果集的列数目。本程序中,res 作为形式参数赋予该函 数, 得到结果集的列数目; mysql-fetch-row ( MYSQL-RES,* res-set) , 返回指向结果 集下一行的指针。该行以一个串数组表示,该行的值是该值数组的成员,所有数据类型的值 都以串形式返回。如果要想利用某个值完成一个数值计算, 按前面所述必须将其转换) ) 用 atoi ( ) 或 atof ( ) 。当数据集中不再有行

17、时,mysql-fetch-row ( ) 返回 NULL ( 如果使 mysql-use-result ( ) 开始逐行的结果集检索,若出现通信错误, mysql-fetch-row ( ) 也返 回NULL) , 数据值是空终结串,但不应将含有二进制数据的值看做是空终结串。本程序中, res作为形式参数赋予该函数, 得到行指针。 应注意, 进行网费余额计算时, 需要将用户的开户日期中的月份和日子从日期字符串提 取出来,代码为 418 微 计 算 机 应 用2004 年 yuefen=atoi(s+ 5) ;tianshu =atoi(s+ 8) ; 用户最后一次预存的网费 price 也要

18、将其字符串格式转化成浮点型 float。 此时开户网费 price、开户日期 yuefen、tianshu 都已经转换成可以计算的数据类型, 就 可以用计算余额的公式进行计算了。为了显示,又必须把 price 转换回字符串形式的变量。 下面就可用 GtkClist 控件将用户信息显示出来: gtk-clist-append(GTK-CLIST (clist) , new-row); ( 3) 滚动窗口控件 scrolled-window, 用于控制列表控制的数据显示。先将它加载到主 窗体中,然后 GtkClist 控件又加载到 scrolled-window 中,这样就能使 GtkClist 控件具有翻 页功能。 在主函数中, 上述控件的加载顺序必须有所区别, GtkClist 控件不具备自动翻页功能, 因此要用到 ( 3) 滚动窗口控件将数据显示出来。 使用日历控件的目的是获取当前时间,因此不希望将它显示在主窗体, 这需要使用一个 小技巧将日历控件隐藏起来,因而使用 gtk-widget-hide 函数将它隐藏起来,函数的位置需 要放到显示主窗体函数的后面, 代码顺序如下: gtk-widget-show-all( window);gtk-widget-hide(calendar); 4 结束语 GTK+ 的应用方法和

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论