SQLExecDirectTest.cpp
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:11k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2003 MySQL AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13.  /**
  14.  * @file SQLExecDirectTest.cpp
  15.  */
  16. #include <common.hpp>
  17. #define EXD_MESSAGE_LENGTH 200
  18. #define EXD_NAME_LEN 10
  19. #define EXD_PHONE_LEN 10
  20. #define EXD_ADDRESS_LEN 10
  21. using namespace std;
  22. SQLHDBC     EXD_hdbc;
  23. SQLHSTMT    EXD_hstmt;
  24. SQLHENV     EXD_henv;
  25. SQLHDESC    EXD_hdesc;
  26. SQLRETURN   EXD_ret, SQLSTATEs;
  27.        
  28. void ExecDirect_DisplayError(SQLSMALLINT EXD_HandleType, 
  29.      SQLHSTMT EXD_InputHandle);
  30. int EXD_Display_Result(SQLHSTMT EXDR_InputHandle);
  31. /** 
  32.  * Test to execute a prepared ststement
  33.  *
  34.  * -# Normal case: Prepare and Execute a prepared statement
  35.  * -# Prepare and Execute an empty statement
  36.  * -# Prepare and Execute a statement with wrong henv handle
  37.  * -# Prepare and Execute a statement with wrong hdbc handle
  38.  * -# Prepare and Execute a statement with wrong hdesc handle
  39.  * @return Zero, if test succeeded
  40.  */
  41. int SQLExecDirectTest()
  42. {
  43.   ndbout << endl << "Start ExecDirect Testing" << endl;
  44.   //************************************
  45.   //** Allocate An Environment Handle **
  46.   //************************************
  47.   EXD_ret = SQLAllocHandle(SQL_HANDLE_ENV, 
  48.    SQL_NULL_HANDLE, 
  49.    &EXD_henv);
  50.   
  51. if (EXD_ret == SQL_SUCCESS || EXD_ret == SQL_SUCCESS_WITH_INFO)
  52.     ndbout << "Allocated an environment Handle!" << endl;
  53.   
  54.   //*********************************************
  55.   //** Set the ODBC application Version to 3.x **
  56.   //*********************************************
  57.   EXD_ret = SQLSetEnvAttr(EXD_henv, 
  58.   SQL_ATTR_ODBC_VERSION, 
  59.   (SQLPOINTER) SQL_OV_ODBC3, 
  60.   SQL_IS_UINTEGER);
  61.   
  62. if (EXD_ret == SQL_SUCCESS || EXD_ret == SQL_SUCCESS_WITH_INFO)
  63.     ndbout << "Set the ODBC application Version to 3.x!" << endl;
  64.   //**********************************
  65.   //** Allocate A Connection Handle **
  66.   //**********************************
  67.   EXD_ret = SQLAllocHandle(SQL_HANDLE_DBC, 
  68.    EXD_henv, 
  69.    &EXD_hdbc);
  70. if (EXD_ret == SQL_SUCCESS || EXD_ret == SQL_SUCCESS_WITH_INFO)
  71.     ndbout << "Allocated a connection Handle!" << endl;
  72.   
  73.   // *******************
  74.   // ** Connect to DB **
  75.   // *******************
  76.   EXD_ret = SQLConnect(EXD_hdbc, 
  77.        (SQLCHAR *) connectString(), 
  78.        SQL_NTS, 
  79.        (SQLCHAR *) "", 
  80.        SQL_NTS, 
  81.        (SQLCHAR *) "", 
  82.        SQL_NTS);
  83.   
  84. if (EXD_ret == SQL_SUCCESS || EXD_ret == SQL_SUCCESS_WITH_INFO)
  85.     ndbout << "Connected to DB : OK!" << endl;
  86.   else 
  87.     {  
  88.       ndbout << "Failure to Connect DB!" << endl;
  89.       return NDBT_FAILED;
  90.     }
  91.   //*******************************
  92.   //** Allocate statement handle **
  93.   //*******************************
  94.   
  95.   EXD_ret = SQLAllocHandle(SQL_HANDLE_STMT, 
  96.    EXD_hdbc, 
  97.    &EXD_hstmt); 
  98. if(EXD_ret == SQL_SUCCESS || EXD_ret == SQL_SUCCESS_WITH_INFO) 
  99.     ndbout << "Allocated a statement handle!" << endl;
  100.   //**********************************************
  101.   //** Test1                                    **
  102.   //** Prepare and Execute a prepared statement **
  103.   //**********************************************
  104.   EXD_ret = SQLExecDirect(EXD_hstmt, 
  105.   (SQLCHAR*)"SELECT * FROM Customers", 
  106.   SQL_NTS);
  107.   if (EXD_ret == SQL_INVALID_HANDLE)
  108.   {   
  109.     ndbout << "Handle Type is SQL_HANDLE_STMT, but SQL_INVALID_HANDLE" << endl;
  110.     ndbout << "still appeared. Please check program" << endl;
  111.   }
  112.   if (EXD_ret == SQL_ERROR || EXD_ret == SQL_SUCCESS_WITH_INFO)
  113.     ExecDirect_DisplayError(SQL_HANDLE_STMT, EXD_hstmt);
  114.   //*************************
  115.   //** Display the results **
  116.   //*************************
  117.   EXD_Display_Result(EXD_hstmt);
  118.   //*******************************************
  119.   //** Test2                                 **
  120.   //** Prepare and Execute an empty statement**
  121.   //** in order to see what will happen      **
  122.   //******************************************* 
  123.   EXD_ret = SQLExecDirect(EXD_hstmt, 
  124.   (SQLCHAR*)" ", 
  125.   SQL_NTS);
  126.   if (EXD_ret == SQL_ERROR || EXD_ret == SQL_SUCCESS_WITH_INFO)
  127.     {
  128.       ndbout << "Prepare and Execute an empty statement," << endl;
  129.       ndbout << "The following case happened!" << endl;
  130.       ExecDirect_DisplayError(SQL_HANDLE_STMT, EXD_hstmt);
  131.     }
  132.   //***************************************************************
  133.   //** Test3                                                     **         
  134.   //** Prepare and Execute a statement with wrong henv handle    **
  135.   //** in order to see what will happen                          **
  136.   //***************************************************************
  137.   EXD_ret = SQLExecDirect(EXD_henv,  
  138.   (SQLCHAR*)"SELECT * FROM Customers", 
  139.   SQL_NTS);
  140.   if (EXD_ret == SQL_SUCCESS_WITH_INFO || EXD_ret == SQL_SUCCESS)
  141.   { ndbout << "Handle Type is SQL_HANDLE_HENV, but SQL_INVALID_HANDLE" << endl;
  142.     ndbout << "still appeared. Please check programm" << endl;
  143.     ExecDirect_DisplayError(SQL_HANDLE_ENV, EXD_henv);
  144.   }
  145.   //******************************************************************
  146.   //** Test4                                                        **
  147.   //** Prepare and Execute a statement with wrong hdbc handle       **
  148.   //** in order to see what will happen                             **
  149.   //******************************************************************
  150.   EXD_ret = SQLExecDirect(EXD_hdbc,  
  151.   (SQLCHAR*)"SELECT * FROM Customers", 
  152.   SQL_NTS);
  153.   if (EXD_ret == SQL_SUCCESS_WITH_INFO || EXD_ret == SQL_SUCCESS)
  154.   ExecDirect_DisplayError(SQL_HANDLE_DBC, EXD_hdbc);
  155.   //*******************************************************************
  156.   //** Test5                                                         **
  157.   //** Prepare and Execute a statement with wrong hdesc handle       **
  158.   //** in order to see what will happen                              **
  159.   //*******************************************************************
  160.   EXD_ret = SQLExecDirect(EXD_hdesc,  
  161.   (SQLCHAR*)"SELECT * FROM Customers", 
  162.   SQL_NTS);
  163.   if (EXD_ret == SQL_SUCCESS_WITH_INFO || EXD_ret == SQL_SUCCESS)
  164.   {  
  165.   ndbout << "Handle Type is SQL_HANDLE_DESC, but SQL_SUCCESS_WITH_INFO" <<endl;
  166.   ndbout << "appeared. Please check program" << endl;
  167.   ExecDirect_DisplayError(SQL_HANDLE_DESC, EXD_hdesc);
  168.   }
  169.   // *********************************
  170.   // ** Disconnect and Free Handles **
  171.   // *********************************  
  172.   SQLDisconnect(EXD_hdbc);
  173.   SQLFreeHandle(SQL_HANDLE_STMT, EXD_hstmt);
  174.   SQLFreeHandle(SQL_HANDLE_DBC, EXD_hdbc);
  175.   SQLFreeHandle(SQL_HANDLE_ENV, EXD_henv);
  176.   return NDBT_OK;
  177.  }
  178. void ExecDirect_DisplayError(SQLSMALLINT EXD_HandleType, 
  179.      SQLHSTMT EXD_InputHandle)
  180. {
  181.      SQLCHAR EXD_Sqlstate[5];
  182.      SQLINTEGER   EXD_NativeError;
  183.      SQLSMALLINT  EXD_i, EXD_MsgLen;
  184.      SQLCHAR      EXD_Msg[EXD_MESSAGE_LENGTH];
  185.      SQLRETURN    SQLSTATEs;
  186.      EXD_i = 1;
  187.      ndbout << "-------------------------------------------------" << endl;
  188.      ndbout << "Error diagnostics:" << endl;
  189.   
  190.      while ((SQLSTATEs = SQLGetDiagRec(EXD_HandleType, 
  191.        EXD_InputHandle, 
  192.        EXD_i, 
  193.        EXD_Sqlstate, 
  194.        &EXD_NativeError, 
  195.        EXD_Msg, 
  196.        sizeof(EXD_Msg), 
  197.        &EXD_MsgLen)) 
  198.     != SQL_NO_DATA)                   {
  199.      ndbout << "the HandleType is:" << EXD_HandleType << endl;
  200.      ndbout << "the InputHandle is :" << (long)EXD_InputHandle << endl;
  201.      ndbout << "the ColAtt_Msg is: " << (char *) EXD_Msg << endl;
  202.      ndbout << "the output state is:" << (char *)EXD_Sqlstate << endl; 
  203.      EXD_i ++;
  204.      //     break;
  205.                                                        }
  206.      ndbout << "-------------------------------------------------" << endl;
  207. }
  208. int EXD_Display_Result(SQLHSTMT EXDR_InputHandle)
  209. {
  210.   SQLRETURN   EXD_retcode;
  211.   unsigned long  EXD_CustID;
  212.   SQLCHAR     EXD_Name[EXD_NAME_LEN], EXD_Phone[EXD_PHONE_LEN];
  213.   SQLCHAR     EXD_Address[EXD_ADDRESS_LEN];
  214.   //*********************
  215.   //** Bind columns  1 **
  216.   //*********************
  217.   EXD_retcode =SQLBindCol(EXDR_InputHandle, 
  218.   1, 
  219.   SQL_C_ULONG, 
  220.   &EXD_CustID, 
  221.   sizeof(EXD_CustID),
  222.   NULL);
  223.       if (EXD_retcode == SQL_ERROR)
  224.   ndbout << "Executing SQLBindCol, SQL_ERROR happened!" << endl;
  225.   ExecDirect_DisplayError(SQL_HANDLE_STMT, EXDR_InputHandle);
  226.   return NDBT_FAILED;
  227. }
  228.   //*********************
  229.   //** Bind columns  2 **
  230.   //*********************
  231.   EXD_retcode =SQLBindCol(EXDR_InputHandle, 
  232.   2, 
  233.   SQL_C_CHAR, 
  234.   &EXD_Name, 
  235.   EXD_NAME_LEN,
  236.   NULL);
  237.       if (EXD_retcode == SQL_ERROR)
  238.   ndbout << "Executing SQLBindCol, SQL_ERROR happened!" << endl;
  239.   ExecDirect_DisplayError(SQL_HANDLE_STMT, EXDR_InputHandle);
  240.   return NDBT_FAILED;
  241. }
  242.   //*********************
  243.   //** Bind columns 3  **
  244.   //*********************
  245.       EXD_retcode = SQLBindCol(EXDR_InputHandle, 
  246.        3,
  247.        SQL_C_CHAR, 
  248.        &EXD_Address, 
  249.        EXD_ADDRESS_LEN, 
  250.        NULL);
  251.       if (EXD_retcode == SQL_ERROR)
  252.   ndbout << "Executing SQLBindCol, SQL_ERROR happened!" << endl;
  253.   ExecDirect_DisplayError(SQL_HANDLE_STMT, EXDR_InputHandle);
  254.   return NDBT_FAILED;
  255. }
  256.   //*********************
  257.   //** Bind columns 4  **
  258.   //*********************
  259.       EXD_retcode = SQLBindCol(EXDR_InputHandle, 
  260.        4, 
  261.        SQL_C_CHAR, 
  262.        &EXD_Phone, 
  263.        EXD_PHONE_LEN,
  264.        NULL);
  265.       if (EXD_retcode == SQL_ERROR)
  266.   ndbout << "Executing SQLBindCol, SQL_ERROR happened!" << endl;
  267.   ExecDirect_DisplayError(SQL_HANDLE_STMT, EXDR_InputHandle);
  268.   return NDBT_FAILED;
  269. }
  270.   //*****************************************
  271.   //* Fetch and print each row of data. On **
  272.   //* an error, display a message and exit **
  273.   //*****************************************
  274.  
  275.   if (EXD_retcode != SQL_ERROR)
  276.   EXD_retcode = SQLFetch(EXDR_InputHandle);
  277.   ndbout << endl << "EXD_retcode = SQLFetch(EXDR_InputHandle) = " 
  278.  << EXD_retcode << endl;
  279.  if (EXD_retcode == SQL_ERROR)
  280.     { 
  281.       ndbout << "Executing SQLFetch, SQL_ERROR happened!" << endl;
  282.       ExecDirect_DisplayError(SQL_HANDLE_STMT, EXDR_InputHandle);
  283.       return NDBT_FAILED;
  284.     }
  285.   else if (EXD_retcode == SQL_SUCCESS_WITH_INFO) 
  286.     {
  287.     ndbout << "CustID = " << (int)EXD_CustID << endl;
  288.     ndbout << "Name = " << (char *)EXD_Name << endl;
  289.     ndbout << "Address = " << (char *)EXD_Address << endl;
  290.     ndbout << "Phone = " << (char *)EXD_Phone << endl; 
  291.     ExecDirect_DisplayError(SQL_HANDLE_STMT, EXDR_InputHandle);
  292.     }
  293.   else
  294.    {
  295.     ndbout << "CustID = " << (int)EXD_CustID << endl;
  296.     ndbout << "Name = " << (char *)EXD_Name << endl;
  297.     ndbout << "Address = " << (char *)EXD_Address << endl;
  298.     ndbout << "Phone = " << (char *)EXD_Phone << endl;     
  299.    }
  300.  return 0;
  301. }