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

r2100

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

常用鏈接

留言簿(3)

我參與的團隊

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

SQLExecDirect函數源代碼
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的結構
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 閱讀(1167) 評論(2)  編輯 收藏 引用

Feedback

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

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


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   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>
            亚洲欧美在线另类| 在线观看亚洲a| 亚洲曰本av电影| 久久久亚洲国产美女国产盗摄| 亚洲精品乱码久久久久久蜜桃麻豆| 久久久精品免费视频| 亚洲三级影院| 亚洲日本成人| 欧美成人第一页| 欧美成人精品在线| 99国产精品国产精品久久 | 亚洲高清不卡一区| 久久免费少妇高潮久久精品99| 免费视频一区二区三区在线观看| 欧美亚洲在线观看| 久久久久久久综合色一本| 久久成人在线| 老司机午夜精品视频| 免费看成人av| 欧美性一二三区| 黄色亚洲网站| 日韩视频一区二区三区| 亚欧成人精品| 欧美国产视频一区二区| 一区二区三区视频在线| 羞羞色国产精品| 欧美a一区二区| 国产精品老女人精品视频| 激情另类综合| 亚洲午夜小视频| 美女91精品| 一区二区三区不卡视频在线观看 | 亚洲香蕉在线观看| 久久国产精品久久久久久| 欧美激情1区| 亚洲在线播放电影| 欧美韩国在线| 国内外成人免费视频| 一区二区三区国产盗摄| 美日韩丰满少妇在线观看| 亚洲一级免费视频| 久久国产欧美日韩精品| 欧美激情一区二区三区不卡| 亚洲伊人久久综合| 欧美黄色片免费观看| 国产综合婷婷| 亚洲欧美日韩高清| 亚洲国产日韩欧美在线动漫| 亚洲欧美日韩天堂| 欧美午夜精品久久久久久浪潮| 黄色成人小视频| 久久福利毛片| 亚洲一区二区精品| 欧美亚洲成人免费| 日韩视频―中文字幕| 嫩草国产精品入口| 欧美xx视频| 久久国内精品视频| 国产日韩亚洲欧美精品| 欧美大片免费久久精品三p| 国产女主播视频一区二区| 亚洲欧美色婷婷| 亚洲一区久久久| 国产精品一区一区三区| 午夜天堂精品久久久久 | 久久久久久久久伊人| 午夜精品久久久久久久白皮肤| 国产精品无码专区在线观看| 欧美一级片在线播放| 性欧美激情精品| 精品盗摄一区二区三区| 美日韩在线观看| 欧美大色视频| 在线视频亚洲欧美| 亚洲伊人一本大道中文字幕| 国产欧美一区二区色老头| 久久久久久午夜| 裸体素人女欧美日韩| 99精品国产一区二区青青牛奶| 亚洲毛片在线| 国产乱人伦精品一区二区| 久久综合九色九九| 欧美精品一区二区三区久久久竹菊| 一区二区日韩免费看| 亚洲一区二区毛片| 伊人春色精品| 亚洲毛片在线看| 国产午夜亚洲精品不卡| 欧美激情视频网站| 国产精品成人免费视频| 久久久久高清| 欧美另类在线观看| 亚洲欧美精品伊人久久| 欧美一区2区视频在线观看| 亚洲国产一区二区在线| 在线视频精品| 激情小说另类小说亚洲欧美| 国产伦精品一区二区三区免费| 久久国产欧美精品| 欧美成人一区二区| 午夜视频在线观看一区| 国产精品一区二区久久久久| 欧美伊人久久久久久午夜久久久久| 久久国产99| 欧美人与禽猛交乱配| 亚洲欧美视频在线观看| 美玉足脚交一区二区三区图片| 亚洲美女一区| 久久成人免费| 日韩视频永久免费观看| 午夜免费电影一区在线观看| 国内外成人免费激情在线视频网站| 99精品欧美一区二区三区综合在线| 国产精品一卡二卡| 亚洲免费观看在线观看| 国产欧美1区2区3区| 亚洲免费观看在线视频| 欧美日韩精品久久久| 欧美va亚洲va国产综合| 国产婷婷色一区二区三区四区| 亚洲国产成人在线播放| 国产精品影院在线观看| 欧美激情第六页| 欧美日韩亚洲激情| 亚洲激情亚洲| 狠狠色丁香久久婷婷综合丁香| 亚洲乱码精品一二三四区日韩在线| 国产日产欧美精品| 亚洲精品美女91| 国产精品女人毛片| 亚洲国产婷婷香蕉久久久久久99| 国产欧美精品va在线观看| 一区二区国产日产| 亚洲欧美一区二区三区久久| 亚洲一区在线播放| 亚洲欧洲日本mm| 久久爱另类一区二区小说| 国内揄拍国内精品久久| 欧美啪啪成人vr| 久久精品一区二区三区中文字幕| 另类av导航| 亚洲欧美日韩第一区| 亚洲精品精选| 日韩亚洲欧美高清| 国产一区二区三区视频在线观看 | 久久精品欧美| 亚洲第一在线综合网站| 国产一区二区三区丝袜| 伊人成人在线视频| 国产一区二区三区成人欧美日韩在线观看 | 亚洲伦理中文字幕| 一本色道久久| 国产精品久久毛片a| 亚洲久色影视| 日韩视频在线你懂得| 猛男gaygay欧美视频| 久久久久五月天| 国产午夜精品全部视频在线播放| 国产精品99久久久久久有的能看| 亚洲第一成人在线| 欧美激情综合色| 亚洲欧洲日产国产网站| 亚洲国内自拍| 欧美精品国产| 日韩网站在线| 亚洲国产精品美女| 欧美日韩视频在线观看一区二区三区 | 免费观看一区| 亚洲电影在线观看| 欧美日韩在线播放三区| 亚洲老板91色精品久久| 一区二区免费在线视频| 欧美三级电影一区| 亚洲永久免费视频| 久久精品主播| 亚洲乱码国产乱码精品精可以看 | 国产精品久久久久久久久久三级| 制服诱惑一区二区| 亚洲欧美日韩中文在线制服| 国产精品一区二区三区四区五区| 亚洲自啪免费| 美日韩精品视频免费看| av不卡免费看| 国产啪精品视频| 欧美精品一区二区在线播放| 这里是久久伊人| 欧美不卡高清| 一本一本久久a久久精品综合麻豆 一本一本久久a久久精品牛牛影视 | 亚洲国产一区二区视频| 亚洲午夜精品一区二区| 国产亚洲午夜| 欧美国产日韩视频| 一道本一区二区| 久久久久久国产精品一区| 亚洲精品免费在线播放| 国产日韩1区| 欧美连裤袜在线视频| 久久香蕉国产线看观看av| 欧美成人午夜影院| 国产精品视频xxxx|