Thursday, August 28, 2008

How can we connect to database using C/C++ ?

There are no standard libraries in C or C++ for handling any DBMS. We can only connect and communicate with DBMS using platform specific libraries that come with the compilers or 3rd party libraries, or libraries provided by different DBMS vendors.

Connecting to Database using Turbo C/C++

If you have a 16 bit compiler like Turbo C/C++ for DOS, then you cannot connect or access any database as there are no libraries supporting that compiler. You will need the new version of Turbo C++ (ie. Turbo C++ 2006 for Win32) which provides libraries for many different databases such as MSAccess, MySQL, Oracle, InterBase etc. You can download the new Turbo C++ 2006 (Explorer Edition) for free from http://turboexplorer.com/cpp. The help and documentation for Turbo C++ 2006 contains examples for connecting and querying different databases.

DBMS Libraries for C


MySQL C API
MySQL provides C language APIs for communicating with MySQL databases. These APIs are platform independant and comes with the MySQL setup package. For more information on how to use these APIs, read their reference manual which can be found at:http://dev.mysql.com/doc/refman/5.0/en/c.html

DBMS Libraries for C++


OTL
OTL is a platform independent database library. It covers the functionality of a whole database API with just a handful of concrete classes and several template PL/SQL (Oracle) table container classes. The OTL code gets expanded into direct database API function calls, so it provides ultimate performance, reliability and thread safety in multi-processor environments as well as traditional batch programs. It supports Oracle 7 (natively via OCI7), Oracle 8 (natively via OCI8), Oracle 8i (natively via OCI8i), Oracle 9i (natively via OCI9i), Oracle 10g (natively via OCI10g), DB2 (natively via DB2 CLI), ODBC 3.x as well as ODBC 2.5 compliant data sources in MS Windows and Unix (e.g. Oracle, MS SQL Server, Sybase, Informix, MySQL, DB2, Interbase / Firebird, PostgreSQL, SQLite, SAP/DB, TimesTen, MS ACCESS, etc.). The list of supported database backends is constantly growing.

MySQL++
MySQL++ provides C++ wrapper classes for C API's of MySQL database. More information can be found on their website at:
http://tangentsoft.net/mysql++/

SQLAPI++ Library
SQLAP++ provides C++ APIs which can be used to access different databases, such as Oracle, SQL Server, DB2, Sybase, Informix, InterBase, SQLBase, MySQL, PostgreSQL and ODBC. You can find more information and links to download the library from: http://www.sqlapi.com/

Code examples

Here is an MSDN link on how to connect to an Oracle database using VC++:
http://msdn.microsoft.com/archive/default.asp?url=/archive/en-us/dnaroledbp/html/msdn_ole4orcl.asp

Example for connecting and querying an MySQL Database, courtesy: Delbrooks's post in C community thread.
/*The 2 lines of code include the proper files in order to be able to compile the project. They are:*/
#include
#include
/*The several lines are used to #define the database details such as the host, the username, the password, and the database to connect to. Instead of creating 4 char pointers, I use 4 #define's like so:*/
#define host "localhost"
#define username "db_username"
#define password "db_password"
#define database "db"
/*You will have to change the values in the quotes to match the values that fit you. */

/*The next line creates a pointer of type MYSQL to the active database connection:*/
MYSQL *conn;

/*This program, being as simple as it is, will contain only one user defined function, main() and the rest of the functions used will be from the mySQL++ API (application program interface).*/

/*The next lines are ones that we all know and love:*/
int main()
{
/*Followed by that, we tell mySQL that are are about to connect with the mysql_init() function.
We pass a value of NULL to it because for our purposes, we don't need to go into it any further:*/

conn = mysql_init(NULL);

/*The next step is to actually connect to the database. This is where the conn variable and the host,
username, password, and database #define's are used:*/

mysql_real_connect(conn,host,username,password,database,0,NULL,0);

/*The next 3 lines are code that define variables to get a result and row pointer from the database,
along with a variable to increment in the loop if there is more than one row returned by the query:*/

MYSQL_RES *res_set;
MYSQL_ROW row;
unsigned int i;

/*Finally, we query the database with the following query using the mysql_query() function: "SELECT * FROM users" like so:*/
mysql_query(conn,"SELECT * FROM users WHERE userid=1");

/*After querying the result, we need to store the result data in the variable res_set we defined earlier. This is done like so:*/
res_set = mysql_store_result(conn);

/*In our example, there will most likely be more than one row returned (i.e., if there are more than one user in
the users table of the database). If so, then you need to find how many rows are returned so that you can
loop through each one and print the result of each one like so:*/

unsigned int numrows = mysql_num_rows(res_set);

/*Finally, we retrive the result using the function mysql_fetch_row() and then print out all of the data in large chunks.
This is done like so:*/

while ((row = mysql_fetch_row(res_set)) != NULL)
{
/*However, looping through the number of rows returned is useless if you don't find the number of fields in each row
(in this case, they are all the same because the query comes from the same table, but, if the query were produced
on the fly [in the while loop], then the function mysql_num_fields() is used to find the number of fields). I hope that
makes sense. Here goes:*/

for (i=0; i&ltmysql_num_fields(res_set); i++)
{
/*And finally, after all this time, we print the stuff out using the plain old C standard function printf():*/
printf("%s\n",row[ i ] ! = NULL ? row : "NULL");
}
}
/*Last but certainly not least, we close our connection to the database. When there are multiple connects and many users
accessing the database at the same time, it is essential that you connect and disconnect as soon as possible, or you can
have disasterous results. The final lines of code disconnect from the database and then exit the main() function:*/

mysql_close(conn);
return 0;
}


Below is an example code on how to connect to Sybase using C on UNIX flavors:
/* Anyone who understands this code, please edit this page and add comments*/
#include
#include
#include
int main()
{
DBPROCESS *dbproc;
LOGINREC *login;
DBCHAR name1[15];
DBINT no1;
RETCODE ret_code;
fflush(stdout);
dbinit();
login=dblogin();
DBSETLUSER(login,);
DBSETLPWD(login,);
dbproc=dbopen(login,NULL);
dbcmd(dbproc,"select * from table");
dbsqlexec(dbproc);
return 0;
}

2 comments:

Unknown said...

I need a c program that, when given a table name and database name as arguments, will query the informix & postgresql system tables to get all permissions granted to various users on that table. The program will then generate sql statements to grant all these permissions on the table and write these statements to a file which can be run later.

Arun said...

thank you for sharing but it will not working.

https://nielitexam.blogspot.in