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

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 SQLDescribeColTest.cpp
  15.  */
  16. #include <common.hpp>
  17. using namespace std;
  18. #define DC_Column_NAME_LEN 50
  19. #define DC_MESSAGE_LENGTH 200
  20. SQLHSTMT    DC_hstmt;
  21. SQLHDBC     DC_hdbc;
  22. SQLHENV     DC_henv;
  23. SQLHDESC    DC_hdesc;
  24. void DescribeCol_DisplayError(SQLSMALLINT DC_HandleType, 
  25.       SQLHSTMT DC_InputHandle);
  26. /** 
  27.  * Test to retrieve  basic result data set metadata information
  28.  * (specifically, column name, SQL data type, column size, decimal
  29.  * precision, and nullability) for a specified column in a result
  30.  * data set
  31.  * -# No prepared or executed statement when executing
  32.  * -# ColumnNumber is less than 1
  33.  * -#  ColumnNumber is greater than the value of the TOP_LEVEL_COUNT field of IRD
  34.  * @return Zero, if test succeeded
  35.  */
  36. int SQLDescribeColTest()
  37. {
  38.   SQLCHAR     SQLStmt [120];
  39.   SQLRETURN   retcode;
  40.   SQLCHAR     ColumnName[DC_Column_NAME_LEN];
  41.   SQLSMALLINT NameLength, DataTypePtr, DecimalDigitsPtr, NullablePtr;
  42.   SQLUINTEGER ColumnSizePtr;
  43.   ndbout << "Start SQLDescribeCol Test " << endl;
  44.   //******************************************************************
  45.   //** Test1                                                        **
  46.   //** There is no prepared or executed statement associated with   **
  47.   //** StatementHandle                                              **
  48.   //******************************************************************
  49.   retcode = SQLDescribeCol(DC_hstmt, 
  50.    (SQLUSMALLINT)1, 
  51.    ColumnName, 
  52.    sizeof(ColumnName), 
  53.    &NameLength, 
  54.    &DataTypePtr, 
  55.    &ColumnSizePtr, 
  56.    &DecimalDigitsPtr, 
  57.    &NullablePtr);
  58.   if (retcode == SQL_ERROR || retcode == SQL_SUCCESS_WITH_INFO)
  59.     DescribeCol_DisplayError(SQL_HANDLE_STMT, DC_hstmt);
  60.   //************************************
  61.   //** Allocate An Environment Handle **
  62.   //************************************
  63.   retcode = SQLAllocHandle(SQL_HANDLE_ENV, 
  64.    SQL_NULL_HANDLE, 
  65.    &DC_henv);
  66.   
  67.   if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
  68.     ndbout << "Allocated an environment Handle!" << endl;
  69.   
  70.   //*********************************************
  71.   //** Set the ODBC application Version to 3.x **
  72.   //*********************************************
  73.   retcode = SQLSetEnvAttr(DC_henv, 
  74.   SQL_ATTR_ODBC_VERSION, 
  75.   (SQLPOINTER) SQL_OV_ODBC3, 
  76.   SQL_IS_UINTEGER);
  77.   
  78.   if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
  79.     ndbout << "Set the ODBC application Version to 3.x!" << endl;
  80.   //**********************************
  81.   //** Allocate A Connection Handle **
  82.   //**********************************
  83.   retcode = SQLAllocHandle(SQL_HANDLE_DBC, 
  84.    DC_henv, 
  85.    &DC_hdbc);
  86.   if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
  87.     ndbout << "Allocated a connection Handle!" << endl;
  88.   
  89.   // *******************
  90.   // ** Connect to DB **
  91.   // *******************
  92.   retcode = SQLConnect(DC_hdbc, 
  93.        (SQLCHAR *) connectString(), 
  94.        SQL_NTS, 
  95.        (SQLCHAR *) "", 
  96.        SQL_NTS, 
  97.        (SQLCHAR *) "", 
  98.        SQL_NTS);
  99.   
  100.   if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
  101.     ndbout << "Connected to DB : OK!" << endl;
  102.   else 
  103.     {  
  104.       ndbout << "Failure to Connect DB!" << endl;
  105.       return NDBT_FAILED;
  106.     }
  107.   //*******************************
  108.   //** Allocate statement handle **
  109.   //*******************************
  110.   
  111.   retcode = SQLAllocHandle(SQL_HANDLE_STMT, 
  112.    DC_hdbc, 
  113.    &DC_hstmt); 
  114.   if(retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) 
  115.     ndbout << "Allocated a statement handle!" << endl;
  116.   
  117.   //************************
  118.   //** Define a statement **
  119.   //************************
  120.   strcpy((char *) SQLStmt, 
  121.  "SELECT * FROM Customers");
  122.   //***********************************************
  123.   //** Prepare and Execute the SQL statement     **
  124.   //***********************************************
  125.   retcode = SQLExecDirect(DC_hstmt, 
  126.   SQLStmt, 
  127.   SQL_NTS);
  128. if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
  129.   //*********************************
  130.   //** ColumnNumber is from 1 to 4 **
  131.   //*********************************
  132.   ndbout << endl << "ColumnNumber is from 1 to 4" << endl;
  133.   
  134.   for (int ii = 1; ii <= 4; ii++)
  135.  {  
  136.   retcode = SQLDescribeCol(DC_hstmt, 
  137.    ii, 
  138.    ColumnName, 
  139.    sizeof(ColumnName), 
  140.    &NameLength, 
  141.    &DataTypePtr, 
  142.    &ColumnSizePtr, 
  143.    &DecimalDigitsPtr, 
  144.    &NullablePtr);
  145.   if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
  146.     ndbout << "Column Name = " << (char *)ColumnName << endl;
  147.  }
  148.   //*********************************
  149.   //** Test2                       **
  150.   //** ColumnNumber is less than 1 **
  151.   //*********************************
  152.  
  153.   retcode = SQLDescribeCol(DC_hstmt, 
  154.    (SQLUSMALLINT)-1, 
  155.    ColumnName, 
  156.    sizeof(ColumnName), 
  157.    &NameLength, 
  158.    &DataTypePtr, 
  159.    &ColumnSizePtr, 
  160.    &DecimalDigitsPtr, 
  161.    &NullablePtr);
  162.   if (retcode == SQL_ERROR || retcode == SQL_SUCCESS_WITH_INFO)
  163.     ndbout << endl << "ColumnNumber is less than 1" << endl;
  164.     DescribeCol_DisplayError(SQL_HANDLE_STMT, DC_hstmt);
  165.   //*********************************************************************
  166.   //** Test3                                                           **
  167.   //** ColumnNumber is greater than N(the value of the TOP_LEVEL_COUNT ** 
  168.   //** field of IRD)                                                   **
  169.   //*********************************************************************
  170.   
  171.     ndbout << endl <<"ColumnNumber is greater than N(the value" 
  172.    << "of the TOP_LEVEL_COUNTfield of IRD)" << endl;
  173.     retcode = SQLDescribeCol(DC_hstmt, 
  174.      (SQLUSMALLINT)1045, 
  175.      ColumnName, 
  176.      sizeof(ColumnName), 
  177.      &NameLength, 
  178.      &DataTypePtr, 
  179.      &ColumnSizePtr, 
  180.      &DecimalDigitsPtr, 
  181.      &NullablePtr);
  182.     if (retcode == SQL_ERROR || retcode == SQL_SUCCESS_WITH_INFO)
  183.       DescribeCol_DisplayError(SQL_HANDLE_STMT, DC_hstmt);
  184.     
  185. }
  186.   // *********************************
  187.   // ** Disconnect and Free Handles **
  188.   // *********************************  
  189.   SQLDisconnect(DC_hdbc);
  190.   SQLFreeHandle(SQL_HANDLE_STMT, DC_hstmt);
  191.   SQLFreeHandle(SQL_HANDLE_DBC, DC_hdbc);
  192.   SQLFreeHandle(SQL_HANDLE_ENV, DC_henv);
  193.  return NDBT_OK;
  194. }
  195. void DescribeCol_DisplayError(SQLSMALLINT DC_HandleType, 
  196.       SQLHSTMT DC_InputHandle)
  197. {
  198.   SQLCHAR    Sqlstate[5], Msg[DC_MESSAGE_LENGTH];
  199.   SQLINTEGER NativeError;
  200.   SQLSMALLINT DC_i, MsgLen;
  201.   SQLRETURN  SQLSTATEs;
  202.   DC_i = 1;
  203.   while ((SQLSTATEs = SQLGetDiagRec(DC_HandleType, 
  204.     DC_InputHandle, 
  205.     DC_i, 
  206.     Sqlstate, 
  207.     &NativeError, 
  208.     Msg, 
  209.     sizeof(Msg), 
  210.     &MsgLen)) 
  211.  != SQL_NO_DATA)                   {
  212.     ndbout << "the HandleType is:" << DC_HandleType << endl;
  213.     ndbout << "the InputHandle is :" << (long)DC_InputHandle << endl;
  214.     ndbout << "the return message is:" << (char *)Msg << endl;
  215.     ndbout << "the output state is:" << (char *)Sqlstate << endl; 
  216.     
  217.     DC_i ++;
  218.     break;
  219.   }
  220. }