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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: dbapi_cursor.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 19:22:19  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.4
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: dbapi_cursor.cpp,v 1000.1 2004/06/01 19:22:19 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. #include <ncbi_pch.hpp>
  35. #include "dbapi_cursor.hpp"
  36. #include <map> 
  37. map<string, string> dblib_version;
  38. USING_NCBI_SCOPE;
  39. // This program will CREATE a table with 5 rows , UPDATE text field,
  40. // PRINT table on screen (each row will begin with <ROW> and ended by </ROW>)
  41. // and DELETE table from the database.
  42. //The following function illustrates a usage of dbapi cursor
  43. int main(int argc, char* argv[])
  44. {
  45.    
  46.     I_DriverContext* my_context;
  47.     string server_name;
  48.     string driver_name;
  49.     const char* p = NULL;
  50.     CDB_Connection* con;
  51.     C_DriverMgr drv_mgr;
  52.     string err_msg;
  53.   // Read args from a command line:
  54.     p= getParam('S', argc, argv);
  55.     if(p) server_name = p;
  56.     p= getParam('d', argc, argv);
  57.     if(p) driver_name = p;
  58.     if ( p == NULL) {
  59.        cout << endl << "usage: for Sybase dblib: -S STRAUSS -d dblib" << endl 
  60.             << "for Sybase ctlib: -S STRAUSS -d ctlib" << endl
  61.             << "for MSSQL: -S MS_DEV1 -d ftds" << endl << endl;
  62.     }
  63.     //    Driver Manager allowes you to change a type of SQL server
  64.     //    without rebuilding your program.
  65.     //    Driver's types:
  66.     //         ctlib - to work with Sybase SQL Server (ct_ library);
  67.     //         dblib - to work with Sybase SQL Server (db library);
  68.     //         ftds  - to work with MS SQL Server.
  69.     if (driver_name == "dblib") {    
  70.       
  71.        // create attr for dblib:"version=100"
  72.        // you have to set version if you need to work with BCP dblib Sybase 12.5
  73.        // in this program BCP used to populate a table
  74.        dblib_version.insert (map<string, string>::value_type (string("version"), 
  75.                                                                      string("100")));
  76.        my_context = drv_mgr.GetDriverContext (driver_name, &err_msg, &dblib_version);
  77.     } else {
  78.        my_context = drv_mgr.GetDriverContext (driver_name, &err_msg);
  79.     }
  80.     // Change a default size of text(image)
  81.     my_context->SetMaxTextImageSize(1000000);
  82.     if (!my_context) {
  83.             cout << "Can not load a driver " << driver_name << " [" 
  84.                  << err_msg << "] " << endl;
  85.             return 1;
  86.     }
  87.     try {
  88.         // Connect to the server:
  89.         con = my_context->Connect (server_name, "anyone", "allowed",
  90.                                                 I_DriverContext::fBcpIn);
  91.         // Change default database:
  92.         CDB_LangCmd* set_cmd = con->LangCmd("use DBAPI_Sample");
  93.         set_cmd->Send();
  94.         CDB_Result* r;
  95.         while(set_cmd->HasMoreResults()) {
  96.         r= set_cmd->Result();
  97.         if(r) delete r;
  98.         }
  99.         delete set_cmd;
  100.         // Create table in database for the test
  101.         CreateTable(con);
  102.         CDB_Text txt;
  103.         txt.Append ("This text will replace a text in the table.");
  104.        // Example : update text field in the table CursorSample where int_val = 2,
  105.        // by using cursor
  106.        CDB_CursorCmd* upd = con->Cursor("upd", 
  107.                         "select int_val, text_val from CursorSample for update of text_val", 0);
  108.        //Open cursor
  109.        CDB_Result* crres= upd->Open();
  110.        //fetch row
  111.        while (crres->Fetch()) {
  112.            CDB_Int v;
  113.            crres->GetItem(&v);
  114.            if (v.Value() == 2) {
  115.                txt.MoveTo(0); // rewind
  116.                //update text field
  117.                upd->UpdateTextImage (1, txt);
  118.            }
  119.        }
  120.        //print resutls on the screen
  121.        ShowResults(con);
  122.        //close cursor
  123.        upd->Close();
  124.        delete crres;    
  125.        delete upd; 
  126.        //Delete table from database
  127.        DeleteTable(con);
  128.     delete con;
  129.     
  130.     } catch (CDB_Exception& e) {
  131.      HandleIt(&e);
  132.         DeleteTable(con);
  133.         return 1;
  134.     }
  135.     return 0;
  136. }