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

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>
            久久在线免费观看视频| 韩国精品在线观看| 久久www免费人成看片高清| 中文在线资源观看网站视频免费不卡| 欧美成人日本| 亚洲人在线视频| 日韩天堂av| 亚洲欧美成人综合| 久久久久国产一区二区三区| 免费成人黄色av| 欧美日韩精品免费观看视频完整| 国产精品久久久久久久久久久久久| 国产精品一区二区欧美| 一区二区三区亚洲| 亚洲视频导航| 久久久亚洲高清| 91久久精品日日躁夜夜躁欧美 | 性色一区二区| 老司机午夜精品| 国产精品国产三级国产普通话99 | 久久精品一区二区三区四区| 欧美成人蜜桃| 亚洲一区二区成人在线观看| 久久久水蜜桃av免费网站| 欧美日韩亚洲天堂| 狠狠入ady亚洲精品| 亚洲天堂成人在线观看| 免费不卡中文字幕视频| 亚洲一区在线观看免费观看电影高清| 久久精品99久久香蕉国产色戒| 欧美另类极品videosbest最新版本| 国产欧美精品在线观看| 亚洲伦理网站| 久久视频在线免费观看| 在线一区免费观看| 欧美国产在线观看| 极品尤物av久久免费看| 亚洲欧美日韩综合aⅴ视频| 国产一区二区高清不卡| 亚洲视频在线视频| 亚洲黄色影片| 老司机精品导航| 国际精品欧美精品| 午夜精品剧场| 夜夜嗨一区二区| 欧美大片在线看| 永久域名在线精品| 久久久999成人| 午夜国产精品影院在线观看| 欧美日韩另类字幕中文| 亚洲激情国产| 欧美激情一区二区| 久久全国免费视频| 国产日韩欧美91| 午夜精品美女久久久久av福利| 亚洲精品中文字幕在线观看| 免费日韩av片| 91久久综合| 欧美激情一区在线观看| 美女脱光内衣内裤视频久久影院 | 好男人免费精品视频| 午夜精品久久99蜜桃的功能介绍| 亚洲毛片一区| 欧美日韩国内自拍| 这里只有精品视频在线| 亚洲精品中文字幕在线| 欧美日韩国产一区精品一区 | 艳女tv在线观看国产一区| 欧美国产第一页| 久久综合色影院| 亚洲国产视频a| 亚洲国产精品久久| 欧美精品在线观看播放| 亚洲视频狠狠| 亚洲网在线观看| 国产精品香蕉在线观看| 欧美一区2区三区4区公司二百 | 亚洲美女性视频| 欧美伦理a级免费电影| 亚洲国产日韩精品| 亚洲精品在线一区二区| 欧美视频一区二区三区| 午夜亚洲精品| 久久精品道一区二区三区| 亚洲大片在线| 亚洲国产另类久久久精品极度| 欧美日韩国产页| 久久精品国产综合精品| 狂野欧美激情性xxxx欧美| 亚洲精品乱码视频 | 亚洲激情视频在线播放| 欧美伦理a级免费电影| 性视频1819p久久| 久久亚洲精品一区| 亚洲天堂成人| 媚黑女一区二区| 欧美午夜电影一区| 久久男女视频| 欧美日韩精品在线播放| 久久精品中文字幕免费mv| 欧美承认网站| 欧美在线观看视频一区二区三区| 久久综合伊人77777尤物| 亚洲素人在线| 麻豆91精品| 欧美一区二区三区免费观看| 另类专区欧美制服同性| 亚洲午夜一区二区| 久久免费视频在线| 欧美亚洲一区二区三区| 欧美电影打屁股sp| 久久精品视频在线免费观看| 亚洲欧美日韩精品一区二区| 亚洲国产视频一区| 欧美一区二区| 亚洲欧美亚洲| 欧美日韩国产小视频在线观看| 久久婷婷av| 国产麻豆精品theporn| 亚洲毛片一区二区| 亚洲激情视频| 久久久久久久久久久成人| 翔田千里一区二区| 欧美视频一区二区三区…| 欧美激情一区二区三区成人| 国语精品中文字幕| 亚洲欧美国产精品va在线观看| 一本大道久久a久久精二百| 久久精品国产一区二区电影| 亚洲一级免费视频| 欧美成人一区二免费视频软件| 久久久99国产精品免费| 国产欧美婷婷中文| 亚洲综合首页| 午夜精品久久久久久久久久久| 欧美精品久久久久久久久老牛影院| 久久综合福利| 韩国av一区二区三区| 欧美综合激情网| 久久九九电影| 一区二区视频免费在线观看| 久久精品视频免费播放| 久久视频在线视频| 在线成人av.com| 久久婷婷av| 欧美韩国日本综合| 一本久久综合| 国产精品a久久久久久| 亚洲视频在线二区| 午夜精品久久99蜜桃的功能介绍| 国产精品国码视频| 亚洲天堂激情| 久久精品二区亚洲w码| 国产精品一区二区三区久久久 | 小黄鸭精品密入口导航| 亚洲夫妻自拍| 久久爱另类一区二区小说| 国产日韩一区| 久久久久久高潮国产精品视| 老司机aⅴ在线精品导航| 影音欧美亚洲| 欧美国产激情| 这里只有精品视频| 久久国产欧美日韩精品| 伊人成综合网伊人222| 欧美91福利在线观看| 99国产精品久久久久久久| 午夜激情久久久| 国产一区美女| 欧美肥婆bbw| 亚洲视频图片小说| 美女主播一区| 亚洲精品乱码| 国产精品超碰97尤物18| 欧美有码视频| 亚洲欧洲精品一区二区三区不卡| 亚洲与欧洲av电影| 在线看片日韩| 欧美天天视频| 久久av一区二区| 亚洲全黄一级网站| 久久狠狠久久综合桃花| 亚洲精品中文字幕有码专区| 国产精品美女一区二区| 久久九九国产精品| 日韩视频在线一区二区三区| 久久久噜噜噜久噜久久| 狠狠色综合网| 国产精品亚洲一区| 欧美国产免费| 欧美一区二区三区精品电影| 亚洲人妖在线| 欧美a级理论片| 性欧美长视频| 亚洲一级一区| 亚洲精品欧美日韩| 在线观看成人一级片| 国产视频欧美视频| 国产精品久久波多野结衣| 欧美成人亚洲|