青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

r2100

  C++博客 :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
  8 Posts :: 9 Stories :: 2 Comments :: 0 Trackbacks

常用鏈接

留言簿(3)

我參與的團(tuán)隊(duì)

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

SQLExecDirect函數(shù)源代碼
static SQLRETURN
ODBCExecDirect(ODBCStmt 
*stmt, SQLCHAR *szSqlStr, SQLINTEGER nSqlStr)
{
    
char *query;
    MapiMsg ret;
    MapiHdl hdl;

    hdl 
= stmt->hdl;

    
if (stmt->State >= EXECUTED1 || (stmt->State == EXECUTED0 && mapi_more_results(hdl))) {
        
/* Invalid cursor state */
        addStmtError(stmt, 
"24000", NULL, 0);
        
return SQL_ERROR;
    }

    
/* TODO: convert ODBC escape sequences ( {d 'value'} or {t 'value'} or
       {ts 'value'} or {escape 'e-char'} or {oj outer-join} or
       {fn scalar-function} etc. ) to MonetDB SQL syntax 
*/
    query 
= ODBCTranslateSQL(szSqlStr, (size_t) nSqlStr, stmt->noScan);

    ODBCResetStmt(stmt);

#ifdef ODBCDEBUG
    ODBCLOG(
"SQLExecDirect: \"%s\"\n", query);
#endif

    ret 
= mapi_query_handle(hdl, query);
    free(query);
    
switch (ret) {
    
case MOK:
        
break;
    
case MTIMEOUT:
        
/* Communication link failure */
        addStmtError(stmt, 
"08S01", mapi_error_str(stmt->Dbc->mid), 0);
        
return SQL_ERROR;
    
default:
        
/* General error */
        addStmtError(stmt, 
"HY000", mapi_error_str(stmt->Dbc->mid), 0);
        
return SQL_ERROR;
    }

    
/* now get the result data and store it to our internal data structure */

    
return ODBCInitResult(stmt);
}

As mentioned earlier, it is more efficient to reuse statements than to drop them and allocate new ones. Before executing a new SQL statement on a statement, applications should be sure that the current statement settings are appropriate. These include statement attributes, parameter bindings, and result set bindings. Generally, parameters and result sets for the old SQL statement need to be unbound (by calling SQLFreeStmt with the SQL_RESET_PARAMS and SQL_UNBIND options) and rebound for the new SQL statement.

When the application has finished using the statement, it calls SQLFreeHandle to free the statement. After freeing the statement, it is an application programming error to use the statement's handle in a call to an ODBC function; doing so has undefined but probably fatal consequences.

When SQLFreeHandle is called, the driver releases the structure used to store information about the statement.

SQLDisconnect automatically frees all statements on a connection.


         
/**********************************************
 * ODBCStmt.c
 *
 * Description:
 * This file contains the functions which operate on
 * ODBC statement structures/objects (see ODBCStmt.h).
 *
 * Author: Martin van Dinther
 * Date  : 30 aug 2002
 *
 *********************************************
*/

#include 
"ODBCGlobal.h"
#include 
"ODBCStmt.h"

#define ODBC_STMT_MAGIC_NR  5461    /* for internal sanity check only */


/*
 * Creates a new allocated ODBCStmt object and initializes it.
 *
 * Precondition: none
 * Postcondition: returns a new ODBCStmt object
 
*/
ODBCStmt 
*
newODBCStmt(ODBCDbc 
*dbc)
{
    ODBCStmt 
*stmt = (ODBCStmt *) malloc(sizeof(ODBCStmt));
    assert(stmt);

    assert(dbc);
    assert(dbc
->mid);

    
if (stmt == NULL) {
        
/* Memory allocation error */
        addDbcError(dbc, 
"HY001", NULL, 0);
        
return NULL;
    }

    stmt
->Dbc = dbc;
    stmt
->Error = NULL;
    stmt
->RetrievedErrors = 0;

    stmt
->State = INITED;
    stmt
->hdl = mapi_new_handle(dbc->mid);
    
if (stmt->hdl == NULL) {
        
/* Memory allocation error */
        addDbcError(dbc, 
"HY001", NULL, 0);
        free(stmt);
        
return NULL;
    }
    assert(stmt
->hdl);

    stmt
->currentRow = 0;
    stmt
->startRow = 0;
    stmt
->rowSetSize = 0;
    stmt
->queryid = -1;
    stmt
->nparams = 0;
    stmt
->querytype = -1;
    stmt
->rowcount = 0;

    
/* add this stmt to the administrative linked stmt list */
    stmt
->next = dbc->FirstStmt;
    dbc
->FirstStmt = stmt;

    stmt
->cursorType = SQL_CURSOR_FORWARD_ONLY;
    stmt
->cursorScrollable = SQL_NONSCROLLABLE;
    stmt
->retrieveData = SQL_RD_ON;
    stmt
->noScan = SQL_NOSCAN_OFF;

    stmt
->ApplRowDescr = newODBCDesc(dbc);
    stmt
->ApplParamDescr = newODBCDesc(dbc);
    stmt
->ImplRowDescr = newODBCDesc(dbc);
    stmt
->ImplParamDescr = newODBCDesc(dbc);
    stmt
->AutoApplRowDescr = stmt->ApplRowDescr;
    stmt
->AutoApplParamDescr = stmt->ApplParamDescr;

    
if (stmt->ApplRowDescr == NULL || stmt->ApplParamDescr == NULL || stmt->ImplRowDescr == NULL || stmt->ImplParamDescr == NULL) {
        destroyODBCStmt(stmt);
        
return NULL;
    }

    stmt
->ApplRowDescr->sql_desc_alloc_type = SQL_DESC_ALLOC_AUTO;
    stmt
->ApplParamDescr->sql_desc_alloc_type = SQL_DESC_ALLOC_AUTO;
    stmt
->ImplRowDescr->sql_desc_alloc_type = SQL_DESC_ALLOC_AUTO;
    stmt
->ImplParamDescr->sql_desc_alloc_type = SQL_DESC_ALLOC_AUTO;
    stmt
->ImplRowDescr->Stmt = stmt;
    stmt
->ImplParamDescr->Stmt = stmt;

    stmt
->Type = ODBC_STMT_MAGIC_NR;    /* set it valid */

    
return stmt;
}

SQLFreeHandle
ODBCFreeStmt_(ODBCStmt 
*stmt)
{
    
/* check if statement is not active */
    
if (stmt->State >= EXECUTED0) {
        
/* should be closed first */
        
if (SQLFreeStmt_(stmt, SQL_CLOSE) == SQL_ERROR)
            
return SQL_ERROR;
    }

    
/* Ready to destroy the stmt handle */
    destroyODBCStmt(stmt);
    
return SQL_SUCCESS;
}


SQLFreeStmt

SQLFreeStmt_(ODBCStmt 
*stmt, SQLUSMALLINT option)
{
    
switch (option) {
    
case SQL_CLOSE:
        
/* Note: this option is also called from SQLCancel() and
           SQLCloseCursor(), so be careful when changing the code 
*/
        
/* close cursor, discard result set, set to prepared */
        setODBCDescRecCount(stmt
->ImplRowDescr, 0);
        stmt
->currentRow = 0;
        stmt
->startRow = 0;
        stmt
->rowSetSize = 0;

        
if (stmt->State == EXECUTED0)
            stmt
->State = stmt->queryid >= 0 ? PREPARED0 : INITED;
        
else if (stmt->State >= EXECUTED1)
            stmt
->State = stmt->queryid >= 0 ? PREPARED1 : INITED;

        
/* Important: do not destroy the bind parameters and columns! */
        
return SQL_SUCCESS;
    
case SQL_DROP:
        
return ODBCFreeStmt_(stmt);
    
case SQL_UNBIND:
        setODBCDescRecCount(stmt
->ApplRowDescr, 0);
        
return SQL_SUCCESS;
    
case SQL_RESET_PARAMS:
        setODBCDescRecCount(stmt
->ApplParamDescr, 0);
        setODBCDescRecCount(stmt
->ImplParamDescr, 0);
        mapi_clear_params(stmt
->hdl);
        
return SQL_SUCCESS;
    
default:
        
/* Invalid attribute/option identifier */
        addStmtError(stmt, 
"HY092", NULL, 0);
        
return SQL_ERROR;
    }

    
/* not reached */
}

SQLHSTMT的結(jié)構(gòu)
typedef 
struct tODBCDRIVERSTMT {
    
/* Stmt properties */
    
int Type;        /* structure type, used for handle validy test */
    ODBCError 
*Error;    /* pointer to an Error object or NULL */
    
int RetrievedErrors;    /* # of errors already retrieved by SQLError */
    ODBCDbc 
*Dbc;        /* Connection context */
    
struct tODBCDRIVERSTMT *next;    /* the linked list of stmt's in this Dbc */
    
enum StatementState State;    /* needed to detect invalid cursor state */
    MapiHdl hdl;

    unsigned 
int rowcount;    /* # affected rows */

    
/* startRow is the row number of first row in the result
       set (0 based); rowSetSize is the number of rows in the
       current result set; currentRow is the row number of the
       current row within the current result set 
*/
    unsigned 
int currentRow;
    unsigned 
int startRow;
    unsigned 
int rowSetSize;

    unsigned 
int currentCol; /* used by SQLGetData() */
    SQLINTEGER retrieved;    
/* amount of data retrieved */
    
int queryid;        /* the query to be executed */
    
int nparams;        /* the number of parameters expected */

    
int querytype;        /* query type as returned by server */

    SQLUINTEGER cursorType;
    SQLUINTEGER cursorScrollable;
    SQLUINTEGER retrieveData;
    SQLUINTEGER noScan;

    ODBCDesc 
*ApplRowDescr;    /* Application Row Descriptor (ARD) */
    ODBCDesc 
*ApplParamDescr; /* Application Parameter Descriptor (APD) */
    ODBCDesc 
*ImplRowDescr;    /* Implementation Row Descriptor (IRD) */
    ODBCDesc 
*ImplParamDescr; /* Implementation Parameter Descriptor (IPD) */

    ODBCDesc 
*AutoApplRowDescr; /* Auto-allocated ARD */
    ODBCDesc 
*AutoApplParamDescr; /* Auto-allocated APD */

    
/* Stmt children: none yet */
} ODBCStmt;






posted on 2008-09-11 11:31 r2100 閱讀(1159) 評論(2)  編輯 收藏 引用

Feedback

# re: http://msdn.microsoft.com/en-us/library/ms716303(VS.85).aspx 2008-09-11 11:32 r2100
但是一直沒有找到實(shí)例,郁悶  回復(fù)  更多評論
  

# re: http://msdn.microsoft.com/en-us/library/ms716303(VS.85).aspx 2009-01-28 18:01 張三
安裝不成。。。  回復(fù)  更多評論
  


只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美激情亚洲| 久久久综合网站| 欧美新色视频| 亚洲欧美三级伦理| 性欧美激情精品| 在线日韩成人| 亚洲黄页一区| 欧美日韩ab| 亚洲欧美日韩一区二区在线 | 欧美在线一区二区| 久久久久国产精品麻豆ai换脸| 亚洲夫妻自拍| 亚洲精品免费观看| 国产伦精品一区二区三区高清 | 亚洲亚洲精品三区日韩精品在线视频| 9久re热视频在线精品| 国产欧美精品日韩精品| 欧美99在线视频观看| 欧美日韩123| 久久精品女人天堂| 欧美高清在线视频| 久久精品30| 欧美精品v日韩精品v韩国精品v| 先锋影音久久| 欧美激情五月| 久久综合九色| 国产美女一区| 亚洲巨乳在线| 亚洲高清不卡在线观看| 国产精品99久久久久久久vr| 亚洲国产精品一区二区第四页av| 99视频精品在线| 亚洲国产成人在线视频| 一本色道久久综合亚洲精品不| 一区免费在线| 亚洲欧美经典视频| 在线综合视频| 欧美国产成人精品| 久久综合亚洲社区| 国产精品视频1区| 亚洲精品欧洲精品| 亚洲国产日韩欧美在线99 | 午夜视频一区二区| 一本色道久久88亚洲综合88| 久久精品最新地址| 欧美一区二区三区久久精品 | 亚洲欧美中文字幕| 亚洲一区二区在| 欧美精品日韩一本| 亚洲高清在线精品| 在线观看成人一级片| 久久国产一区二区| 久久亚洲不卡| 国产亚洲欧美激情| 午夜精品久久久久久久99樱桃| 99这里只有精品| 欧美精品免费看| 亚洲精品免费观看| 99精品黄色片免费大全| 欧美日产在线观看| 99视频精品| 亚洲综合导航| 国产美女精品视频| 销魂美女一区二区三区视频在线| 亚洲欧美国产va在线影院| 欧美午夜精品久久久久久超碰| 日韩午夜三级在线| 亚洲欧美国产视频| 国产欧美视频在线观看| 欧美在线视频在线播放完整版免费观看 | 久久偷看各类wc女厕嘘嘘偷窃| 鲁鲁狠狠狠7777一区二区| 狠狠色丁香婷婷综合久久片| 久久色在线播放| 亚洲欧洲一区二区三区| 一本色道精品久久一区二区三区| 欧美日韩一区二区三区四区五区 | 欧美亚洲综合久久| 老司机精品福利视频| 亚洲国产成人在线视频| 欧美理论电影在线播放| 亚洲最新视频在线播放| 欧美一级一区| 精品999久久久| 欧美激情一区二区在线 | 久久中文字幕导航| 亚洲精品美女在线| 久久国产精品99久久久久久老狼| 国内精品久久久久影院色 | 久久这里只有精品视频首页| 亚洲国产成人av| 亚洲欧美清纯在线制服| 合欧美一区二区三区| 欧美精品九九99久久| 亚洲欧美另类久久久精品2019| 蘑菇福利视频一区播放| 亚洲一区二区在线视频| 永久免费视频成人| 国产精品a久久久久| 久久久99国产精品免费| 99re国产精品| 久久久在线视频| 亚洲午夜av在线| 伊人久久综合97精品| 国产精品国产福利国产秒拍| 久久综合色一综合色88| 中国成人黄色视屏| 欧美激情综合| 久久久亚洲影院你懂的| 中文亚洲欧美| 亚洲激情小视频| 国产欧美日韩视频一区二区| 欧美高清视频一二三区| 久久久久国色av免费看影院 | 欧美 日韩 国产精品免费观看| 亚洲午夜免费福利视频| 亚洲高清视频在线| 国产日韩欧美二区| 国产精品久久久久毛片大屁完整版 | 久久蜜桃精品| 亚洲欧美日韩一区二区三区在线观看 | 欧美激情视频一区二区三区免费| 欧美专区在线播放| 亚洲午夜在线视频| 亚洲精品一区二区三区99| 欧美激情精品久久久久| 久久人人爽国产| 欧美呦呦网站| 欧美亚洲三级| 欧美一区国产一区| 性欧美暴力猛交69hd| 亚洲欧美激情一区| 亚洲一级在线| 亚洲伊人久久综合| 亚洲午夜精品| 亚洲线精品一区二区三区八戒| 亚洲精品永久免费| 亚洲日本va午夜在线电影| 亚洲国产日韩欧美一区二区三区| 在线观看国产精品网站| 亚洲第一网站免费视频| 亚洲大胆av| 最新中文字幕亚洲| 亚洲靠逼com| 亚洲色图自拍| 亚洲欧美日韩一区| 久久国产精品一区二区三区四区| 欧美在线视频免费观看| 久久国产精品第一页| 久久久噜噜噜久久中文字免| 久久精品av麻豆的观看方式| 久久久久成人网| 久久另类ts人妖一区二区| 老鸭窝91久久精品色噜噜导演| 蜜桃av一区二区三区| 欧美激情在线狂野欧美精品| 亚洲人成久久| 亚洲性图久久| 久久久久国产一区二区| 欧美大片在线看免费观看| 欧美午夜久久久| 国产一区二区三区直播精品电影 | 久久av一区二区三区亚洲| 久久性天堂网| 亚洲精品一区二区在线观看| 亚洲字幕一区二区| 久久国产综合精品| 欧美国产先锋| 国产午夜精品一区理论片飘花| 在线精品视频在线观看高清| 在线一区二区视频| 久久香蕉国产线看观看av| 亚洲黄色av| 亚洲免费小视频| 欧美电影电视剧在线观看| 欧美亚洲第一页| 亚洲国产欧美日韩| 欧美一区二区三区的| 亚洲国产黄色| 久久精品国产成人| 欧美日韩中国免费专区在线看| 国产日韩精品综合网站| 亚洲开发第一视频在线播放| 久久精品国产精品亚洲精品| 亚洲人成人一区二区在线观看| 亚洲综合色丁香婷婷六月图片| 欧美aaa级| 国产一区二区三区久久久久久久久| 亚洲人精品午夜| 久久久中精品2020中文| 亚洲视频999| 欧美日韩一区二区精品| 在线精品亚洲| 久久性天堂网| 午夜老司机精品| 国产精品一卡| 亚洲网站视频| 最新国产の精品合集bt伙计| 久久综合狠狠| 激情综合久久|