ocidefinearrayofstruct

www.pudn.com > TestMutiRead.rar > h_oracle.cpp, change:2007-09-01,size:24917b

     
 
  1. //---------------------------------------------------------------------------   
  2. #include "vcl_stl.h"   
  3. #pragma hdrstop   
  4. /*#include "h_base.h"  
  5. #include "h_xml.h"  
  6. #include "h_tea.h"  
  7. #include "h_global.h"  
  8. using namespace h_base;  
  9. using namespace h_xml;  
  10. using namespace h_tea;*/   
  11.    
  12. #include "h_oracle.h"   
  13. //#include "CppSQLite3.h"   
  14. //---------------------------------------------------------------------------   
  15. set<AnsiString> HOracle::BlackList;   
  16.    
  17. //Add by Liaoyangbo   
  18. //增加大对象类型列表   
  19. set<AnsiString> HOracle::BlobList;   
  20. //End by Liaoyangbo   
  21.    
  22. //Add by Liaoyangbo   
  23. void __fastcall HOracle::prepareBlob(void)   
  24. {   
  25.     static char *BlobMeta[] =   
  26.     {   
  27.         "BLOB",   
  28.         "CLOB",   
  29.         "NCLOB",   
  30.         "BFILE",   
  31.         NULL   
  32.     };   
  33.    
  34.     for (int i = 0; BlobMeta[i] != NULL; i++)   
  35.     {   
  36.         BlobList.insert(BlobMeta[i]);   
  37.     }   
  38. }   
  39. //End by Liaoyangbo   
  40.    
  41. void __fastcall HOracle::Prepare(void)   
  42. {   
  43.    static char *SpecialSchemas[] =   
  44.    {   
  45.       "ANONYMOUS",   
  46.       "CTXSYS",   
  47.       "DBSNMP",   
  48.       "DMSYS",   
  49.       "OCITEST",   
  50.       "ODM",   
  51.       "ODM_MTR",   
  52.       "OE",   
  53.       "OLAPSYS",   
  54.       "ORDPLUGINS",   
  55.       "ORDSYS",   
  56.       "OUTLN",   
  57.       "PM",   
  58.       "QS",   
  59.       "QS_ADM" ,   
  60.       "QS_CB",   
  61.       "QS_CBADM",   
  62.       "QS_CS",   
  63.       "QS_ES",   
  64.       "QS_OS",   
  65.       "QS_WS",   
  66.       "RMAN",   
  67.       "SYS",   
  68.       "SYSTEM",   
  69.       "SYSMAN",   
  70.       "WKPROXY",   
  71.       "WK_TEST",   
  72.       "WKSYS",   
  73.       "WMSYS",   
  74.       "XDB",   
  75.       NULL   
  76.    };   
  77.    forint i = 0; SpecialSchemas[i] != NULL; i++ )   
  78.       BlackList.insert(SpecialSchemas[i]);   
  79. }   
  80.    
  81. bool __fastcall HOracle::SchemaInBlackList(const AnsiString &Schema)   
  82. {   
  83.    return BlackList.find(Schema) != BlackList.end();   
  84. }   
  85.    
  86. bool __fastcall HOracle::Init(void)   
  87. {   
  88.    Prepare();   
  89.      
  90.    sword r;   
  91.    //r = OCIEnvCreate(&FEnvhp, OCI_DEFAULT, NULL, NULL, NULL, NULL, 0, NULL);   
  92.    
  93.    r = OCIEnvCreate(&FEnvhp, OCI_THREADED, NULL, NULL, NULL, NULL, 0, NULL);   
  94.    if( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )   
  95.       return false;   
  96.    
  97.    FInitOk = true;   
  98.    return true;   
  99. }   
  100.    
  101. __fastcall HOracle::HOracle(void)   
  102. {   
  103.    FErrhp = (OCIError *)OCI_INVALID_HANDLE;   
  104.    FSrvhp = (OCIServer *)OCI_INVALID_HANDLE;   
  105.    FSvchp = (OCISvcCtx *)OCI_INVALID_HANDLE;   
  106.    FSsnhp = (OCISession *)OCI_INVALID_HANDLE;   
  107.    
  108.    FConnected = false;   
  109.    Init();   
  110. }   
  111.    
  112. __fastcall HOracle::~HOracle(void)   
  113. {   
  114.    Disconnect();   
  115.    FreeHandles();   
  116. }   
  117.    
  118. bool __fastcall HOracle::AllocateHandles(void)   
  119. {   
  120.    sword r;   
  121.    
  122.    dvoid *tmp;   
  123.       
  124.    //r = OCIHandleAlloc(FEnvhp, (dvoid**)&FErrhp, OCI_HTYPE_ERROR, 0, NULL);   
  125.    r = OCIHandleAlloc(FEnvhp, (dvoid**)&FErrhp, OCI_HTYPE_ERROR, 52, (dvoid **)&tmp);   
  126.    if( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )   
  127.    {   
  128.     //ShowMessage("new gpm. Return:" + IntToStr(r));   
  129.       CreateErrorString("OCIHandleAlloc(Env) : "false);   
  130.       //if( MessageDlg("error, return" + IntToStr(r) + ", Continue?",   
  131.       //       mtConfirmation, TMsgDlgButtons() << mbYes << mbNo, 0) != mrYes )   
  132.       goto error;   
  133.    
  134.    }   
  135.       
  136.    //r = OCIHandleAlloc(FEnvhp, (dvoid**)&FSrvhp, OCI_HTYPE_SERVER, 0, NULL);   
  137.    r = OCIHandleAlloc(FEnvhp, (dvoid**)&FSrvhp, OCI_HTYPE_SERVER, 52, (dvoid **)&tmp);   
  138.    if( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )   
  139.    {   
  140.       CreateErrorString("OCIHandleAlloc(Server) : ");   
  141.       goto error;   
  142.    }   
  143.    
  144.    
  145.    //r = OCIHandleAlloc(FEnvhp, (dvoid**)&FSvchp, OCI_HTYPE_SVCCTX, 0, NULL);   
  146.    r = OCIHandleAlloc(FEnvhp, (dvoid**)&FSvchp, OCI_HTYPE_SVCCTX, 52, (dvoid **)&tmp);   
  147.    if( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )   
  148.    {   
  149.       CreateErrorString("OCIHandleAlloc(Svcctx) : ");   
  150.       goto error;   
  151.    }   
  152.    
  153.    //r = OCIHandleAlloc(FEnvhp, (dvoid**)&FSsnhp, OCI_HTYPE_SESSION, 0, NULL);   
  154.    r = OCIHandleAlloc(FEnvhp, (dvoid**)&FSsnhp, OCI_HTYPE_SESSION, 0, (dvoid**)0);   
  155.    if( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )   
  156.    {   
  157.       CreateErrorString("OCIHandleAlloc(Session) : ");   
  158.       goto error;   
  159.    }   
  160.    
  161.    //OCI_HTYPE_TRANS   
  162.    /*  
  163.    r = OCIHandleAlloc((dvoid *)FEnvhp, (dvoid **)&FTxnhp, OCI_HTYPE_TRANS, 0, 0);  
  164.    if( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )  
  165.    {  
  166.         CreateErrorString("OCIHandleAlloc(OCITrans) : ");  
  167.         goto error;  
  168.    }  
  169.    */   
  170.    
  171.    
  172.    return true;   
  173.    
  174. error :   
  175.    
  176.    FreeHandles();   
  177.    return false;   
  178. }   
  179.    
  180. void __fastcall HOracle::FreeHandles(void)   
  181. {   
  182.    if( FErrhp != (OCIError *)OCI_INVALID_HANDLE )   
  183.       OCIHandleFree(FErrhp, OCI_HTYPE_ERROR);   
  184.    
  185.    if( FSrvhp != (OCIServer *)OCI_INVALID_HANDLE )   
  186.       OCIHandleFree(FSrvhp, OCI_HTYPE_SERVER);   
  187.    
  188.    if( FSvchp != (OCISvcCtx *)OCI_INVALID_HANDLE )   
  189.       OCIHandleFree(FSvchp, OCI_HTYPE_SVCCTX);   
  190.    
  191.    if( FSsnhp != (OCISession *)OCI_INVALID_HANDLE )   
  192.       OCIHandleFree(FSvchp, OCI_HTYPE_SESSION);    
  193.    
  194.    // free OCI_HTYPE_TRANS   
  195.    /*  
  196.    if( FTxnhp  != (OCITrans *)OCI_INVALID_HANDLE )  
  197.         OCIHandleFree(FTxnhp, OCI_HTYPE_TRANS);  
  198.    */   
  199.    
  200.    if( FEnvhp != (OCIEnv *)OCI_INVALID_HANDLE )   
  201.       OCIHandleFree(FEnvhp, OCI_HTYPE_ENV);   
  202.    
  203.    
  204.    FErrhp = (OCIError *)OCI_INVALID_HANDLE;   
  205.    FSrvhp = (OCIServer *)OCI_INVALID_HANDLE;   
  206.    FSvchp = (OCISvcCtx *)OCI_INVALID_HANDLE;   
  207.    FSsnhp = (OCISession *)OCI_INVALID_HANDLE;   
  208.    
  209.    //OCITrans   
  210.    //FTxnhp = (OCITrans *)OCI_INVALID_HANDLE;   
  211.    
  212.    FEnvhp = (OCIEnv *)OCI_INVALID_HANDLE;   
  213. }   
  214.    
  215. int __fastcall HOracle::CreateErrorString(const AnsiString &Text, bool Env)   
  216. {   
  217.    text errbuf[512];   
  218.    sb4 errcode;   
  219.    
  220.    errbuf[0] = '\0';   
  221.    
  222.    if( Env )   
  223.       OCIErrorGet(FEnvhp, 1, NULL, &errcode, errbuf,   
  224.          sizeof(errbuf), OCI_HTYPE_ENV);   
  225.    else   
  226.       OCIErrorGet(FErrhp, 1, NULL, &errcode, errbuf,   
  227.          sizeof(errbuf), OCI_HTYPE_ERROR);   
  228.    
  229.    FErrorString = Text + ":" + IntToStr(errcode) + ": " + AnsiString((char*)errbuf, sizeof(errbuf)).TrimRight();   
  230.     if (Env)   
  231.    {   
  232.     if (FEnvhp == NULL)   
  233.       {   
  234.         FErrorString += ". And Env is NULL!!";   
  235.         // ShowMessage(FErrorString);   
  236.       }   
  237.    
  238.    }   
  239.    return errcode;   
  240. }   
  241.    
  242. bool __fastcall HOracle::Connect(const AnsiString &DatabaseName,   
  243.    const AnsiString &UserId, const AnsiString &Password,   
  244.    bool Sysdba)   
  245. {   
  246.    sword r;   
  247.    
  248.    if( !AllocateHandles() )   
  249.       return false;   
  250.    
  251.    
  252.    
  253.    r = OCIServerAttach(FSrvhp, FErrhp, DatabaseName.c_str(),   
  254.       DatabaseName.Length(), OCI_DEFAULT);   
  255.    
  256.    if( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )   
  257.    {   
  258.       CreateErrorString("OCIServerAttach : ");   
  259.       FreeHandles();   
  260.       return false;   
  261.    }   
  262.    
  263.    r = OCIAttrSet(FSvchp, OCI_HTYPE_SVCCTX, FSrvhp,   
  264.       0, OCI_ATTR_SERVER, FErrhp);   
  265.    
  266.    if( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )   
  267.    {   
  268.       CreateErrorString("OCIAttrSet(SERVER) : ");   
  269.       OCIServerDetach(FSrvhp, FErrhp, OCI_DEFAULT);   
  270.       FreeHandles();   
  271.       return false;   
  272.    }   
  273.    
  274.    /* set the external name and internal name in server handle */   
  275.    r = OCIAttrSet((dvoid *)FSrvhp, OCI_HTYPE_SERVER, (dvoid *) "demo", 0,   
  276.        OCI_ATTR_EXTERNAL_NAME, FErrhp);   
  277.    if( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )   
  278.    {   
  279.       CreateErrorString("OCIAttrSet(SERVER) : ");   
  280.       OCIServerDetach(FSrvhp, FErrhp, OCI_DEFAULT);   
  281.       FreeHandles();   
  282.       return false;   
  283.    }   
  284.    
  285.    r = OCIAttrSet((dvoid *)FSrvhp, OCI_HTYPE_SERVER, (dvoid *) "txn demo", 0,   
  286.        OCI_ATTR_INTERNAL_NAME, FErrhp);   
  287.    if( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )   
  288.    {   
  289.       CreateErrorString("OCIAttrSet(SERVER) : ");   
  290.       OCIServerDetach(FSrvhp, FErrhp, OCI_DEFAULT);   
  291.       FreeHandles();   
  292.       return false;   
  293.    }   
  294.    
  295.    r = OCIAttrSet(FSsnhp, OCI_HTYPE_SESSION,   
  296.       UserId.c_str(), UserId.Length(), OCI_ATTR_USERNAME, FErrhp);   
  297.    
  298.    if( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )   
  299.    {   
  300.       CreateErrorString("OCIAttrSet(USERNAME) : ");   
  301.       OCIServerDetach(FSrvhp, FErrhp, OCI_DEFAULT);   
  302.       FreeHandles();   
  303.       return false;   
  304.    }   
  305.    
  306.    r = OCIAttrSet(FSsnhp, OCI_HTYPE_SESSION,   
  307.       Password.c_str(), Password.Length(), OCI_ATTR_PASSWORD, FErrhp);   
  308.    
  309.    if( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )   
  310.    {   
  311.       CreateErrorString("OCIAttrSet(USERNAME) : ");   
  312.       OCIServerDetach(FSrvhp, FErrhp, OCI_DEFAULT);   
  313.       FreeHandles();   
  314.       return false;   
  315.    }   
  316.    
  317.    r = OCISessionBegin(FSvchp, FErrhp, FSsnhp, OCI_CRED_RDBMS,   
  318.       Sysdba ? OCI_SYSDBA : OCI_DEFAULT);   
  319.    
  320.    if( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )   
  321.    {   
  322.       CreateErrorString("OCISessionBegin : ");   
  323.       OCIServerDetach(FSrvhp, FErrhp, OCI_DEFAULT);   
  324.       FreeHandles();   
  325.       return false;   
  326.    }   
  327.    
  328.    r = OCIAttrSet(FSvchp, OCI_HTYPE_SVCCTX,   
  329.       FSsnhp, 0, OCI_ATTR_SESSION, FErrhp);   
  330.    
  331.    if( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )   
  332.    {   
  333.       CreateErrorString("OCIAttrSet(SESSION) : ");   
  334.       OCISessionEnd(FSvchp, FErrhp, FSsnhp, OCI_DEFAULT);   
  335.       OCIServerDetach(FSrvhp, FErrhp, OCI_DEFAULT);   
  336.       FreeHandles();   
  337.       return false;   
  338.    }   
  339.    
  340.    //OCI_ATTR_TRANS   
  341.    /*  
  342.    r = OCIAttrSet(FSvchp, OCI_HTYPE_SVCCTX, FTxnhp, 0, OCI_ATTR_TRANS, FErrhp);  
  343.    if( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )  
  344.    {  
  345.       CreateErrorString("OCIAttrSet(TRANS) : ");  
  346.       OCISessionEnd(FSvchp, FErrhp, FSsnhp, OCI_DEFAULT);  
  347.       OCIServerDetach(FSrvhp, FErrhp, OCI_DEFAULT);  
  348.       FreeHandles();  
  349.       return false;  
  350.    }  
  351.    */   
  352.    
  353.    
  354.   /*  
  355.    for( int i = 0; i <Dbs.size(); i++ )  
  356.    {  
  357.       if( Dbs[i].DSN == DatabaseName  && Dbs[i].DbStatus != dbsNull)  
  358.       {  
  359.          DbIndex = i;  
  360.          break;  
  361.       }  
  362.    }  
  363.    */   
  364.    
  365.    FConnected = true;   
  366.    return true;   
  367. }   
  368.    
  369. void __fastcall HOracle::Disconnect(void)   
  370. {   
  371.    if( !FConnected )   
  372.       return;   
  373.    
  374.    OCISessionEnd(FSvchp, FErrhp, FSsnhp, OCI_DEFAULT);   
  375.    OCIServerDetach(FSrvhp, FErrhp, OCI_DEFAULT);   
  376.    FConnected = false;   
  377. }   
  378.    
  379. bool __fastcall HOracle::GetTableInfoList(vector <TableDes> &TableList, AnsiString DBName)   
  380. {          
  381.    int i=1;   
  382.    sword r;   
  383.    OCIStmt *Stmthp1 = (OCIStmt*)OCI_INVALID_HANDLE;   
  384.    char Owner[30 + 1];   
  385.    char TableName[30 + 1];   
  386.    char TableSpace[30 + 1];   
  387.    char RowNumber[10 + 1];   
  388.    //char TableType[12 + 1];   
  389.    OCIDefine *Defnp;   
  390.    //char* TableInfoName = (AnsiString(DBName + "_TableInfo")).c_str();   
  391.    //char* ColumnInfoName = AnsiString(DBName + "_ColumnInfo").c_str();   
  392.    AnsiString SqlStr1 = AnsiString("select owner, table_name,  NVL(tablespace_name,chr(0)),")   
  393.    +  " NVL(num_rows,0)  from dba_all_tables "  +   
  394.    " where owner NOT IN ('SYS', 'SYSTEM') order by owner, table_name";   
  395.    
  396.    TableList.clear();   
  397.    r = OCIHandleAlloc(FEnvhp, (dvoid**)&Stmthp1, OCI_HTYPE_STMT, 0, NULL);   
  398.    
  399.    if( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )   
  400.    {   
  401.       CreateErrorString("OCIHandleAlloc(Stmt1) : ");   
  402.       goto error;   
  403.    }   
  404.    
  405.    r = OCIStmtPrepare(Stmthp1, FErrhp, SqlStr1.c_str(),   
  406.       SqlStr1.Length(), OCI_NTV_SYNTAX, OCI_DEFAULT);   
  407.    
  408.    if( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )   
  409.    {   
  410.       CreateErrorString("OCIStmtPrepare(SqlStr1) : ");   
  411.       goto error;   
  412.    }   
  413.    
  414.    Defnp = NULL;   
  415.    r = OCIDefineByPos(Stmthp1, &Defnp, FErrhp, 1, Owner,   
  416.       sizeof(Owner) - 1, SQLT_CHR, NULL, NULL,   
  417.       NULL, OCI_DEFAULT);   
  418.    
  419.    if( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )   
  420.    {   
  421.       CreateErrorString("OCIDefineByPos : ");   
  422.       goto error;   
  423.    }   
  424.    
  425.    Defnp = NULL;   
  426.    r = OCIDefineByPos(Stmthp1, &Defnp, FErrhp, 2, TableName,   
  427.       sizeof(TableName) - 1, SQLT_CHR, NULL, NULL,   
  428.       NULL, OCI_DEFAULT);   
  429.    
  430.    if( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )   
  431.    {   
  432.       CreateErrorString("OCIDefineByPos : ");   
  433.       goto error;   
  434.    }   
  435.    
  436.    Defnp = NULL;   
  437.    r = OCIDefineByPos(Stmthp1, &Defnp, FErrhp, 3, TableSpace,   
  438.       sizeof(TableSpace) - 1, SQLT_CHR, NULL, NULL,   
  439.       NULL, OCI_DEFAULT);   
  440.    
  441.    if( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )   
  442.    {   
  443.       CreateErrorString("OCIDefineByPos : ");   
  444.       goto error;   
  445.    }   
  446.    
  447.    Defnp = NULL;   
  448.    r = OCIDefineByPos(Stmthp1, &Defnp, FErrhp, 4, RowNumber,   
  449.       sizeof(RowNumber) - 1, SQLT_CHR, NULL, NULL,   
  450.       NULL, OCI_DEFAULT);   
  451.    
  452.    if( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )   
  453.    {   
  454.       CreateErrorString("OCIDefineByPos : ");   
  455.       goto error;   
  456.    }   
  457.    
  458.    r = OCIStmtExecute(FSvchp, Stmthp1, FErrhp, 0, 0,   
  459.       NULL, NULL, OCI_DEFAULT);   
  460.    
  461.    if( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )   
  462.    {   
  463.       CreateErrorString("OCIStmtExecute(Stmthp1) : ");   
  464.       goto error;   
  465.    }   
  466.       
  467.    for(;;)   
  468.    {   
  469.       r = OCIStmtFetch2(Stmthp1, FErrhp, 1, OCI_FETCH_NEXT, 0, OCI_DEFAULT);   
  470.       if( r == OCI_NO_DATA )   
  471.          break;   
  472.       if( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )   
  473.       {   
  474.          CreateErrorString("OCIStmtFetch2 : ");   
  475.          goto error;   
  476.       }   
  477.       Owner[30] = '\0';   
  478.       TableName[30] = '\0';   
  479.       TableSpace[30]= '\0';   
  480.       //TableType[12] = '\0';   
  481.       RowNumber[10] = '\0';   
  482.    
  483.       TableDes  aTable;   
  484.       aTable.TableOwner  = AnsiString(Owner).TrimRight();   
  485.       aTable.TableName  = AnsiString(TableName).TrimRight();   
  486.       aTable.TableSpace  = AnsiString(TableSpace).TrimRight();   
  487.       aTable.Rows   = StrToInt(AnsiString(RowNumber).TrimRight());   
  488.       aTable.GetColOk = "no";   
  489.       aTable.GetIndexOk = false;   
  490.       aTable.GetKeyOk = false;   
  491.       //aTable.Type = AnsiString(TableType).TrimRight();   
  492.    
  493.       //add 2007-05-24   
  494.       //GetTableCol(aTable,aTable.Fields,i,DBName);   
  495.       i++;   
  496.       TableList.push_back(aTable);   
  497.    }   
  498.    
  499.    OCIHandleFree(Stmthp1, OCI_HTYPE_STMT);   
  500.    return true;   
  501.    
  502. error :   
  503.    
  504.    if( Stmthp1 != (OCIStmt*)OCI_INVALID_HANDLE )   
  505.       OCIHandleFree(Stmthp1, OCI_HTYPE_STMT);   
  506.    
  507.    return false;   
  508. }   
  509.    
  510. bool  __fastcall HOracle::GetTableCol(AnsiString tableName, AnsiString tableOwner,   
  511.      vector <ColumnDes> &TableCols)   
  512. {   
  513.    int i;   
  514.    sword r;   
  515.    OCIStmt *Stmthp1 = (OCIStmt*)OCI_INVALID_HANDLE;   
  516.    /*  
  517.    char ColumnName[30 + 1];  
  518.    memset(ColumnName, 0, sizeof(ColumnName));  
  519.    char DataType[30+1];  
  520.    char DataLength[10+1];  
  521.    char DataPrecision[10+1];  
  522.    char DataScale[10+1];  
  523.    char Nullable[1+1];  
  524.    char colID[10 + 1];  
  525.    */   
  526.    
  527.    typedef struct   
  528.    {   
  529.       char ColumnName[30 + 1];   
  530.       //memset(ColumnName, 0, sizeof(ColumnName));   
  531.       char DataType[30+1];   
  532.       char DataLength[10+1];   
  533.       char DataPrecision[10+1];   
  534.       char DataScale[10+1];   
  535.       char Nullable[1+1];   
  536.       char colID[10 + 1];   
  537.    } t_std;   
  538.    t_std tstd[100] = {0};   
  539.    
  540.    //Add by Liaoyangbo   
  541.    bool isLob = false;   
  542.    //增加LONG类型字段的判断   
  543.    bool isLong = false;   
  544.    //End by Liaoyangbo   
  545.    
  546.    
  547.    OCIDefine *Defnp;   
  548.    
  549.    AnsiString SqlStr1 =   
  550.       AnsiString("select column_name, substr(data_type,0,30), data_length, NVL(data_precision,0),")   
  551.        + " NVL(data_scale,0), nullable, column_id from dba_tab_columns where table_name='"   
  552.        + tableName + "' and owner ='" + tableOwner + "'";   
  553.    
  554.    
  555.    TableCols.clear();   
  556.    r = OCIHandleAlloc(FEnvhp, (dvoid**)&Stmthp1, OCI_HTYPE_STMT, 0, NULL);   
  557.    
  558.    if( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )   
  559.    {   
  560.       CreateErrorString("OCIHandleAlloc(Stmt1) : ");   
  561.       //goto error;   
  562.    }   
  563.    
  564.    r = OCIStmtPrepare(Stmthp1, FErrhp, SqlStr1.c_str(),   
  565.       SqlStr1.Length(), OCI_NTV_SYNTAX, OCI_DEFAULT);   
  566.    
  567.    if( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )   
  568.    {   
  569.       CreateErrorString("OCIStmtPrepare(SqlStr1) : ");   
  570.       //goto error;   
  571.    }   
  572.    
  573.    
  574.    OCIDefine *Defnp1 = (OCIDefine *) NULL;   
  575.    r = OCIDefineByPos(Stmthp1, &Defnp1, FErrhp, 1, &tstd[0].ColumnName,   
  576.       sizeof(tstd[0].ColumnName) - 1, SQLT_CHR, NULL, NULL,   
  577.       NULL, OCI_DEFAULT);   
  578.    
  579.    if( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )   
  580.    {   
  581.       CreateErrorString("OCIDefineByPos : ");   
  582.       //goto error;   
  583.    }   
  584.    
  585.    OCIDefine *Defnp2 = (OCIDefine *) NULL;   
  586.    r = OCIDefineByPos(Stmthp1, &Defnp2, FErrhp, 2, &tstd[0].DataType,   
  587.       sizeof(tstd[0].DataType) - 1, SQLT_CHR, NULL, NULL,   
  588.       NULL, OCI_DEFAULT);   
  589.    
  590.    if( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )   
  591.    {   
  592.       CreateErrorString("OCIDefineByPos : ");   
  593.       //goto error;   
  594.    }   
  595.    
  596.    OCIDefine *Defnp3 = (OCIDefine *) NULL;   
  597.    r = OCIDefineByPos(Stmthp1, &Defnp3, FErrhp, 3, &tstd[0].DataLength,   
  598.       sizeof(tstd[0].DataLength) - 1, SQLT_CHR, NULL, NULL,   
  599.       NULL, OCI_DEFAULT);   
  600.    
  601.    if( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )   
  602.    {   
  603.       CreateErrorString("OCIDefineByPos : ");   
  604.       //goto error;   
  605.    }   
  606.    
  607.    OCIDefine *Defnp4 = (OCIDefine *) NULL;   
  608.    r = OCIDefineByPos(Stmthp1, &Defnp4, FErrhp, 4, &tstd[0].DataPrecision,   
  609.       sizeof(tstd[0].DataPrecision) - 1, SQLT_CHR, NULL, NULL,   
  610.       NULL, OCI_DEFAULT);   
  611.    
  612.    if( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )   
  613.    {   
  614.       CreateErrorString("OCIDefineByPos : ");   
  615.       //goto error;   
  616.    }   
  617.    
  618.    OCIDefine *Defnp5 = (OCIDefine *) NULL;   
  619.    r = OCIDefineByPos(Stmthp1, &Defnp5, FErrhp, 5, &tstd[0].DataScale,   
  620.       sizeof(tstd[0].DataScale) - 1, SQLT_CHR, NULL, NULL,   
  621.       NULL, OCI_DEFAULT);   
  622.    
  623.    if( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )   
  624.    {   
  625.       CreateErrorString("OCIDefineByPos : ");   
  626.       //goto error;   
  627.    }   
  628.    
  629.    OCIDefine *Defnp6 = (OCIDefine *) NULL;   
  630.    r = OCIDefineByPos(Stmthp1, &Defnp6, FErrhp, 6, &tstd[0].Nullable,   
  631.       sizeof(tstd[0].Nullable) - 1, SQLT_CHR, NULL, NULL,   
  632.       NULL, OCI_DEFAULT);   
  633.    
  634.    if( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )   
  635.    {   
  636.       CreateErrorString("OCIDefineByPos : ");   
  637.       //goto error;   
  638.    }   
  639.    
  640.    OCIDefine *Defnp7 = (OCIDefine *) NULL;   
  641.    r = OCIDefineByPos(Stmthp1, &Defnp7, FErrhp, 7, &tstd[0].colID,   
  642.       sizeof(tstd[0].colID) - 1, SQLT_CHR, NULL, NULL,   
  643.       NULL, OCI_DEFAULT);   
  644.    
  645.    if( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )   
  646.    {   
  647.       CreateErrorString("OCIDefineByPos : ");   
  648.       //goto error;   
  649.    }   
  650.    
  651.    r = OCIDefineArrayOfStruct(Defnp1, FErrhp, sizeof(t_std), 0, 0, 0);   
  652.    r = OCIDefineArrayOfStruct(Defnp2, FErrhp, sizeof(t_std), 0, 0, 0);   
  653.    r = OCIDefineArrayOfStruct(Defnp3, FErrhp, sizeof(t_std), 0, 0, 0);   
  654.    r = OCIDefineArrayOfStruct(Defnp4, FErrhp, sizeof(t_std), 0, 0, 0);   
  655.    r = OCIDefineArrayOfStruct(Defnp5, FErrhp, sizeof(t_std), 0, 0, 0);   
  656.    r = OCIDefineArrayOfStruct(Defnp6, FErrhp, sizeof(t_std), 0, 0, 0);   
  657.    r = OCIDefineArrayOfStruct(Defnp7, FErrhp, sizeof(t_std), 0, 0, 0);   
  658.    
  659.    r = OCIStmtExecute(FSvchp, Stmthp1, FErrhp, 0, 0,   
  660.       NULL, NULL, OCI_DEFAULT);   
  661.    
  662.    if( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )   
  663.    {   
  664.       CreateErrorString("OCIStmtExecute(Stmthp1) : ");   
  665.       goto error;   
  666.    }   
  667.    
  668.    
  669.    for(;;)   
  670.    {   
  671.       r = OCIStmtFetch2(Stmthp1, FErrhp, 1, OCI_FETCH_NEXT, 0, OCI_DEFAULT);   
  672.       if( r == OCI_NO_DATA )   
  673.          break;   
  674.       if( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )   
  675.       {   
  676.          CreateErrorString("OCIStmtFetch2 : ");   
  677.          goto error;   
  678.       }   
  679.       /*  
  680.       tstd[0].ColumnName[30] = '\0';  
  681.       DataType[30] = '\0';  
  682.       DataLength[10] = '\0';  
  683.       DataPrecision[10] = '\0';  
  684.       DataScale[10]='\0';  
  685.       Nullable[1]='\0';  
  686.       colID[10] = '\0';  
  687.       */     
  688.    
  689.       for (i = 0; i < 100; i++)   
  690.       {   
  691.          ColumnDes aColumn;   
  692.          aColumn.ColumnName = AnsiString(tstd[i].ColumnName).TrimRight();   
  693.          if (aColumn.ColumnName.IsEmpty())   
  694.             break;   
  695.          aColumn.DataType = AnsiString(tstd[i].DataType).TrimRight();   
  696.          sscanf(tstd[i].DataLength, "%d", &aColumn.DataLength);   
  697.          sscanf(tstd[i].DataPrecision, "%d", &aColumn.DataPrecision);   
  698.          sscanf(tstd[i].DataScale, "%d", &aColumn.DataScale);   
  699.          if (tstd[i].Nullable[0] == 'y' || tstd[i].Nullable[0] == 'Y')   
  700.             aColumn.IsNull = true;   
  701.          else   
  702.             aColumn.IsNull = false;   
  703.    
  704.          //Add by Liaoyangbo   
  705.          sscanf(tstd[i].colID, "%d", &aColumn.ColId);   
  706.          
  707.          //增加对大对象的判断   
  708.          /*if (BlobList.find(aColumn.DataType) != BlobList.end())  
  709.          {  
  710.             //该字段为大对象  
  711.             aColumn.IsBlob = true;  
  712.             //存在大对象(表)  
  713.             isLob = true;  
  714.          }  
  715.          else  
  716.          {  
  717.             aColumn.IsBlob = false;  
  718.          }*/   
  719.          //判断该字段是否为LONG类型字段   
  720.          if (aColumn.DataType.UpperCase() == "LONG")   
  721.          {   
  722.             //该字段为LONG类型   
  723.             aColumn.IsLong = true;   
  724.             isLong = true;   
  725.          }   
  726.          else   
  727.          {   
  728.             aColumn.IsLong = false;   
  729.          }   
  730.          //End by Liaoyangbo   
  731.    
  732.          TableCols.push_back(aColumn);   
  733.       }   
  734.    }   
  735.    
  736.    //Add by Liaoyangbo   
  737.    //表中存在大对象   
  738.    if (isLob)   
  739.    {   
  740.        //Table.IsBlob = true;   
  741.    }   
  742.    else   
  743.    {   
  744.        //Table.IsBlob = false;   
  745.    }   
  746.    //表中是否存在LONG字段类型   
  747.    if (isLong)   
  748.    {   
  749.        //Table.hasLong = true;   
  750.    }   
  751.    else   
  752.    {   
  753.        //Table.hasLong = false;   
  754.    }   
  755.    //End by Liaoyangbo   
  756.    
  757.    OCIHandleFree(Stmthp1, OCI_HTYPE_STMT);   
  758.    return true;   
  759.    
  760. error :   
  761.    
  762.    if( Stmthp1 != (OCIStmt*)OCI_INVALID_HANDLE )   
  763.       OCIHandleFree(Stmthp1, OCI_HTYPE_STMT);   
  764.    
  765.    return false;    
  766. }   
  767.    
  768. bool __fastcall HOracle::GetTableDataInfo(AnsiString tableName, AnsiString tableOwner, vector <TableData> &TableDatas)   
  769. {   
  770.     sword r;   
  771.     OCIDefine *Defnp[4];   
  772.    
  773.     typedef struct   
  774.     {   
  775.        char col1[10+1];   
  776.        char col2[10+1];   
  777.        char col3[10+1];   
  778.        char col4[10+1];   
  779.     }stTableData;   
  780.    
  781.     stTableData tableData[100]= {0}; // 每次批量读取100行   
  782.     OCIStmt *Stmthp1 = (OCIStmt*)OCI_INVALID_HANDLE;   
  783.     string SqlStr1 = string("select * from ");   
  784.     SqlStr1 += tableOwner.c_str();   
  785.     SqlStr1 += string(".");   
  786.     SqlStr1 += tableName.c_str();   
  787.     //SqlStr1 += "";   
  788.    
  789.     Defnp[0] = (OCIDefine *) 0;   
  790.     Defnp[1] = (OCIDefine *) 0;   
  791.     Defnp[2] = (OCIDefine *) 0;   
  792.     Defnp[3] = (OCIDefine *) 0;   
  793.    
  794.     r = OCIHandleAlloc(FEnvhp, (dvoid**)&Stmthp1, OCI_HTYPE_STMT, 0, NULL);   
  795.    
  796.     if( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )   
  797.     {   
  798.         CreateErrorString("OCIHandleAlloc(Stmt1) : ");   
  799.         goto error;   
  800.     }   
  801.    
  802.     r = OCIStmtPrepare(Stmthp1, FErrhp, SqlStr1.c_str(),   
  803.       SqlStr1.length(), OCI_NTV_SYNTAX, OCI_DEFAULT);   
  804.     if( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )   
  805.     {   
  806.         CreateErrorString("OCIStmtPrepare(SqlStr1) : ");   
  807.         goto error;   
  808.     }   
  809.    
  810.     Defnp[0] = NULL;   
  811.     r = OCIDefineByPos(Stmthp1, &Defnp[0], FErrhp, 1, &tableData[0].col1,   
  812.       sizeof(tableData[0].col1) - 1, SQLT_CHR, NULL, NULL,   
  813.       NULL, OCI_DEFAULT);   
  814.     if( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )   
  815.     {   
  816.         CreateErrorString("OCIDefineByPos : ");   
  817.         goto error;   
  818.     }   
  819.    
  820.     Defnp[1] = NULL;   
  821.     r = OCIDefineByPos(Stmthp1, &Defnp[1], FErrhp, 2, &tableData[0].col2,   
  822.       sizeof(tableData[0].col2) - 1, SQLT_CHR, NULL, NULL,   
  823.       NULL, OCI_DEFAULT);   
  824.     if( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )   
  825.     {   
  826.         CreateErrorString("OCIDefineByPos : ");   
  827.         goto error;   
  828.     }   
  829.    
  830.     Defnp[2] = NULL;   
  831.     r = OCIDefineByPos(Stmthp1, &Defnp[2], FErrhp, 3, &tableData[0].col3,   
  832.       sizeof(tableData[0].col3) - 1, SQLT_CHR, NULL, NULL,   
  833.       NULL, OCI_DEFAULT);   
  834.     if( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )   
  835.     {   
  836.         CreateErrorString("OCIDefineByPos : ");   
  837.         goto error;   
  838.     }   
  839.    
  840.     Defnp[3] = NULL;   
  841.     r = OCIDefineByPos(Stmthp1, &Defnp[3], FErrhp, 4, &tableData[0].col4,   
  842.       sizeof(tableData[0].col4) - 1, SQLT_CHR, NULL, NULL,   
  843.       NULL, OCI_DEFAULT);   
  844.     if( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )   
  845.     {   
  846.         CreateErrorString("OCIDefineByPos : ");   
  847.         goto error;   
  848.     }   
  849.     r = OCIDefineArrayOfStruct(Defnp[0], FErrhp, sizeof(stTableData), 0, 0, 0);   
  850.     r = OCIDefineArrayOfStruct(Defnp[1], FErrhp, sizeof(stTableData), 0, 0, 0);   
  851.     r = OCIDefineArrayOfStruct(Defnp[2], FErrhp, sizeof(stTableData), 0, 0, 0);   
  852.     r = OCIDefineArrayOfStruct(Defnp[3], FErrhp, sizeof(stTableData), 0, 0, 0);   
  853.    
  854.     r = OCIStmtExecute(FSvchp, Stmthp1, FErrhp, 0, 0, NULL, NULL, OCI_DEFAULT);   
  855.     if( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )   
  856.     {   
  857.         CreateErrorString("OCIStmtExecute(Stmthp1) : ");   
  858.         goto error;   
  859.     }   
  860.    
  861.     for(;;)   
  862.     {   
  863.         r = OCIStmtFetch2(Stmthp1, FErrhp, 1, OCI_FETCH_NEXT, 0, OCI_DEFAULT); // OCI_FETCH_NEXT   
  864.         if( r == OCI_NO_DATA )   
  865.             break;   
  866.         if( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )   
  867.         {   
  868.             CreateErrorString("OCIStmtFetch2 : ");   
  869.             goto error;   
  870.         }   
  871.         for (int i = 0; i < 100; i++)   
  872.         {   
  873.             TableData aData;   
  874.             aData.col1 = AnsiString(tableData[i].col1).TrimRight();   
  875.             if (aData.col1.IsEmpty())   
  876.                 break;   
  877.    
  878.             aData.col2 = AnsiString(tableData[i].col2).TrimRight();   
  879.             aData.col3 = AnsiString(tableData[i].col3).TrimRight();   
  880.             aData.col4 = AnsiString(tableData[i].col4).TrimRight();   
  881.             TableDatas.push_back(aData);   
  882.         }   
  883.     }   
  884.     return true;   
  885.    
  886. error:   
  887.    if( Stmthp1 != (OCIStmt*)OCI_INVALID_HANDLE )   
  888.       OCIHandleFree(Stmthp1, OCI_HTYPE_STMT);   
  889.    return false;   
  890. }   

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值