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

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 閱讀(1170) 評論(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>
            久久综合九色| 午夜精品久久久久久久蜜桃app | 国产精品久久久久久久午夜| 老司机aⅴ在线精品导航| 欧美性猛交视频| 亚洲第一精品夜夜躁人人爽| 亚洲视频在线视频| 亚洲欧洲偷拍精品| 久久久蜜臀国产一区二区| 欧美制服丝袜第一页| 欧美日韩一区三区四区| 亚洲欧洲日夜超级视频| 亚洲人成网站影音先锋播放| 欧美日韩性视频在线| 午夜在线视频一区二区区别| 亚洲欧美在线免费观看| 国模私拍一区二区三区| 欧美一区二区三区婷婷月色| 欧美亚洲视频在线观看| 国产精品视频免费一区| 亚洲一区国产精品| 亚洲欧美日韩在线高清直播| 国产精品分类| 亚洲视频免费| 午夜免费日韩视频| 亚洲第一成人在线| 欧美成人精品在线观看| 亚洲国产精品高清久久久| 亚洲欧洲一区二区三区久久| 国产精品观看| 久久综合久久综合这里只有精品| 日韩一区二区高清| 先锋影音久久| 日韩视频精品在线观看| 欧美日韩www| 一区二区三区视频观看| 欧美在线综合| 一区二区三区高清不卡| 国产精品久久久久久影视| 免费成人av在线| 最新日韩欧美| 久热爱精品视频线路一| 亚洲婷婷国产精品电影人久久| 国产精品久久久久av免费| 另类图片综合电影| 欧美在线免费观看| 亚洲大胆人体在线| 99精品免费| 国产精品一区二区三区乱码| 欧美在线视频全部完| 99在线精品观看| 欧美在线视频一区二区三区| 在线午夜精品| 日韩视频专区| 亚洲三级视频| 国产精品久久综合| 欧美日韩在线看| 欧美精品1区2区| 亚洲综合色激情五月| 老司机午夜免费精品视频| 欧美一区二区久久久| 91久久精品久久国产性色也91| 国产亚洲a∨片在线观看| 欧美成人精品不卡视频在线观看| 欧美在线免费| 欧美伊人久久| 久久精品99国产精品酒店日本| 亚洲黄色影片| 91久久极品少妇xxxxⅹ软件| 亚洲大胆人体视频| 欧美激情一区二区三级高清视频| 亚洲一区二区三区色| 在线观看av不卡| 国产精品久久久久一区二区三区共 | 亚洲自拍电影| 亚洲国产片色| 国产模特精品视频久久久久| 国产精品欧美日韩一区二区| 国产精品久久999| 国产精品久久国产三级国电话系列 | 久久综合999| 男女精品网站| 欧美一区二区视频网站| 欧美一区二区视频97| 欧美综合77777色婷婷| 久久久av网站| 亚洲欧美成人一区二区在线电影 | 亚洲欧美日韩国产综合在线 | 欧美成人精品影院| 久久av一区二区三区漫画| 欧美资源在线观看| 久久免费少妇高潮久久精品99| 亚洲免费一区二区| 欧美专区一区二区三区| 免费看的黄色欧美网站| 久久国产精品久久久| 99国产精品99久久久久久粉嫩| 99视频一区二区| 亚洲精品无人区| 亚洲永久在线| 久久亚洲免费| 久久综合激情| 亚洲人成在线影院| 亚洲区免费影片| 亚洲调教视频在线观看| 久久精品夜夜夜夜久久| 欧美精品久久99| 国产精品综合不卡av| 在线看国产一区| 亚洲一级高清| 欧美成人乱码一区二区三区| 免费视频最近日韩| 亚洲作爱视频| 久久久av网站| 国产精品chinese| 在线国产欧美| 亚洲欧美成人综合| 欧美国产精品v| 午夜国产不卡在线观看视频| 欧美h视频在线| 国产偷国产偷亚洲高清97cao| 亚洲精品日产精品乱码不卡| 久久精品国产清高在天天线| 亚洲欧洲一区二区三区| 久久av免费一区| 欧美午夜不卡视频| 亚洲国产精品高清久久久| 亚洲美女网站| 久久嫩草精品久久久久| 在线一区观看| 欧美高清视频在线| 国产精品扒开腿做爽爽爽视频 | 亚洲在线国产日韩欧美| 欧美成人免费在线| 精品69视频一区二区三区| 亚洲国内精品| 久久久五月婷婷| 亚洲无玛一区| 欧美午夜不卡在线观看免费 | 日韩一级黄色大片| 欧美不卡在线视频| 一区视频在线看| 久久国产免费看| 亚洲新中文字幕| 欧美日韩美女一区二区| 亚洲精品一二区| 欧美刺激午夜性久久久久久久| 欧美亚洲视频在线观看| 国产精品视频xxxx| 亚洲欧美日产图| 一区二区日韩伦理片| 欧美日韩成人精品| aa级大片欧美| 亚洲老司机av| 欧美在线高清| 国产伦精品一区二区三区视频孕妇| 宅男66日本亚洲欧美视频| 亚洲激情在线激情| 欧美国产精品久久| 亚洲美女av在线播放| 亚洲第一黄色网| 欧美国产日本| 亚洲免费激情| 日韩午夜av| 国产精品久久久久久av下载红粉| 亚洲一级二级| 亚洲在线不卡| 国产一区二区丝袜高跟鞋图片| 一区二区久久久久久| 亚洲美女视频网| 国产精品xvideos88| 午夜在线不卡| 欧美一级视频精品观看| 狠狠v欧美v日韩v亚洲ⅴ| 午夜免费电影一区在线观看| 亚洲综合第一| 韩国av一区二区三区在线观看| 久久综合中文色婷婷| 蜜臀99久久精品久久久久久软件| 亚洲国产裸拍裸体视频在线观看乱了| 欧美电影资源| 欧美日韩三级视频| 欧美一级黄色网| 久久精品中文| 亚洲伦理在线观看| 在线亚洲+欧美+日本专区| 国产欧美一区二区视频| 午夜精品婷婷| 久久久噜噜噜| 日韩视频免费观看高清在线视频| 99国产精品久久| 国产午夜精品美女毛片视频| 免费在线亚洲欧美| 欧美日韩亚洲视频| 久久久噜噜噜久久| 欧美二区在线| 午夜在线成人av| 老牛影视一区二区三区| 亚洲一区二区三区免费观看| 欧美在线观看你懂的|