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

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 SQLGetDataTest.cpp
  15.  */
  16. #include <common.hpp>
  17. using namespace std;
  18. #define GD_MESSAGE_LENGTH 200
  19. SQLHSTMT     GD_hstmt;
  20. SQLHENV      GD_henv;
  21. SQLHDBC      GD_hdbc;
  22. SQLHDESC     GD_hdesc;
  23. void GetData_DisplayError(SQLSMALLINT GD_HandleType, SQLHSTMT GD_InputHandle);
  24. /** 
  25.  * Test to retrieve data for a single unbound column
  26.  * in the current row of a result data set
  27.  *
  28.  * Tests:
  29.  * -# Test1 There is no fetched rowset associated with S
  30.  * -# Test2 column number is less than zero
  31.  * -# Test3 fetched rowset is empty
  32.  * @return Zero, if test succeeded
  33.  */
  34. int SQLGetDataTest()
  35. {
  36.   SQLRETURN    retcode;
  37.   SQLCHAR      ColumnName;
  38.   SQLINTEGER   CustID;
  39.   //  SQLCHAR      Name, Address, Phone;
  40.   SQLCHAR SQLStmt [120];
  41.   SQLCHAR SQLStmt1 [120];
  42.   //************************************
  43.   //** Allocate An Environment Handle **
  44.   //************************************
  45.   retcode = SQLAllocHandle(SQL_HANDLE_ENV, 
  46.    SQL_NULL_HANDLE, 
  47.    &GD_henv);
  48.   
  49.   if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
  50.     ndbout << "Allocated an environment Handle!" << endl;
  51.   //*********************************************
  52.   //** Set the ODBC application Version to 3.x **
  53.   //*********************************************
  54.   retcode = SQLSetEnvAttr(GD_henv,
  55.   SQL_ATTR_ODBC_VERSION, 
  56.   (SQLPOINTER) SQL_OV_ODBC3, 
  57.   SQL_IS_UINTEGER);
  58.   
  59.   if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
  60.     ndbout << "Set the ODBC application Version to 3.X!" << endl;
  61.   //**********************************
  62.   //** Allocate A Connection Handle **
  63.   //**********************************
  64.   retcode = SQLAllocHandle(SQL_HANDLE_DBC, 
  65.    GD_henv, 
  66.    &GD_hdbc);
  67.   if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
  68.     ndbout << "Allocated a connection Handle!" << endl;
  69.   // *******************
  70.   // ** Connect to DB **
  71.   // *******************
  72.   retcode = SQLConnect(GD_hdbc, 
  73.        (SQLCHAR *) connectString(), 
  74.        SQL_NTS, 
  75.        (SQLCHAR *) "", 
  76.        SQL_NTS, 
  77.        (SQLCHAR *) "", 
  78.        SQL_NTS);
  79.   
  80.   if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
  81.     ndbout << "Connected to DB : OK!" << endl;
  82.   else 
  83.     {  
  84.       ndbout << "Failure to Connect DB!" << endl;
  85.       return NDBT_FAILED;
  86.     }
  87.   //*******************************
  88.   //** Allocate statement handle **
  89.   //*******************************
  90.   
  91.   retcode = SQLAllocHandle(SQL_HANDLE_STMT, 
  92.    GD_hdbc, 
  93.    &GD_hstmt); 
  94.   if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) 
  95.     ndbout << "Allocated a statement handle!" << endl;
  96.   //*****************************
  97.   //** Define SELECT statement **
  98.   //*****************************
  99.   strcpy((char *) SQLStmt, "SELECT * FROM Customers");
  100.   //***********************************
  101.   //** Prepare SELECT SQL statement  **
  102.   //***********************************
  103.   retcode = SQLPrepare(GD_hstmt, 
  104.        SQLStmt, 
  105.        SQL_NTS);
  106.   ndbout << endl << "Preparing SELECT, retcode = SQLprepare()= " 
  107.  << retcode << endl;
  108.   //*********************************
  109.   //** Execute prepared statement  **
  110.   //*********************************
  111.   //  if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) 
  112.   //{
  113.   retcode = SQLExecute(GD_hstmt);
  114.   ndbout << "Exexuting SELECT, retcode = SQLExecute()= " 
  115.  << retcode << endl;
  116.   //  if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) 
  117.   //    {
  118.       //*****************************************************************
  119.       //** Test1                                                       **
  120.       //** There is no fetched rowset associated with S(SQL-statement) **
  121.       //*****************************************************************
  122.       
  123.       retcode = SQLGetData(GD_hstmt, 
  124.    1, 
  125.    SQL_C_SLONG, 
  126.    &CustID,
  127.    sizeof(CustID), 
  128.    NULL);
  129.       ndbout << "retcode = SQLGetData()= " << retcode << endl;      
  130.       if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
  131. {
  132.   ndbout << endl << "Test 1:" << endl;
  133.   ndbout << "There is no fetched rowset associated with SQL" 
  134.  << " statement. But system reported SUCCESS or" 
  135.  << " SUCCESS_WITH_INFO. Please check the function!" << endl;
  136.   GetData_DisplayError(SQL_HANDLE_STMT, GD_hstmt);
  137. }
  138.       else if (retcode == SQL_ERROR)
  139. {
  140.   ndbout << endl << "Test 1:" << endl;
  141.   ndbout << "There is no fetched rowset associated with SQL" 
  142.  << " statement. The system reported ERROR " 
  143.  << " The function is OK!" << endl;
  144. }      
  145.       else 
  146. ndbout << endl;
  147.       //*******************************
  148.       //** Fetch Data from database  **
  149.       //*******************************
  150.       retcode = SQLFetch(GD_hstmt);
  151.       ndbout << endl 
  152.      << "Fetching after Executing SELECT, retcode = SQLFetch()= " 
  153.      << retcode << endl;  
  154.       if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
  155. {
  156.   
  157.   //**************************************
  158.   //** Test2                            **
  159.   //** column number is less than zero  **
  160.   //**************************************
  161.   
  162.   retcode = SQLGetData(GD_hstmt, 
  163.        0, 
  164.        SQL_C_ULONG, 
  165.        &CustID, 
  166.        sizeof(CustID), 
  167.        NULL);
  168.   
  169.   if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
  170.     {
  171.       ndbout << "Test 2:" <<"Column number is less than zero" 
  172.      << " The system reported SUCCESS or SUCCESS_WITH_INFO." 
  173.      << " Check the function, please!" <<endl;
  174.       GetData_DisplayError(SQL_HANDLE_STMT, GD_hstmt);
  175.     }    
  176.   else if (retcode == SQL_ERROR)
  177.     {
  178.       ndbout << "Test 2:" << "Column number is less than zero." 
  179.      << " The system reported SQL_ERROR." 
  180.      << " The function is OK!" << endl; 
  181.     }
  182.   else
  183.     ndbout << endl;
  184. }
  185.       //    } 
  186.     
  187.       //  } 
  188.   //*****************************
  189.   //** Define DELETE statement **
  190.   //*****************************
  191.       //  strcpy((char *) SQLStmt1, "DELETE FROM Customers");
  192.   strcpy((char *) SQLStmt1, "DELETE FROM Customers WHERE CustID = 568 AND Name = 'Hans  Peter'");
  193.   //***********************************
  194.   //** Prepare DELETE SQL statement  **
  195.   //***********************************
  196.   retcode = SQLPrepare(GD_hstmt, 
  197.        SQLStmt1, 
  198.        SQL_NTS);
  199.   ndbout << endl << "Preparing DELETE, retcode = SQLPrepare()= " 
  200.  << retcode << endl;
  201.   //****************************************
  202.   //** Execute prepared DELETE statement **
  203.   //****************************************
  204.   //  if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) 
  205.   //    {
  206.  
  207.      retcode = SQLExecute(GD_hstmt);
  208.      ndbout << "Executing DELETE, retcode = SQLExecute()= " 
  209.     << retcode << endl;
  210.       
  211.       //      if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) 
  212.       // {
  213.   
  214.   retcode = SQLFetch(GD_hstmt);
  215.   ndbout << "Fetching after Executing DELETE, retcode = SQLExecute()= " 
  216.  << retcode << endl;
  217.   if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) 
  218.     {
  219.       
  220.       //******************************************************
  221.       //** Test3                                            **
  222.       //** If the fetched rowset associated with            **
  223.       //** Statement is empty, condition is raised: NO DATA **
  224.       //** We can delete all rows in table Customers for    **
  225.       //** this case                                        **
  226.       //******************************************************
  227.       
  228.       retcode = SQLGetData(GD_hstmt, 
  229.    1, 
  230.    SQL_C_ULONG, 
  231.    &CustID, 
  232.    sizeof(CustID), 
  233.    NULL);
  234.       
  235.       if (retcode == SQL_ERROR)
  236. {
  237.   ndbout << "Test 3:" << endl;
  238.   ndbout << "The fetched rowset associated" 
  239.  << "with Statementhandle is empty. The system" 
  240.  << " reported SQL_ERROR. Check the function!" << endl;
  241.   GetData_DisplayError(SQL_HANDLE_STMT, GD_hstmt);        
  242. }
  243.       else if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
  244. {
  245.   ndbout << "Test 3:" << endl;
  246.   ndbout << "The fetched rowset associated" 
  247.  << "with Statementhandle is empty. The system" 
  248.  << " reported SUCCESS. Check the function!" << endl;
  249.   GetData_DisplayError(SQL_HANDLE_STMT, GD_hstmt);        
  250. }
  251.       else if (retcode == 100)
  252. {
  253.   ndbout << "Test 3:" << endl;
  254.   ndbout << "The fetched rowset associated" 
  255.  << "with Statementhandle is empty. The system" 
  256.  << " reported SQL_NO_DATA. The function is OK!" << endl;
  257. }
  258.     } 
  259.   else if (retcode == SQL_ERROR)
  260.     { 
  261.       ndbout << "Test 3 falied!" << endl;
  262.       GetData_DisplayError(SQL_HANDLE_STMT, GD_hstmt);
  263.     }
  264.   else 
  265.     ndbout << " " << endl;
  266.   // }      
  267.   //    }
  268.   // *********************************
  269.   // ** Disconnect and Free Handles **
  270.   // *********************************  
  271.   SQLDisconnect(GD_hdbc);
  272.   SQLFreeHandle(SQL_HANDLE_STMT, GD_hstmt);
  273.   SQLFreeHandle(SQL_HANDLE_DBC, GD_hdbc);
  274.   SQLFreeHandle(SQL_HANDLE_ENV, GD_henv);
  275.   
  276.   return NDBT_OK;
  277. }
  278. void GetData_DisplayError(SQLSMALLINT GD_HandleType, SQLHSTMT GD_InputHandle)
  279. {
  280.   
  281.   SQLSMALLINT  i, MsgLen;
  282.   SQLRETURN    SQLSTATEs;
  283.   SQLCHAR      Sqlstate[5], Msg[GD_MESSAGE_LENGTH];
  284.   SQLINTEGER   NativeError;
  285.   i = 1;
  286.   
  287.   ndbout << "-------------------------------------------------" << endl;
  288.   ndbout << "Error diagnostics:" << endl;
  289.   
  290.   while ((SQLSTATEs = SQLGetDiagRec(GD_HandleType, 
  291.     GD_InputHandle, 
  292.     i, 
  293.     Sqlstate, 
  294.     &NativeError, 
  295.     Msg, 
  296.     sizeof(Msg), 
  297.     &MsgLen)) 
  298.  != SQL_NO_DATA)  
  299.     {
  300.       
  301.       ndbout << "the HandleType is:" << GD_HandleType << endl;
  302.       ndbout << "the InputHandle is :" << (long)GD_InputHandle << endl;
  303.       ndbout << "Phone = " << (char *)Msg << endl;
  304.       ndbout << "the output state is:" << (char *)Sqlstate << endl; 
  305.       
  306.       i ++;
  307.       break;
  308.     }
  309.   ndbout << "-------------------------------------------------" << endl;
  310. }