C++连接数据库.docx
- 文档编号:9560194
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:22
- 大小:24.03KB
C++连接数据库.docx
《C++连接数据库.docx》由会员分享,可在线阅读,更多相关《C++连接数据库.docx(22页珍藏版)》请在冰豆网上搜索。
C++连接数据库
WinXP,MySQL5.1,VS2008,):
∙DatabaseMySQLServer5.1.24-rc
∙C++DriverMySQLConnector/C++1.0.5
∙MySQLClientLibraryMySQLConnector/C6.0
∙CompilerSunStudio12C++compiler
∙MakeCMake2.6.3
∙OperatingSystemOpenSolaris2008.1132-bit
∙CPU/ISAIntelCentrino/x86
∙HardwareToshibaTecraM2Laptop
目录
MySQLC++Driver的实现基于JDBC4.0规范
安装MySQLConnector/C++
运行时依赖
C++IDE
为示例程序创建数据库与数据表
使用Connector/C++测试数据库连接
使用preparedStatements
使用事务
访问ResultSetMetadata
访问DatabaseMetadata
通过PreparedStatment对象访问参数元数据
捕获异常
调试/跟踪MySQLConnector/C++
更多信息
MySQLC++Driver的实现基于JDBC4.0规范
MySQLConnector/C++是由SunMicrosystems开发的MySQL连接器。
它提供了基于OO的编程接口与数据库驱动来操作MySQL服务器。
与许多其他现存的C++接口实现不同,Connector/C++遵循了JDBC规范。
也就是说,Connector/C++Driver的API主要是基于Java语言的JDBC接口。
JDBC是java语言与各种数据库连接的标准工业接口。
Connector/C++实现了大部分JDBC4.0规范。
如果C++程序的开发者很熟悉JDBC编程,将很快的入门。
MySQLConnector/C++实现了下面这些类:
∙Driver
∙Connection
∙Statement
∙PreparedStatement
∙ResultSet
∙Savepoint
∙DatabaseMetaData
∙ResultSetMetaData
∙ParameterMetaData
Connector/C++可用于连接MySQL5.1及其以后版本。
在MySQLConnector/C++发布之前,C++程序员可以使用MySQLCAPI或者MySQL++访问MySQL。
前者是非标准、过程化的CAPI,后者是对MySQLCAPI的C++封装。
安装MySQLConnector/C++
此处略。
(译者注:
用户可以到MySQL的官网[Connector/C++的安装程序,或者只下载dll,或者下载源代码自己编译。
笔者在Window平台上使用MySQL,下载了mysql-connector-c++-noinstall-1.0.5-win32这个版本用于调试。
)
运行时依赖
MySQLConnector/C++Driver依赖MySQL的客户端库,在MySQL安装目录下的lib\opt\libmysql.dll。
如果是通过安装程序来安装MySQLConnector/C++,libmysql会一并安装,如果从官网只下载了dll或源码,在使用时,程序必须链接到libmysql.dll。
C++IDE
此处略。
(译者注:
原文作者使用NetBean作为C++的IED。
笔者使用VS2008)
为示例程序创建数据库与数据表
(译者注:
此节略掉许多不太重要的内容。
)在MySQL中创建test数据库,使用下面语句创建数据表:
City:
CreateTable:
CREATETABLE`City`(`CityName`varchar(30)DEFAULTNULL)ENGINE=InnoDBDEFAULTCHARSET=ascii
然后向City表中添加一些数据。
最后表的内容为:
mysql>SELECT*FROMCity;
+--------------------+
|CityName|
+--------------------+
|Hyderabad,India|
|SanFrancisco,USA|
|Sydney,Australia|
+--------------------+
3rowsinset(0.17sec)
使用Connector/C++测试数据库连接
下面的代码演示如何使用Connector/C++连接到MySQL服务器:
∙连接到test数据库;
∙执行一个查询获取City表中的数据,显示在控制台上;
∙使用PreparedStatements向City表插入数据;
∙使用savepoints演示事务;
∙获取结果集和数据库的元信息;
例子代码仅仅用于演示,不建议读者在实际开发中使用这种样式的代码。
(译者注:
例子代码很长,如果看不太明白,没关系,等阅读完全文之后再回过头来看)
#include
#include
#include
#include
#include"mysql_driver.h"
#include"mysql_connection.h"
#include"cppconn/driver.h"
#include"cppconn/statement.h"
#include"cppconn/prepared_statement.h"
#include"cppconn/metadata.h"
#include"cppconn/exception.h"
#defineDBHOST"tcp:
//127.0.0.1:
3306"
#defineUSER"root"
#definePASSWORD"000000"
#defineDATABASE"test"
#defineNUMOFFSET100
#defineCOLNAME200
usingnamespacestd;
usingnamespacesql;
#pragmacomment(lib,"mysqlcppconn.lib")
voidDemo();
intmain(intargc,char*argv[])
{
Demo();
return0;
}
/*获取数据库信息*/
staticvoidGetDBMetaData(Connection*dbcon)
{
if(dbcon->isClosed())
{
throwruntime_error("DatabaseMetaDataFAILURE-databaseconnectionclosed");
}
cout<<"\nDatabaseMetadata"< cout<<"-----------------"< cout< /*Thefollowingcommentedstatementwon'tworkwithConnector/C++1.0.5andlater*/ //auto_ptr DatabaseMetaData*dbcon_meta=dbcon->getMetaData(); cout<<"DatabaseProductName: "< cout<<"DatabaseProductVersion: "< cout<<"DatabaseUserName: "< cout<<"Drivername: "< cout<<"Driverversion: "< cout<<"DatabaseinRead-OnlyMode? : "< cout<<"SupportsTransactions? : "< cout<<"SupportsDMLTransactionsonly? : "< cout<<"SupportsBatchUpdates? : "< cout<<"SupportsOuterJoins? : "< cout<<"SupportsMultipleTransactions? : "< cout<<"SupportsNamedParameters? : "< cout<<"SupportsStatementPooling? : "< cout<<"SupportsStoredProcedures? : "< cout<<"SupportsUnion? : "< cout<<"MaximumConnections: "< cout<<"MaximumColumnsperTable: "< cout<<"MaximumColumnsperIndex: "< cout<<"MaximumRowSizeperTable: "< cout<<"\nDatabaseschemas: "< auto_ptr cout<<"\nTotalnumberofschemas="< cout< introw=1; while(rs->next()){ cout<<"\t"< ++row; }//while cout< } /*获取结果集信息*/ staticvoidGetResultDataMetaBata(ResultSet*rs) { if(rs->rowsCount()==0) { throwruntime_error("ResultSetMetaDataFAILURE-norecordsintheresultset"); } cout<<"ResultSetMetadata"< cout<<"------------------"< /*Thefollowingcommentedstatementwon'tworkwithConnector/C++1.0.5andlater*/ //auto_ptr ResultSetMetaData*res_meta=rs->getMetaData(); intnumcols=res_meta->getColumnCount(); cout<<"\nNumberofcolumnsintheresultset="< cout.width(20); cout<<"ColumnName/Label"; cout.width(20); cout<<"ColumnType"; cout.width(20); cout<<"ColumnSize"< for(inti=0;i { cout.width(20); cout< cout.width(20); cout< cout.width(20); cout< } cout<<"\nColumn\""< (1); cout<<"\"belongstotheTable: \""< (1); cout<<"\"whichbelongstotheSchema: \""< (1)<<"\""< } /*打印结果集中的数据*/ staticvoidRetrieveDataAndPrint(ResultSet*rs,inttype,intcolidx,stringcolname) { /*retrievetherowcountintheresultset*/ cout<<"\nRetrieved"< cout<<"\nCityName"< cout<<"--------"< /*fetchthedata: retrievealltherowsintheresultset*/ while(rs->next()) { if(type==NUMOFFSET) { cout< }elseif(type==COLNAME) { cout< }//if-else }//while cout< } voidDemo() { Driver*driver; Connection*con; Statement*stmt; ResultSet*res; PreparedStatement*prep_stmt; Savepoint*savept; intupdatecount=0; /*initiateurl,user,passwordanddatabasevariables*/ stringurl(DBHOST); conststringuser(USER); conststringpassword(PASSWORD); conststringdatabase(DATABASE); try { driver=get_driver_instance(); /*createadatabaseconnectionusingtheDriver*/ con=driver->connect(url,user,password); /*alternatesyntaxusingauto_ptrtocreatethedbconnection*/ //auto_ptrcon(driver->connect(url,user,password)); /*turnofftheautocommit*/ con->setAutoCommit(0); cout<<"\nDatabaseconnection\'sautocommitmode="< /*selectappropriatedatabaseschema*/ con->setSchema(database); /*retrieveanddisplaythedatabasemetadata*/ GetDBMetaData(con); /*createastatementobject*/ stmt=con->createStatement(); cout<<"ExecutingtheQuery: \"SELECT*FROMCity\".."< /*runaquerywhichreturnsexactlyoneresultset*/ res=stmt->executeQuery("SELECT*FROMCity"); cout<<"Retrievingtheresultset.."< /*retrievethedatafromtheresultsetanddisplayonstdout*/ RetrieveDataAndPrint(res,NUMOFFSET,1,string("CityName")); /*retrieveanddisplaytheresultsetmetadata*/ GetResultDataMetaBata(res); cout<<"DemonstratingPreparedStatements.."< /*insertcoupleofrowsofdataintoCitytableusingPreparedStatements*/ prep_stmt=con->prepareStatement("INSERTINTOCity(CityName)VALUES(? )"); cout<<"\tInserting\"London,UK\"intothetable,City.."< prep_stmt->setString(1,"London,UK"); updatecount=prep_stmt->executeUpdate(); cout<<"\tCreatingasavepoint\"SAVEPT1\".."< savept=con->setSavepoint("SAVEPT1"); cout<<"\tInserting\"Paris,France\"intothetable,City.."< prep_stmt->setString(1,"Paris,France"); updatecount=prep_stmt->executeUpdate(); cout<<"\tRollingbackuntilthelastsavepoint\"SAVEPT1\".."< con->rollback(savept); con->releaseSavepoint(savept); cout<<"\tCommittingoutstandingupdatestothedatabase.."< con->commit(); cout<<"\nQueryingtheCitytableagain.."< /*re-useresultsetobject*/ res=NULL; res=stmt->executeQuery("SELECT*FROMCity"); /*retrievethedatafromtheresultsetanddisplayonstdout*/ RetrieveDataAndPrint(res,COLNAME,1,string("CityName")); cout<<"Cleaninguptheresources.."< /*Cleanup*/ deleteres; deletestmt; deleteprep_stmt; con->close(); deletecon; }catc
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 连接 数据库