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

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 閱讀(1175) 評論(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>
            国产视频久久| 亚洲激情女人| 午夜在线电影亚洲一区| 一区二区欧美国产| 国产精品久久久久天堂| 亚洲综合欧美| 小嫩嫩精品导航| 一区在线播放| 亚洲国产精品视频一区| 免费看的黄色欧美网站| 日韩图片一区| 亚洲淫性视频| 黄色av日韩| 亚洲国产网站| 国产精品一区二区三区四区五区| 久久精品国产免费观看| 久久婷婷国产综合尤物精品| 亚洲精品欧美一区二区三区| 在线性视频日韩欧美| 国产午夜精品全部视频播放 | 国产免费成人在线视频| 久久久精品日韩欧美| 久久一区国产| 亚洲午夜一区二区三区| 久久国内精品自在自线400部| 最新国产成人av网站网址麻豆| 日韩一级二级三级| 激情校园亚洲| 中文高清一区| 最新69国产成人精品视频免费| 一区二区久久久久| 伊人久久亚洲影院| 中文久久精品| 亚洲日本成人| 欧美一区亚洲二区| 一区二区三区欧美在线| 久久久久久久久久久一区| 洋洋av久久久久久久一区| 亚洲综合不卡| 在线视频欧美一区| 久久一日本道色综合久久| 亚洲一区二区三区乱码aⅴ蜜桃女 亚洲一区二区三区乱码aⅴ | 亚洲深夜福利视频| 狠狠狠色丁香婷婷综合久久五月| 老司机午夜精品| 国产精品vvv| 亚洲国产综合视频在线观看| 国产一区二区三区四区在线观看| 日韩午夜电影| 亚洲人成亚洲人成在线观看 | 欧美不卡一卡二卡免费版| 国产精品超碰97尤物18| 亚洲国产一区二区三区a毛片| 国产一区二区三区成人欧美日韩在线观看| 亚洲青涩在线| 亚洲伦理一区| 久久中文字幕导航| 久久伊伊香蕉| 激情成人在线视频| 性色av一区二区三区在线观看| 中文亚洲欧美| 欧美三区在线观看| 日韩视频在线一区二区| 日韩视频在线观看| 欧美高清在线观看| 亚洲清纯自拍| 亚洲一区二区三区影院| 欧美伦理91i| 一区二区三区四区精品| 亚洲图片欧洲图片日韩av| 欧美日本国产视频| 亚洲毛片在线看| 亚洲天堂免费在线观看视频| 欧美日韩成人在线| av不卡在线看| 午夜亚洲福利| 国产一区二区三区高清在线观看| 亚洲欧美日韩国产| 久久精品一区二区三区不卡牛牛| 国产日韩一区二区| 久久精品视频免费| 欧美成人蜜桃| 99国产一区| 欧美日一区二区三区在线观看国产免| 日韩视频二区| 久久成人综合视频| 亚洲大片精品永久免费| 欧美韩国日本综合| 在线视频欧美日韩| 久久久在线视频| 亚洲国产精品va在看黑人| 欧美成人情趣视频| 亚洲一区二区三区中文字幕在线 | 精品成人国产| 欧美国产综合视频| 亚洲一区二区三区四区五区黄 | 日韩视频在线永久播放| 欧美亚州一区二区三区| 欧美一区=区| 亚洲第一网站| 亚洲欧美视频在线观看| 韩国三级电影久久久久久| 欧美a级大片| 亚洲香蕉网站| 欧美激情精品久久久久久免费印度| 日韩视频在线一区| 国内成+人亚洲| 欧美日韩精品二区| 久久久久国产精品厨房| 一本色道久久综合| 欧美国产精品人人做人人爱| 亚洲欧美日韩成人高清在线一区| 狠狠色狠狠色综合日日tαg| 欧美另类极品videosbest最新版本 | 性欧美18~19sex高清播放| 136国产福利精品导航| 国产精品免费一区二区三区观看| 久久久精品国产一区二区三区| 亚洲精品一区二区三| 免费一级欧美片在线播放| 亚洲欧美日韩在线高清直播| 亚洲欧洲日韩在线| 国产一区二区日韩精品欧美精品 | 久久精品欧美| 亚洲午夜成aⅴ人片| 最新亚洲一区| 欧美承认网站| 老司机久久99久久精品播放免费 | 激情亚洲网站| 国产精品一区二区三区久久久 | 久久免费99精品久久久久久| 亚洲免费伊人电影在线观看av| 亚洲电影免费在线观看| 欧美成年人网站| 久久久夜夜夜| 久热精品视频| 久久综合精品国产一区二区三区| 欧美亚洲一区| 午夜日韩福利| 欧美一区日本一区韩国一区| 亚洲一区久久| 亚洲免费网址| 亚洲综合国产激情另类一区| 亚洲一级片在线观看| 亚洲无吗在线| 亚洲自拍偷拍福利| 性做久久久久久| 欧美一区在线看| 欧美专区在线观看| 久久精品国产精品亚洲精品| 欧美伊人久久久久久久久影院| 午夜精品福利电影| 久久精品盗摄| 免费在线观看一区二区| 欧美大尺度在线观看| 亚洲国产欧美日韩精品| 亚洲啪啪91| 宅男噜噜噜66国产日韩在线观看| 一区二区三区四区五区精品| 亚洲在线观看| 久久国产一区二区| 美女被久久久| 欧美午夜在线观看| 国产欧美一区二区三区久久人妖| 国产欧美日韩视频一区二区三区 | 国产精品久久久久av免费| 国产精品国产自产拍高清av王其| 国产精品大全| 国产一区二区三区网站| 亚洲国产美国国产综合一区二区 | 国产精品一二三视频| 精东粉嫩av免费一区二区三区| 亚洲第一伊人| 亚洲在线成人| 久久久久一区二区三区四区| 亚洲电影免费在线观看| 亚洲视频网站在线观看| 欧美一区二区精品在线| 欧美成人一区二区三区| 国产精品人成在线观看免费| 在线观看日韩av电影| 亚洲曰本av电影| 欧美大片在线观看一区二区| 99视频精品免费观看| 久久精品91| 欧美日韩在线电影| 极品尤物久久久av免费看| 中国成人亚色综合网站| 老司机亚洲精品| 亚洲在线一区二区三区| 欧美v日韩v国产v| 国产欧美日韩一区二区三区在线观看| 亚洲电影一级黄| 欧美亚洲一区二区在线| 91久久一区二区| 久久香蕉国产线看观看av| 国产精品久久久久影院色老大 | 久久综合999| 亚洲一区bb| 欧美精品日韩一区|