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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: dbapi_bcp.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 19:22:11  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.6
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: dbapi_bcp.cpp,v 1000.1 2004/06/01 19:22:11 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_bcp.cpp,v 1000.1 2004/06/01 19:22:11 gouriano Exp $
  35. *
  36. * File Description: Implementation of dbapi BCP 
  37. * $Log: dbapi_bcp.cpp,v $
  38. * Revision 1000.1  2004/06/01 19:22:11  gouriano
  39. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.6
  40. *
  41. * Revision 1.6  2004/05/17 21:17:02  gorelenk
  42. * Added include of PCH ncbi_pch.hpp
  43. *
  44. * Revision 1.5  2003/08/05 19:23:52  vakatov
  45. * MSSQL2 --> MS_DEV1
  46. *
  47. * Revision 1.4  2003/01/30 16:08:11  soussov
  48. * Adopt the new default DateTime constructor
  49. *
  50. * Revision 1.3  2002/12/09 16:25:19  starchen
  51. * remove the text files from samples
  52. *
  53. * Revision 1.2  2002/09/04 22:20:39  vakatov
  54. * Get rid of comp.warnings
  55. *
  56. * Revision 1.1  2002/07/18 15:48:21  starchen
  57. * first entry
  58. *
  59. * Revision 1.2  2002/07/18 15:16:44  starchen
  60. * first entry
  61. *
  62. *
  63. *============================================================================
  64. */
  65. #include <ncbi_pch.hpp>
  66. #include "dbapi_bcp.hpp"
  67. #include "dbapi_bcp_util.hpp"
  68. USING_NCBI_SCOPE;
  69. // This program will CREATE a table with 5 rows , make BCP,
  70. // PRINT table on screen (each row will begin with <ROW> and ended by </ROW>)
  71. // and DELETE table from the database.
  72. //The following function illustrates a dbapi Bulk Copy (BCP) 
  73. int main (int argc, char* argv[])
  74. {
  75.     int count=0;
  76.     I_DriverContext* my_context;
  77.     string server_name;
  78.     string driver_name;
  79.     const char* p = NULL;
  80.     CDB_Connection* con;
  81.  CDB_BCPInCmd* bcp;
  82.     // Read args from a command line:
  83.     p= getParam('S', argc, argv);
  84.     if(p) server_name = p;
  85.     p= getParam('d', argc, argv);
  86.     if(p) driver_name = p;
  87.     if ( p == NULL) {
  88.        cout << endl << "usage: for Sybase dblib: -S STRAUSS -d dblib" << endl 
  89.             << "for Sybase ctlib: -S STRAUSS -d ctlib" << endl
  90.             << "for MSSQL: -S MS_DEV1 -d ftds" << endl << endl;
  91.     }
  92.     //    Driver Manager allowes you to change a type of SQL server
  93.     //    without rebuilding your program.
  94.     //    Driver's types:
  95.     //         ctlib - to work with Sybase SQL Server (ct_ library);
  96.     //         dblib - to work with Sybase SQL Server (db library);
  97.     //         ftds  - to work with MS SQL Server.
  98.     C_DriverMgr drv_mgr;
  99.     string err_msg;
  100.     if (driver_name == "dblib") {  
  101.        // create attr for dblib:"version=100"
  102.        // you have to set version if you need to work with BCP dblib Sybase 12.5
  103.         dblib_version.insert (map<string, string>::value_type (string("version"),
  104.                                                                          string("100")));
  105.         my_context = drv_mgr.GetDriverContext (driver_name, &err_msg, &dblib_version);
  106.     } else {
  107.         my_context = drv_mgr.GetDriverContext (driver_name, &err_msg);
  108.     }
  109.     if (!my_context) {
  110.         cout << "Can not load a driver " << driver_name << " [" 
  111.              << err_msg << "] " << endl;
  112.         return 1;
  113.     }
  114.     //  Connect to the server:
  115.     try {
  116.         con = my_context->Connect (server_name, "anyone",
  117.                                               "allowed", I_DriverContext::fBcpIn);
  118.         //  Change default database:
  119.         CDB_LangCmd* set_cmd= con->LangCmd("use DBAPI_Sample");
  120.         set_cmd->Send();
  121.         CDB_Result* r;
  122.         while(set_cmd->HasMoreResults()) {
  123.         r= set_cmd->Result();
  124.         if(r) delete r;
  125.         }
  126.         delete set_cmd;
  127.         // Create table in database for the test
  128.     
  129.         CreateTable(con);
  130.         //Set textsize to work with text and image
  131.         set_cmd= con->LangCmd("set textsize 1000000");
  132.         set_cmd->Send();
  133.         while(set_cmd->HasMoreResults()) {
  134.         r= set_cmd->Result();
  135.         if(r) delete r;
  136.         }
  137.         delete set_cmd;
  138.         //"Bulk copy in" command
  139.        bcp = con->BCPIn("BcpSample", 5);
  140.         CDB_Int int_val;
  141.         CDB_Float fl_val;
  142.         CDB_DateTime date_val(CTime::eCurrent);
  143.         CDB_VarChar str_val;
  144.         CDB_Text pTxt;
  145.      int i;
  146.         pTxt.Append("This is a test string.");
  147.         // Bind data from a program variables  
  148.         bcp->Bind(0, &int_val);
  149.         bcp->Bind(1, &fl_val);
  150.         bcp->Bind(2, &date_val);
  151.         bcp->Bind(3, &str_val);
  152.         bcp->Bind(4, &pTxt);
  153.      for(i= 0; *file_name[i] != ''; i++) {
  154.             int_val = i;
  155.             fl_val = i + 0.999;
  156.             date_val = date_val.Value();
  157.             str_val= file_name[i];
  158.     
  159.             pTxt.MoveTo(0);
  160.             //Send row of data to the server
  161.          bcp->SendRow();
  162.  
  163.             //Save any preceding rows in server
  164.          if (count == 2) {
  165.              bcp->CompleteBatch();
  166.                 count = 0;
  167.          }
  168.             count++;
  169.      }
  170.         //End a bulk copy 
  171.         bcp->CompleteBCP();
  172.         // Print results on screen
  173.         ShowResults(con);
  174.         //Delete table from database
  175.         DeleteTable(con); 
  176.      delete bcp;
  177.      delete con;    
  178.     } catch (CDB_Exception& e) {
  179.    HandleIt(&e);
  180.       DeleteTable(con);
  181.       return 1;
  182.     }
  183.     return 0;
  184. }
  185.