<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	<meta name="verify-v1" content="ynzW/GE7rr+SwTxuVauAHAJHCND7JANXtoLBw5Ci6tY=" />
	<title>MySQL ::  The world's most popular open source database</title> 

	 

	<link rel="stylesheet" type="text/css" media="screen" href="../../../common/css/mysql.css" />
	<link rel="stylesheet" type="text/css" media="projection" href="../../../common/css/mysql.css" />
	<link rel="stylesheet" type="text/css" media="print" href="../../../common/css/print.css" />
	
	 
		
		
		
		
	 
		<link rel="shortcut icon" href="../../../common/themes/sakila/favicon.ico" />
	
		<script language="javascript" type="text/javascript" src="../../../common/js/clear_search_text.js"></script>
    	
		<noscript></noscript>
	    
		    
    <script type="text/javascript" src="http://s7.addthis.com/js/250/addthis_widget.js"></script>
    
    
</head>

<body  >

<div id="container">

<!--UdmComment-->
<a class="skipToContent" href="MySQLConnectorC++Client.cpp#mainContent">Skip navigation links</a>

	<div id="header" >
	
	<div class="left">
							    <div id="logo-cic">
		    		    	
		    <a href="../../../index.html" title="MySQL">
		    		    <img src="../../../common/logos/logo-mysql-110x57.png" alt="MySQL" width="110" height="57" /></a>
		    </div>
		    <div id="tagline-cic">The world's most popular open source database</div>
				
				

	</div>
	
	<div class="right">
				
		<div id="search_box"> <!-- Start Search -->
				    <form id="searchform" name="searchform" method="get" action="http://search.mysql.com/search">
			<input type="text" id="q" name="q" value="Search" class="swap_value" onfocus="clearSearchText();" />
			<input type="hidden" name="ie" value="" />
			<input type="hidden" name="lr" value="lang_en" />
			<input type="image" src="../../../common/themes/sakila/search_g.png" id="go" alt="Search" title="Search" value="Search" />
		    </form>
		
		</div> <!-- End Search -->

				
		  		  
		<div id="login" >
			
		  	
				
									 <p><a href="http://dev.mysql.com/login/?dest=http%3a%2f%2fdev.mysql.com%2Ftech-resources%2Farticles%2Fconnector-cpp%2FMySQLConnectorC%2B%2BClient.cpp">Login</a> | <a href="http://dev.mysql.com/register.php">Register</a></p>
									</div>
  
			</div>

	</div> 

	<!-- MySQL Navigation -->
	<div id="nav_container">
	
	<div id="flags">
            <ul>
		<br />
            </ul>
        </div>
		
						<div id="tab_first">
		<ul>
			<li class="current"><a href="../../../index.html">Developer Zone</a></li>
			<li class="first"><a href="../../../downloads/index.html" onclick="javascript: pageTracker._trackPageview('/FP/Tabs/Downloads');">Downloads</a></li>
			<li><a href="../../../doc/index.html">Documentation</a></li>
		</ul>
		</div>
		
						

	
	<div id="mysql_menu">
	    <ul>
	<li class="link"><a  href="../../../index.html">DevZone</a>
	
		
		
	</li>
	
	<li class="link"><a  href="../../../librarian/index.html">Librarian</a>
	
		
		
	</li>
	
	<li class="current"><a class="current " href="../index.html">Articles</a>
	
		
		
	</li>
	
	<li class="link"><a  href="http://dev.mysql.com/news-and-events/news/index.html">News and Events</a>
	
		
		
	</li>
	
	<li class="link"><a  href="http://forums.mysql.com/">Forums</a>
	
		
		
	</li>
	
	<li class="link"><a  href="http://bugs.mysql.com/">Bugs</a>
	
		
		
	</li>
	
	<li class="link"><a  href="http://forge.mysql.com/">Forge</a>
	
		
		
	</li>
	
	<li class="link"><a  href="http://planet.mysql.com/">Planet MySQL</a>
	
		
		
	</li>
	
	<li class="link last"><a  href="http://labs.mysql.com/">Labs</a>
	
		
		
	</li>
	
</ul>
	</div>

		<div id="og_sakila">&nbsp;</div>
	        <div id="og_title">&nbsp;</div>
	
	</div>
	<!-- End Navigation Container -->

<!--/UdmComment-->

<div class="page_container">

		
	 <div class="page_sidebar">
		
		<!--UdmComment-->
	
		<div id="menu_title">
				&nbsp;
		</div>
		
		<div id="menu">
				<ul>
	<li class="current"><a class="current " href="../index.html">Articles</a>
	
		
		
	</li>
	
	<li class="link"><a  href="../../../why-mysql/white-papers/index.html">White Papers</a>
	
		
		
	</li>
	
	<li class="link"><a  href="../../../why-mysql/case-studies/index.html">Case Studies</a>
	
		
		
	</li>
	
	<li class="link last"><a  href="../../interviews/index.html">Interviews</a>
	
		
		
	</li>
	
</ul> 
		</div>
	
		<br class="clear" />
		
				
			
				
						
				
				
					
			
			
										
				<div><a href="http://www.mysql.com/click.php?e=35251"><img src="../../../common/themes/sakila/banners/h12-newsletter-subscribe.en.png" alt="MySQL Newsletter - Subscribe Today!" width="230" height="100" border="0" /></a></div>
							
        				
								
			
	<!--/UdmComment-->
	</div>		
	
	  
<!-- Main content -->
<a name="mainContent"></a>

<div id="page" class="sidebar" >

	 
		<h1 class="page_header">The world's most popular open source database</h1>
	 
	
	




	/* Standard C++ headers */
#include <iostream>
#include <sstream>
#include <memory>
#include <string>
#include <stdexcept>

/* MySQL Connector/C++ specific headers */
#include <driver.h>
#include <connection.h>
#include <statement.h>
#include <prepared_statement.h>
#include <resultset.h>
#include <metadata.h>
#include <resultset_metadata.h>
#include <exception.h>
#include <warning.h>
	
#define DBHOST "tcp://127.0.0.1:3306"
#define USER "root"
#define PASSWORD "admin"
#define DATABASE "test"

#define NUMOFFSET 100
#define COLNAME 200

using namespace std;
using namespace sql;

static void retrieve_data_and_print (ResultSet *rs, int type, int colidx, string colname) {

	/* retrieve the row count in the result set */
	cout << "\nRetrieved " << rs -> rowsCount() << " row(s)." << endl;

	cout << "\nCityName" << endl;
	cout << "--------" << endl;

	/* fetch the data : retrieve all the rows in the result set */
	while (rs->next()) {
		if (type == NUMOFFSET) {
                       cout << rs -> getString(colidx) << endl;
		} else if (type == COLNAME) {
                       cout << rs -> getString(colname) << endl;
		} // if-else
	} // while

	cout << endl;

} // retrieve_data_and_print()

static void retrieve_dbmetadata_and_print (Connection *dbcon) {

	if (dbcon -> isClosed()) {
		throw runtime_error("DatabaseMetaData FAILURE - database connection closed");
	}

	cout << "\nDatabase Metadata" << endl;
	cout << "-----------------" << endl;

	cout << boolalpha;

	/* The following commented statement won't work with Connector/C++ 1.0.5 and later */
	//auto_ptr < DatabaseMetaData > dbcon_meta (dbcon -> getMetaData());

	DatabaseMetaData *dbcon_meta = dbcon -> getMetaData();

	cout << "Database Product Name: " << dbcon_meta -> getDatabaseProductName() << endl;
	cout << "Database Product Version: " << dbcon_meta -> getDatabaseProductVersion() << endl;
	cout << "Database User Name: " << dbcon_meta -> getUserName() << endl << endl;

	cout << "Driver name: " << dbcon_meta -> getDriverName() << endl;
	cout << "Driver version: " << dbcon_meta -> getDriverVersion() << endl << endl;

	cout << "Database in Read-Only Mode?: " << dbcon_meta -> isReadOnly() << endl;
	cout << "Supports Transactions?: " << dbcon_meta -> supportsTransactions() << endl;
	cout << "Supports DML Transactions only?: " << dbcon_meta -> supportsDataManipulationTransactionsOnly() << endl;
	cout << "Supports Batch Updates?: " << dbcon_meta -> supportsBatchUpdates() << endl;
	cout << "Supports Outer Joins?: " << dbcon_meta -> supportsOuterJoins() << endl;
	cout << "Supports Multiple Transactions?: " << dbcon_meta -> supportsMultipleTransactions() << endl;
	cout << "Supports Named Parameters?: " << dbcon_meta -> supportsNamedParameters() << endl;
	cout << "Supports Statement Pooling?: " << dbcon_meta -> supportsStatementPooling() << endl;
	cout << "Supports Stored Procedures?: " << dbcon_meta -> supportsStoredProcedures() << endl;
	cout << "Supports Union?: " << dbcon_meta -> supportsUnion() << endl << endl;

	cout << "Maximum Connections: " << dbcon_meta -> getMaxConnections() << endl;
	cout << "Maximum Columns per Table: " << dbcon_meta -> getMaxColumnsInTable() << endl;
	cout << "Maximum Columns per Index: " << dbcon_meta -> getMaxColumnsInIndex() << endl;
	cout << "Maximum Row Size per Table: " << dbcon_meta -> getMaxRowSize() << " bytes" << endl;

	cout << "\nDatabase schemas: " << endl;

	auto_ptr < ResultSet > rs ( dbcon_meta -> getSchemas());

	cout << "\nTotal number of schemas = " << rs -> rowsCount() << endl;
	cout << endl;

	int row = 1;

	while (rs -> next()) {
		cout << "\t" << row << ". " << rs -> getString("TABLE_SCHEM") << endl;
		++row;
	} // while

	cout << endl << endl;

} // retrieve_dbmetadata_and_print()

static void retrieve_rsmetadata_and_print (ResultSet *rs) {

	if (rs -> rowsCount() == 0) {
		throw runtime_error("ResultSetMetaData FAILURE - no records in the result set");
	}

	cout << "ResultSet Metadata" << endl;
	cout << "------------------" << endl;

	/* The following commented statement won't work with Connector/C++ 1.0.5 and later */
	//auto_ptr < ResultSetMetaData > res_meta ( rs -> getMetaData() );

	ResultSetMetaData *res_meta = rs -> getMetaData();

	int numcols = res_meta -> getColumnCount();
	cout << "\nNumber of columns in the result set = " << numcols << endl << endl;

	cout.width(20);
	cout << "Column Name/Label";
	cout.width(20);
	cout << "Column Type";
	cout.width(20);
	cout << "Column Size" << endl;

	for (int i = 0; i < numcols; ++i) {
		cout.width(20);
		cout << res_meta -> getColumnLabel (i+1);
		cout.width(20); 
		cout << res_meta -> getColumnTypeName (i+1);
		cout.width(20); 
		cout << res_meta -> getColumnDisplaySize (i+1) << endl << endl;
	}

	cout << "\nColumn \"" << res_meta -> getColumnLabel(1);
	cout << "\" belongs to the Table: \"" << res_meta -> getTableName(1);
	cout << "\" which belongs to the Schema: \"" << res_meta -> getSchemaName(1) << "\"" << endl << endl;

} // retrieve_rsmetadata_and_print()


int main(int argc, const char *argv[]) {

	Driver *driver;
	Connection *con;
	Statement *stmt;
	ResultSet *res;
	PreparedStatement *prep_stmt;
	Savepoint *savept;

	int updatecount = 0;

	/* initiate url, user, password and database variables */
	string url(argc >= 2 ? argv[1] : DBHOST);
	const string user(argc >= 3 ? argv[2] : USER);
	const string password(argc >= 4 ? argv[3] : PASSWORD);
	const string database(argc >= 5 ? argv[4] : DATABASE);

	try {
		driver = get_driver_instance();
		
		/* create a database connection using the Driver */
		con = driver -> connect(url, user, password);

		/* alternate syntax using auto_ptr to create the db connection */
		//auto_ptr  con (driver -> connect(url, user, password));

		/* turn off the autocommit */
		con -> setAutoCommit(0);

		cout << "\nDatabase connection\'s autocommit mode = " << con -> getAutoCommit() << endl;

		/* select appropriate database schema */
		con -> setSchema(database);

		/* retrieve and display the database metadata */
		retrieve_dbmetadata_and_print (con);

		/* create a statement object */
		stmt = con -> createStatement();

		cout << "Executing the Query: \"SELECT * FROM City\" .." << endl;

		/* run a query which returns exactly one result set */
		res = stmt -> executeQuery ("SELECT * FROM City");

		cout << "Retrieving the result set .." << endl;

		/* retrieve the data from the result set and display on stdout */
		retrieve_data_and_print (res, NUMOFFSET, 1, string("CityName"));

		/* retrieve and display the result set metadata */
		retrieve_rsmetadata_and_print (res);

		cout << "Demonstrating Prepared Statements .. " << endl << endl;

		/* insert couple of rows of data into City table using Prepared Statements */
		prep_stmt = con -> prepareStatement ("INSERT INTO City (CityName) VALUES (?)");

		cout << "\tInserting \"London, UK\" into the table, City .." << endl;

		prep_stmt -> setString (1, "London, UK");
		updatecount = prep_stmt -> executeUpdate();

		cout << "\tCreating a save point \"SAVEPT1\" .." << endl;
		savept = con -> setSavepoint ("SAVEPT1");

		cout << "\tInserting \"Paris, France\" into the table, City .." << endl;

		prep_stmt -> setString (1, "Paris, France");
		updatecount = prep_stmt -> executeUpdate();

		cout << "\tRolling back until the last save point \"SAVEPT1\" .." << endl;
		con -> rollback (savept);
		con -> releaseSavepoint (savept);

		cout << "\tCommitting outstanding updates to the database .." << endl;
		con -> commit();

		cout << "\nQuerying the City table again .." << endl;

		/* re-use result set object */
		res = NULL;
		res = stmt -> executeQuery ("SELECT * FROM City");

		/* retrieve the data from the result set and display on stdout */
		retrieve_data_and_print (res, COLNAME, 1, string ("CityName"));

		cout << "Cleaning up the resources .." << endl;

		/* Clean up */
		delete res;
		delete stmt;
		delete prep_stmt;
		con -> close();
		delete con;

	} catch (SQLException &e) {
		cout << "ERROR: SQLException in " << __FILE__;
		cout << " (" << __func__<< ") on line " << __LINE__ << endl;
		cout << "ERROR: " << e.what();
		cout << " (MySQL error code: " << e.getErrorCode();
		cout << ", SQLState: " << e.getSQLState() << ")" << endl;

		if (e.getErrorCode() == 1047) {
			/*
			Error: 1047 SQLSTATE: 08S01 (ER_UNKNOWN_COM_ERROR)
			Message: Unknown command
			*/
			cout << "\nYour server does not seem to support Prepared Statements at all. ";
			cout << "Perhaps MYSQL < 4.1?" << endl;
		}

		return EXIT_FAILURE;
	} catch (std::runtime_error &e) {

		cout << "ERROR: runtime_error in " << __FILE__;
		cout << " (" << __func__ << ") on line " << __LINE__ << endl;
		cout << "ERROR: " << e.what() << endl;

		return EXIT_FAILURE;
	}

	return EXIT_SUCCESS;
} // main()








 </div> 
</div> 
<div id="footer">


    <div class="links">
        <ul>
            <li class="top"><a href="../../../index.html">Developer Zone</a></li>
	    <li><a href="../../../doc/index.html">Documentation</a></li>
            <li><a href="../../../librarian/index.html">Librarian</a></li>
            <li><a href="../index.html">Developer Articles</a></li>
			<li><a href="http://dev.mysql.com/news-and-events/">News &amp; Events</a></li>
            <li><a href="http://forums.mysql.com/">Forums</a></li>
            <li><a href="http://bugs.mysql.com/">Bugs</a></li>
            <li><a href="http://forge.mysql.com/">Forge</a></li>
			            <li><a href="http://planet.mysql.com/">Planet MySQL</a></li>
			            <li><a href="http://labs.mysql.com/">Labs</a></li>
        </ul>
    </div>
    
    <div class="links">
        <ul>
            <li class="top"><a href="../../../downloads/index.html">Downloads</a></li>
            <li><a href="../../../downloads/mysql/index.html">MySQL Community Server</a></li>
            <li><a href="../../../downloads/mysql-proxy/index.html">MySQL Proxy</a></li>
            <li><a href="../../../downloads/cluster/index.html">MySQL Cluster</a></li>
            <li><a href="../../../downloads/workbench/index.html">MySQL Workbench</a></li>
            <li><a href="../../../downloads/connector/index.html">Connectors</a></li>
            <li><a href="http://downloads.mysql.com/archives.php">Archives</a></li>
            <li><a href="http://downloads.mysql.com/snapshots.php">Snapshots</a></li>
            <li><a href="../../../downloads/mirrors.html">Mirrors</a></li>
        </ul>
    </div>
    
    <div class="links">
        <ul>
            <li class="top"><a href="../../../doc/index.html">Documentation</a></li>
            <li><a href="../../../doc/index.html">MySQL Reference Manuals</a></li>
            <li><a href="../../../doc/index-gui.html">MySQL Workbench</a></li>
            <li><a href="../../../doc/index-expert.html">Expert Guides</a></li>
            <li><a href="../../../doc/index-topic.html">Topic Guides</a></li>
            <li><a href="../../../doc/index-cluster.html">MySQL Cluster</a></li>
            <li><a href="../../../doc/index-other.html">Other Documents</a></li>
            <li><a href="../../../doc/index-mysqlu.html">MySQL University</a></li> 
            <li><a href="../../../doc/index-about.html">About</a></li>     
            <li><a href="../../../doc/index-archive.html">Archives</a></li>   
        </ul>
    </div>

    <div class="links">
        <ul>
            <li class="top"><a href="../../../support/index.html">Support</a></li>
            <li><a href="http://forge.mysql.com/wiki/Category:MySQLUserGroups">MySQL Meetups</a></li>
            <li><a href="../../../guilds/index.html">Guilds</a></li>
            <li><a href="http://lists.mysql.com/">Lists</a></li>
            <li><a href="http://forums.mysql.com/">Forums</a></li>            
		</ul>
			
		<ul>
            <li class="top">Other</li>      
            <li><a href="../../../legal/mysql_web_privacy_policy.html">Privacy Policy</a></li>
			<li><a href="../../../contact/index.html">Contact Us</a></li>
            <li><a href="../../../sitemap.html">Site Map</a></li>
        </ul>
    </div>
    

        
    <div id="search" class="en">
        <form id="footer_search" action="http://search.mysql.com/search" method="get">
            <input type="text" id="f_q" name="q" value="" class="swap_value" onfocus="clearSearchText();" />
	    <input type="image" src="../../../common/themes/sakila/footer_search_g.png" id="f_go" alt="Search" title="Search" value="Search" />
        </form>
    </div>

</div><!-- End Footer -->
    
        <div id="copyright-oracle"><a href="http://www.oracle.com/"><img src="../../../common/logos/logo-oracle-red-91x22.gif" alt="Oracle" width="91" height="22" border="0" /></a>&nbsp;&nbsp;<span>&copy; 2010, Oracle Corporation and/or its affiliates</span></div>
    
    <script type="text/javascript">
    var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
    document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
    </script>
    <script type="text/javascript">
    var pageTracker = _gat._getTracker("UA-225536-3");
    pageTracker._trackPageview();
    </script>

<script type="text/javascript" src="../../../common/js/s_code_remote.js?ver=20091011"></script>

</body>
</html>