时间:2016.05.08 发布人:zhanxingwang08
已解决问题
谷歌zhanxingwang08用户在2016.05.08提交了关于“
我的女友是机器人MySQL**库接口的VC具体实现与应用”的提问,欢迎大家涌跃发表自己的观点。目前共有1个回答,最后更新于2025-02-27T06:17:36。希望大家能够帮助她。
详细问题描述及疑问:期待您的答案,不知道说什么,送你一朵小红花吧
!
希望以下的回答,能够帮助你。
第1个回答
用户名:jing02li
摘要:MySQL**库作为一种网络**库性能十分出色,但其在应用软件中使用较少。本文将主要探讨MySQL提供的两种**库接口——(ODBCAPI和CAPI)在VC中的应用,并且形成一个类用以封装CAPI**库接口的功能。
关键词:MySQL;**库接口;ODBCAPI;CAPI引言随着现代计算机软硬件及网络技术的发展,在网上查找资料已成为现在获取信息的最重要手段之一。众所周知,所有的网上信息问答都是储存在网站**库中的,这些信息的查询、更新等操作的功能则是由**库服务器提供的,显然,**库服务器的性吗镇局菜路类延功门沉怎能将直接关系到网站的生存。网站搭建中用的最多的**库服务器是oracle和MySQL,前者功能强大,属于旗舰型**库服务器,但前期投入太大;后者功能不断完善,简单易用而又不失性能,并且可以免费获得。因此,许多中小型网站的**库服务器选用MySQL,而且,由于MySQL性能出色,一些大型网站也选用了MySQL。由此可见,MySQL**库服务器在网站建设中的表现是十分出色的。但是,正因为这样,几乎很少有人将MySQL用于应用软件村厚领烈精又战坚定经的开发中。本文将详细介绍但抗理刘叫VC环境中MySQL**库服务器不同接口的应用,并最终将**生一个CDatabase类封装M械历得首听学者杨ySQL**库接口功能。**库接口实现与应用的计算机环境:硬件,**66、128M、15G;软件及操作系统,VISUALC++6.0、MySQL3.23.22-士台换乎免成betaforw所候沉陆晚查黄块杨创语in32、WIN98台李哥究织及烧视元案处。MySQL**库简介MySQL是一个真正的多用户、多线程SQL**库服务器。SQL(结构化查询语言)是世界上最流行的和标准化的**库语言,它使得存储、更新和存取才强否南给延信息更加容易。MySQL是一个客户机/服务器结构的实现,它由一个服务器守护程序mysqld和许多不同的客户程序以及库组成的。MySQL呀掌商异从的主要目标是快速、健壮和易用。最初是因为MySQL的创始人需要这样的一个SQL服务器,它能处理与任何不昂贵硬件平台上提供**库的厂家在一个数量级上的大型**库,但速度更快,MySQL因蒸京车连笔响儿在和此就开发出来了。它提供C,C++,J**A(JDBC),Perl,Python,Ph**黑宽附好车路系PandTCL的API接口;多平台支持,包括Solaris,SunOS,BSDI,SGIIRIX,AIX,DECUNIX,Li**x,FreeBSD,SCOOpenServer,Net权传限BSD,OpenBSD,h**PUX,W道达顾维省防同告所全in9xandNT;多样的**类型,包括有/无符号1,2,3,众省妈影双班4,8字节integers,FLOAT,DOUBLE,Ch**A宜父息除书优宁概R,VARCh**AR,TEXT,BLOB,DATE,DATETIME,YEAR,**T,E列科占具乎**M;非常灵活和安全的权限系统,密码加密;为Windows提供ODBC接口,可通过Access与之相联,另有第三方开发商提供多样的ODBC驱动程序;在MySQL3.23中使用新MyISAM最大的表大小可达8百万TB(2^63个字节);多种语言支持,但不支持中文。然而,为了实现快速、健壮和易毛丰标青胡望术绿原水斗用的目的,MySQL必须牺牲一部分灵活而强大的功能,如子查询、存储过洋程与触发器、外键、事物处理等。因而,MySQL在某些应用中缺乏灵活性,但这也使它对**的处理速度较其它**库服务器至少快2~3倍。MySQL自身不支持Windows的图形界面,因此,所有的**库操作及管理功能都只能在MS-DOS方式下完成。首先,必须登陆MySQL服务器,即在提示符MySQLBIN>下输入MYSQL–h**host–Uuser–Ppassword,提示符改为mysql>时表示登陆成功。然后,选择所操作的**库,即mysql>U**databasename。接着就可以用SQL语句进行查询了。如果需要退出**库服务器,可执行QUIT命令,这样就成功退出服务器了。当然,由于MySQL的知名度日益增加,许多第三方软件公司推出了MySQL在Windows环境中的具有图形界面的支持软件,如EMS公司的EMSMYSQLMANAGER就提供了Windows形式的MySQL**库操作功能。2利用ODBCAPI实现MySQL**库功能调用ODBC(OpenDatabaseConnectivity)即**式**库互联,作为Windows**性结构的一个重要部分已经为很多的Windows程序员所熟悉,ODBC的工作依赖于**库制造商提供的驱动程序,使用ODBCAPI的时候,Windows的ODBC管理程序把**库访问的请求传递给正确的驱动程序,驱动程序再使用SQL语句指示DBMS(**库管理系统)完成**库访问工作,因此,ODBC的存在为我们开发应用**库程序提供了非常强大的能力和灵活性。在Windows下可以对多种**库安装ODBC**库,用来连接**库并访问它们的**。对于MySQL**库服务器来说,它的制造商同样提供了相应的ODBC驱动程序,其最新版本为myodbc-2.50.31-win95。在WIN98环境下进行安装后,就可以利用编程语言通过ODBCAPI对MySQL**库进行各种ODBC所支持的操作。因为ODBC**了各种**库的差异,所以,原来用于对其它**库进行操作的程序,通过ODBC同样能够对MySQL**库进行操作。也就是说,ODBC使程序对**库的通用性提高了。用VC通过ODBCAPI对MySQL**库进行编程,必须要对MySQL**源进行设置,具体设置如图1:图1**源设置信息通过上图的设置,接着我们就可以按照一般的ODBC**库编程方法,对MySQL**库进行编程。3利用MySQL自带的CAPI函数实现**库功能调用由于各个**库之间的差异,它们所提供的**库功能也就各有不同。这样,通过ODBCAPI就不可能完全拥有所有的**库功能,因而影响了程序对**库的控制功能,也就不能充分发挥**库的能力。并且这种统一的接口还是以损失效能为前提的,这就使**库操作时间延长。所以,为了解决以上问题,MySQL的制造商在提供ODBC驱动程序的基础上,还提供了各种编程环境下的API,其中包括CAPI。这些API函数很显然能尽可能地发挥**库的能力,并减少**库操作的延长时间,但却使程序的通用性受到严重影响。MySQL提供了一套CAPI函数,它由一组函数以及一组用于函数的**类型组成,这些函数与MySQL服务器进行通信并访问**库,可以直接操控**库,因而显著地提高了操控效能。CAPI**类型包括:MYSQL(**库连接句柄)、MYSQL_RES(查询返回结果集)、MYSQL_ROW(行集)、MYSQL_FIELD(字段信息)、MYSQL_FIELD_OFF**T(字段表的偏移量)、my_ulonglong(自定义的无符号整型数)等;CAPI提供的函数包括:mysql_close()、mysql_connect()、mysql_query()、mysql_store_result()、mysql_init()等,其中mysql_query()最为重要,能完成绝大部分的**库操控。下面将具体讨论**库操作类CDatabase通过CAPI的实现以及在VC中的应用。3.1CDatabase类的实现CDatabase类封装了MySQL**库的功能,因此不具备通用性,只能在对MySQL的应用程序中使用。下面将根据C++要求及规范给出CDatabase类的具体结构以及相关简要介绍:classCDatabase{public:BOOLUnLockTable();//解锁BOOLLockTable(char*TableName,char*PRIORITY);//加锁intReload();//重新登陆,非零时返回错误信息char*GetState();//服务器状态char*GetServerInfo();//服务器信息intGetProtocolInfo();//协议信息char*Geth**ostInfo();//主机信息char*GetClientInfo();//客户机信息char*GetFieldName(intFieldNum);//字段名BOOLIsEnd();//是否最后intDropDB(char*db);//删除**库,非零时返回错误信息voidSeekData(intoffset);//查找指定**intCreateDB(char*db);//创建**库,非零时返回错误信息voidFreeRecord();//释放结果集unsignedintGetFieldNum();//得到字段数BOOLConnectDB(Database_Param*p);//连接**库MYSQL_ROWGetRecord();//得到结果(一个记录)my_ulonglongGetRowNum();//得到记录数BOOLSelectDB(Data_Param*para);//选择**库BOOLUpdateRecord(Data_Param*para);//更新记录BOOLSelectRecord(Data_Param*para);//选择记录BOOLInsertRecord(Data_Param*para);//插入记录BOOLDelRecord(Data_Param*para);//删除记录BOOLSelectAll(Data_Param*para);//选择所有记录char*OutErrors();//输出错误信息CDatabase();//初始化**库virtual'CDatabase();//关闭**库连接private:MYSQLmysql;//**库连接句柄MYSQL_RES*query;//结果集MYSQL_ROWrow;//记录集MYSQL_FIELD*field;//字段信息(结构体)BOOLFindS**e(char*str);//查找并保存结果集};通过CDatabase类中定义的这些功能函数,我们可以通过远程或本机完成对MySQL**库的绝大部分操控,并且由于定义了解锁和加锁功能,使得应用程序能够多线程或多进程地访问**库,大大提高了效能。以上函数的具体功能都是通过调用CAPI函数实现的。
3.2CDatabase类在VC中的应用第一步建立初始化MySQL对象,并且将其初始化。即定义CDatabase类对象,这样程序就会自动调用构造函数CDatabase(),完成初始化。构造函数实现如下:CDatabase::CDatabase(){mysql_init(&mysql);}完成初始化只需定义CDatabase类对象,即CDatabasebase;第二步连接服务器,并连接需要的**库。即调用ConnectDB(Database_Param*p)函数,结构体Database_Param中存放**库参数,包括主机名、用户名、密码、**库名等。该函数如返回TRUE表示连接成功,否则表示失败。连接函数实现如下:BOOLCDatabase::ConnectDB(Database_Param*p){if(!mysql_real_connect(&mysql,p->host,p->user,p->password,p->db,p->port,p->unix_socket,p->client_flag)){OutErrors();//输出错误信息returnfalse;}returntrue;}第三步对**库进行加锁。即调用LockTable(char*TableName,char*PRIORITY),对相应的表TableName完成相应属性PRIORITY的加锁,使程序兼容多线程功能。加锁函数实现如下:BOOLCDatabase::LockTable(char*TableName,char*PRIORITY){charstr[50];sprintf(str,"LOCKTABLES%s%s",TableName,PRIORITY);if(mysql_query(&mysql,str))returnfalse;returntrue;}第四步完成**库操作。即根据需要调用UpdateRecord(Data_Param*para)、SelectRecord(Data_Param*para)、InsertRecord(Data_Param*para)、DelRecord(Data_Param*para)等操作。其中的结构体Data_Param中存放**库操作参数。上述两个结构体的定义在global.h中。InsertRecord函数实现如下,其它实现方法相似:BOOLCDatabase::InsertRecord(Data_Param*para){charstr[80];sprintf(str,"insertinto%svalues(%s)",para->tab_name,para->insert_val);if(mysql_query(&mysql,str))returnfalse;returntrue;}第五步解锁**库。即调用UnLockTable(),完成对上述被加锁的表的解锁。解锁函数实现如下:BOOLCDatabase::UnLockTable(){if(mysql_query(&mysql,"UNLOCKTABLES"))returnfalse;returntrue;}第六步关闭**库连接。即调用析构函数'CDatabase(),关闭**库,并自动释放初始化时定义的CDatabase类对象。析构函数如下:CDatabase::'CDatabase(){if(query)mysql_free_result(query);mysql_close(&mysql);}注意:在编译程序时,必须加入MySQL的库文件libmySQL.lib。4MySQL性能测试4.1ODBCAPI通过索引读取200万行:528秒插入35万行:750秒4.2CAPI通过索引读取200万行:412秒插入35万行:435秒4.3其它**库(以MS_SQL为例,WINNT环境)通过索引读取200万行:1634秒插入35万行:4012秒注:以上**是多次测量的平均值,不可避免一定的误差,仅供参考。5结束语MySQL作为一个免费的SQL**库,虽然功能不够十分强大,且灵活性较差,但是,已经能够满足一般应用软件的要求,而且MySQL**库的开发者也在力求使之更加完善。并且,由MySQL性能测试可以看出,它对**的处理速度明显快于其它**库服务器。因此,如果应用软件对**库的性能要求较脯而同时对**库操作的功能及灵活性的要求不是很高的话,并且前期投入资金较少时,MySQL**库服务器不失为一个最佳的选择。