编程语言

img allen77

MySQL数据库学习笔记(三)

发表于2004/11/2 14:12:00  847人阅读

附录一 Mytest.c

/****************************************************************/

/*    Author:    Allen Lee TS :  2/ 4/2004  9:15   */

/*    Date:       2/ 4/2004                                   */

/*    mytest.c :  test DDL statment*/

/*                                                     */

/*    History:                                      */

/*                  */

/****************************************************************/

 

 

#include  <windows.h>

#include  <stdio.h>

#include  <string.h>

 

#include  <mysql.h>

#define STRING_SIZE 50

 

#define DROP_SAMPLE_TABLE "DROP TABLE IF EXISTS test_table"

#define CREATE_SAMPLE_TABLE "CREATE TABLE test_table(col1 INT,/

                                                 col2 VARCHAR(40),/

                                                 col3 SMALLINT,/

                                                 col4 TIMESTAMP)"

#define INSERT_SAMPLE "INSERT INTO test_table(col1,col2,col3) VALUES(?,?,?)"

 

int main(int argc, char **argv){

 

       MYSQL *mysql;

 

       mysql = mysql_init(NULL);

       if(!mysql_real_connect(mysql, "localhost","root","","",3306,"",NULL)){ /* Make connection with mysql_connect(MYSQL db, char *host, char *username, char *password */

       printf(mysql_error(mysql));

       exit(1);

       }

 

       if(mysql_select_db(mysql, "test")){ /* Select the database we want to use */

       printf(mysql_error(mysql));

       exit(1);

       }

 

       MYSQL_STMT    *stmt;

       MYSQL_BIND    bind[3];

       my_ulonglong  affected_rows;

       int           param_count;

       short         small_data;

       int           int_data;

       char          str_data[STRING_SIZE];

       unsigned long str_length;

       my_bool       is_null;

 

       if (mysql_query(mysql, DROP_SAMPLE_TABLE))

       {

         fprintf(stderr, " DROP TABLE failed/n");

         fprintf(stderr, " %s/n", mysql_error(mysql));

         exit(0);

       }

 

       if (mysql_query(mysql, CREATE_SAMPLE_TABLE))

       {

         fprintf(stderr, " CREATE TABLE failed/n");

         fprintf(stderr, " %s/n", mysql_error(mysql));

         exit(0);

       }

 

       /* Prepare an INSERT query with 3 parameters */

       /* (the TIMESTAMP column is not named; it will */

       /* be set to the current date and time) */

       stmt = mysql_prepare(mysql, INSERT_SAMPLE, strlen(INSERT_SAMPLE));

       if (!stmt)

       {

         fprintf(stderr, " mysql_prepare(), INSERT failed/n");

         fprintf(stderr, " %s/n", mysql_error(mysql));

         exit(0);

       }

       fprintf(stdout, " prepare, INSERT successful/n");

 

       /* Get the parameter count from the statement */

       param_count= mysql_param_count(stmt);

       fprintf(stdout, " total parameters in INSERT: %d/n", param_count);

 

       if (param_count != 3) /* validate parameter count */

       {

         fprintf(stderr, " invalid parameter count returned by MySQL/n");

         exit(0);

       }

 

       /* Bind the data for all 3 parameters */

 

       /* INTEGER PARAM */

       /* This is a number type, so there is no need to specify buffer_length */

       bind[0].buffer_type= MYSQL_TYPE_LONG;

       bind[0].buffer= (char *)&int_data;

       bind[0].is_null= 0;

       bind[0].length= 0;

 

       /* STRING PARAM */

       bind[1].buffer_type= MYSQL_TYPE_VAR_STRING;

       bind[1].buffer= (char *)str_data;

       bind[1].buffer_length= STRING_SIZE;

       bind[1].is_null= 0;

       bind[1].length= &str_length;

 

       /* SMALLINT PARAM */

       bind[2].buffer_type= MYSQL_TYPE_SHORT;

       bind[2].buffer= (char *)&small_data;      

       bind[2].is_null= &is_null;

       bind[2].length= 0;

 

       /* Bind the buffers */

       if (mysql_bind_param(stmt, bind))

       {

         fprintf(stderr, " mysql_bind_param() failed/n");

         fprintf(stderr, " %s/n", mysql_stmt_error(stmt));

         exit(0);

       }

 

       /* Specify the data values for the first row */

       int_data= 10;             /* integer */

       strncpy(str_data, "MySQL", STRING_SIZE); /* string  */

       str_length= strlen(str_data);

 

       /* INSERT SMALLINT data as NULL */

       is_null= 1;

 

       /* Execute the INSERT statement - 1*/

       if (mysql_execute(stmt))

       {

         fprintf(stderr, " mysql_execute(), 1 failed/n");

         fprintf(stderr, " %s/n", mysql_stmt_error(stmt));

         exit(0);

       }

 

       /* Get the total number of affected rows */  

       affected_rows= mysql_stmt_affected_rows(stmt);

       fprintf(stdout, " total affected rows(insert 1): %ld/n", affected_rows);

 

       if (affected_rows != 1) /* validate affected rows */

       {

         fprintf(stderr, " invalid affected rows by MySQL/n");

         exit(0);

       }

 

       /* Specify data values for second row, then re-execute the statement */

       int_data= 1000;            

       strncpy(str_data, "The most popular open source database", STRING_SIZE);

       str_length= strlen(str_data);

       small_data= 1000;         /* smallint */

       is_null= 0;               /* reset */

 

       /* Execute the INSERT statement - 2*/

       if (mysql_execute(stmt))

       {

         fprintf(stderr, " mysql_execute, 2 failed/n");

         fprintf(stderr, " %s/n", mysql_stmt_error(stmt));

         exit(0);

       }

 

       /* Get the total rows affected */  

       affected_rows= mysql_stmt_affected_rows(stmt);

       fprintf(stdout, " total affected rows(insert 2): %ld/n", affected_rows);

 

       if (affected_rows != 1) /* validate affected rows */

       {

         fprintf(stderr, " invalid affected rows by MySQL/n");

         exit(0);

       }

 

       /* Close the statement */

       if (mysql_stmt_close(stmt))

       {

         fprintf(stderr, " failed while closing the statement/n");

         fprintf(stderr, " %s/n", mysql_stmt_error(stmt));

         exit(0);

       }

 

       mysql_close(mysql);

 

return 0;

}


附录二 createdb.cpp

#include <windows.h>

#include <iostream>

#include <sqlplus.hh>

 

int main (int argc, char *argv[]) {

  Connection connection(use_exceptions);

  try { // the entire main block is one big try block;

 

    if (argc == 1) connection.connect("mysql_cpp_data","localhost","root","");

    else if (argc == 2) connection.connect("",argv[1]);

    else if (argc == 3) connection.connect("",argv[1],argv[2]);

    else if (argc <= 4) connection.connect("",argv[1],argv[2],argv[3]);

    // create a new object and connect based on any (if any) arguments

    // passed to main();

   

    try {

      connection.select_db("mysql_cpp_data");

    } catch (BadQuery er) {

      // if it couldn't connect to the database assume that it doesn't exist

      // and try created it.  If that does not work exit with an error.

      connection.create_db("mysql_cpp_data");

      connection.select_db("mysql_cpp_data");

    }

   

    Query query = connection.query();  // create a new query object

   

    try { // ignore any errors here

          // I hope to make this simpler soon

      query.execute("drop table stock");

    } catch (BadQuery er) {}

   

    query << "create table stock  (item char(20) not null, num bigint,"

         << "weight double, price double, sdate date)";

    query.execute(RESET_QUERY);

    // send the query to create the table and execute it.  The

    // RESET_QUERY tells the query object to reset it self after

    // execution

   

    query << "insert into %5:table values (%0q, %1q, %2, %3, %4q)";

    query.parse();

    // set up the template query I will use to insert the data.  The

    // parse method call is important as it is what lets the query

    // know that this is a template and not a literal string

   

    query.def["table"] = "stock";

    // This is setting the parameter named table to stock.

   

    query.execute ("Hamburger Buns", 56, 1.25, 1.1, "1998-04-26");

    query.execute ("Hotdogs' Buns"   ,65, 1.1 , 1.1, "1998-04-23");

    query.execute ("Dinner Roles"  , 75,  .95, .97, "1998-05-25");

    query.execute ("Allen Lee"   , 87, 1.5, 1.75, "1998-09-04");

    // The last parameter "table" is not specified here.  Thus

    // the default value for "table" is used which is "stock".

 

  } catch (BadQuery er) { // handle any errors that may come up

    cerr << "Error: " << er.error << endl;

    return -1;

  }

}

 


附录三 fieldinf.cpp

#include <windows.h>

#include <iostream>

#include <iomanip>

#include <sqlplus.hh>

 

int main() {

  try { // its in one big try block

 

    Connection con(use_exceptions);

    con.connect("mysql_cpp_data","localhost","root","");

    Query query = con.query();

    query << "select * from stock";

    Result res = query.store();

   

    cout << "Query: " << query.preview() << endl;

    cout << "Records Found: " << res.size() << endl << endl;

 

    cout << "Query Info:/n";

    cout.setf(ios::left);

 

    for (unsigned int i = 0; i < res.names().size(); i++) {

      cout << setw(2)  << i

          << setw(15) << res.names(i).c_str()

       // this is the name of the field

          << setw(15) << res.types(i).sql_name()

       // this is the SQL identifier name

       // Result::types(unsigned int) returns a mysql_type_info which in many

       // ways is like type_info except that it has additional sql type

       // information in it. (with one of the methods being sql_name())

          << setw(20) << res.types(i).name()

       // this is the C++ identifier name which most closely resembles

       // the sql name (its is implementation defined and often not very readable)

          << endl;

    }

 

    cout << endl;

   

    if (res.types(0) == typeid(string))

      cout << "Field 'item' is of an sql type which most closely resembles a/n"

          << "the c++ string type/n";

    // this is demonstrating how a mysql_type_info can be compared with a c++

    // type_info.

 

    if (res.types(1) == typeid(longlong))

      cout << "Field 'num' is of an sql type which most closely resembles a/n"

          << "the c++ long long int type/n";

    else if (res.types(1).base_type() == typeid(longlong))

      cout << "Field 'num' base type is of an sql type which most closely /n"

          << "resembles a the c++ long long int type/n";

    // However you have to be careful as if it can be null the actual type is

    // Null<TYPE> not TYPE.  So you should always use the base_type method

    // to get at the underlying type.  If the type is not null than this base

    // type would be the same as its type.

   

    return 0;

  } catch (BadQuery er) {

    cerr << "Error: " << er.error << endl;

    return -1;

  } catch (BadConversion er) { // handle bad conversions

    cerr << "Error: Tried to convert /"" << er.data << "/" to a /""

        << er.type_name << "/"." << endl;

    return -1;

  }

}

阅读全文
0 0

相关文章推荐

img
取 消
img