dbapi_query.cpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:9k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: dbapi_query.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 19:22:24  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.5
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: dbapi_query.cpp,v 1000.1 2004/06/01 19:22:24 gouriano Exp $
  10. * ===========================================================================
  11. *
  12. *                            PUBLIC DOMAIN NOTICE
  13. *               National Center for Biotechnology Information
  14. *
  15. *  This software/database is a "United States Government Work" under the
  16. *  terms of the United States Copyright Act.  It was written as part of
  17. *  the author's official duties as a United States Government employee and
  18. *  thus cannot be copyrighted.  This software/database is freely available
  19. *  to the public for use. The National Library of Medicine and the U.S.
  20. *  Government have not placed any restriction on its use or reproduction.
  21. *
  22. *  Although all reasonable efforts have been taken to ensure the accuracy
  23. *  and reliability of the software and data, the NLM and the U.S.
  24. *  Government do not and cannot warrant the performance or results that
  25. *  may be obtained by using this software or data. The NLM and the U.S.
  26. *  Government disclaim all warranties, express or implied, including
  27. *  warranties of performance, merchantability or fitness for any particular
  28. *  purpose.
  29. *
  30. *  Please cite the author in any work or product based on this material.
  31. *
  32. * ===========================================================================
  33. *
  34. * File Name:  $Id: dbapi_query.cpp,v 1000.1 2004/06/01 19:22:24 gouriano Exp $
  35. *
  36. * File Description: Implementation of dbapi language call
  37. * $Log: dbapi_query.cpp,v $
  38. * Revision 1000.1  2004/06/01 19:22:24  gouriano
  39. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.5
  40. *
  41. * Revision 1.5  2004/05/17 21:17:29  gorelenk
  42. * Added include of PCH ncbi_pch.hpp
  43. *
  44. * Revision 1.4  2003/08/05 19:23:58  vakatov
  45. * MSSQL2 --> MS_DEV1
  46. *
  47. * Revision 1.3  2002/12/09 16:25:22  starchen
  48. * remove the text files from samples
  49. *
  50. * Revision 1.2  2002/09/04 22:20:41  vakatov
  51. * Get rid of comp.warnings
  52. *
  53. * Revision 1.1  2002/07/18 15:49:39  starchen
  54. * first entry
  55. *
  56. *
  57. *============================================================================
  58. */
  59. #include <ncbi_pch.hpp>
  60. #include <dbapi/driver/driver_mgr.hpp>
  61. char* getParam(char tag, int argc, char* argv[], bool* flag= 0);
  62. USING_NCBI_SCOPE;
  63. //The following function illustrates a dbapi language call
  64. int main(int argc, char* argv[])
  65. {
  66.     string query;
  67.     I_DriverContext* my_context;
  68.     string server_name;
  69.     string driver_name;
  70.     const char* p = NULL;
  71.     char* txt_buf = NULL ;
  72.     long len_txt = 0;
  73.     
  74.     //    Read args from a command line:
  75.  
  76.     p= getParam('S', argc, argv);
  77.     if(p) server_name = p;
  78.     p= getParam('d', argc, argv);
  79.     if(p) driver_name = p;
  80.     if ( p == NULL) {
  81.        cout << endl << "usage: for Sybase dblib: -S STRAUSS -d dblib" << endl 
  82.             << "for Sybase ctlib: -S STRAUSS -d ctlib" << endl
  83.             << "for MSSQL: -S MS_DEV1 -d ftds" << endl << endl;
  84.     }
  85.     
  86.     //    Driver Manager allowes you to change a type of SQL server
  87.     //    without rebuilding your program.
  88.     //    Driver's types:
  89.     //         ctlib - to work with Sybase SQL Server (ct_ library);
  90.     //         dblib - to work with Sybase SQL Server (db library);
  91.     //         ftds  - to work with MS SQL Server.
  92.     
  93.     try {
  94.         C_DriverMgr drv_mgr;
  95.         string err_msg;
  96.         my_context = drv_mgr.GetDriverContext (driver_name, &err_msg);
  97.         if(!my_context) {
  98.             cout << "Can not load a driver " << driver_name << " [" 
  99.                  << err_msg << "] " << endl;
  100.             return 1;
  101.         }
  102.         //    Connect to the server:
  103.         CDB_Connection* con = my_context->Connect (server_name, "anyone", "allowed", 0);
  104.        
  105.         //    Change default database:
  106.         CDB_LangCmd* lcmd = con->LangCmd("use DBAPI_Sample");
  107.         lcmd->Send();
  108.         while (lcmd->HasMoreResults()) {
  109.             CDB_Result* r = lcmd->Result();
  110.             if (!r) {
  111.                 continue;
  112.             }
  113.             delete r;
  114.         }
  115.         //    Sending a query:
  116.         query = "select int_val,fl_val,date_val,str_val,txt_val from SelectSample";
  117.         lcmd = con->LangCmd(query);
  118.         lcmd->Send();
  119.         //    Fetching  results:
  120.         while (lcmd->HasMoreResults()) {
  121.             CDB_Result* r = lcmd->Result();
  122.             if (!r) continue;
  123.             
  124.             if (r->ResultType() == eDB_RowResult) {
  125.                 while (r->Fetch()) {
  126.                     cout << "<ROW>"<< endl;
  127.                     for (unsigned int j = 0;  j < r->NofItems(); j++) {
  128.                      //    Determination of data type:
  129.                      EDB_Type rt = r->ItemDataType(j);
  130.                      const char* iname= r->ItemName(j);
  131.                      //    Printing to stdout:
  132.                      if(iname == 0) iname= "";
  133.                      cout  << iname << '=';
  134.                      //    Fetching of char or varchar data type:
  135.                      //    note that object type of CDB_Char is for a 1 -byte char and
  136.                      //    object type of CDB_VarChar can't be more then 255 bytes.
  137.                      if (rt == eDB_Char || rt == eDB_VarChar) {
  138.                          CDB_VarChar str_val;
  139.                          r->GetItem(&str_val);
  140.                          cout << (str_val.IsNULL()? "{NULL}" : str_val.Value()) << endl << endl ;
  141.                      //    Fetching of integer data type:
  142.                      //    note that object type of CDB_Int is for a 4- bytes int
  143.                      //    object type of CDB_SmallInt is for the 2- bytes int
  144.                      //    object type of CDB_TinyInt is for the 1- byte int.
  145.                      } else if (rt == eDB_Int ||
  146.                                 rt == eDB_SmallInt ||
  147.                                 rt == eDB_TinyInt) {
  148.                          CDB_Int int_val;
  149.                          r->GetItem(&int_val);
  150.                          if (int_val.IsNULL()) {
  151.                              cout << "{NULL}";
  152.                          } else {
  153.                              cout << int_val.Value() << endl << endl ;
  154.                          }
  155.                       //    Fetching of real data type:  
  156.                       //    note that  
  157.                       //    object type of CDB_Float is for the 4-bytes float data type
  158.                       } else if (rt == eDB_Float) {
  159.                             CDB_Float fl_val;
  160.                             r->GetItem(&fl_val);
  161.                             if(fl_val.IsNULL()) {
  162.                                 cout << "{NULL}";
  163.                             } else {
  164.                                 cout << fl_val.Value() << endl<< endl ;
  165.                             }
  166.                       //    Fetching of float data type:  
  167.                       //    note that  
  168.                       //    object type of CDB_Double is for a 8-byte float data type.
  169.                       } else if (rt == eDB_Double) {
  170.                             CDB_Double fl_val;
  171.                             r->GetItem(&fl_val);
  172.                             if(fl_val.IsNULL()) {
  173.                                 cout << "{NULL}";
  174.                             } else {
  175.                                 cout << fl_val.Value() << endl<< endl ;
  176.                             }
  177.                       //    Fetching of datetime data type:
  178.                       //    note that object of type CDB_DateTime is for a datetime4 (8 bytes) data type
  179.                       //    object type of CDB_SmallDateTime is for a datetime (4 bytes) data type.
  180.                       } else if (rt == eDB_DateTime ||
  181.                                  rt == eDB_SmallDateTime) {
  182.                             CDB_DateTime date_val;
  183.                             r->GetItem(&date_val);
  184.                             if(date_val.IsNULL()) {
  185.                                 cout << "{NULL}";
  186.                             } else {
  187.                                 cout << date_val.Value().AsString() << endl<< endl ;
  188.                             }
  189.  
  190.                        //    Fetching of text data type:
  191.                        //    if you need to fetch an image 
  192.                        //    you have to use CDB_Image type of object
  193.                        } else if (rt == eDB_Text){
  194.                             CDB_Text text_val;
  195.                             r->GetItem(&text_val);
  196.                             if(text_val.IsNULL()) {
  197.                                 cout << "{NULL}";
  198.                             } else {
  199.                                 txt_buf = ( char*) malloc (text_val.Size());
  200.                                 len_txt = text_val.Read (( char*)txt_buf, text_val.Size());
  201.                                 cout << txt_buf << endl<< endl ;
  202.                             }
  203.                         } else {
  204.                             r->SkipItem();
  205.                             cout << "{unprintable}";
  206.                         }
  207.                     }
  208.                     cout << "</ROW>" << endl << endl;
  209.                 }
  210.                 delete r;
  211.             }
  212.         }
  213.         delete lcmd;
  214.         delete con;
  215.     } catch (CDB_Exception& e) {
  216.         CDB_UserHandler_Stream myExHandler(&cerr);        
  217.         myExHandler.HandleIt(&e);
  218.         return 1;
  219.     }
  220.     return 0;
  221. }