2015年12月21日
#
ld在鏈接的時候找不到所需的動態庫 1、安裝所需的動態庫 2、修改鏈接查找路徑配置文件 二選一 a)、在有root權限情況下: echo "usr/local/lib >> /etc/ld.so.conf" b)、在沒有root權限的情況下: $ echo "export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH" >> ~/.bashrc
ps:查找庫的方法
$ locate libiconv.so.2
$ whereis libiconv.so.2
$ find /usr /lib -name libiconv.so.2
$ find / -name libiconv.so.2 2>/dev/null
2015年12月20日
#
cat -A 能看到符號 Windows: ^M$ CR LF Linux: $ LF 對于文本問題,可以使用 UNIX2dox、dos2UNIX 轉換
2011年4月6日
#
// 把一個wstring轉化為string
std::string& to_string(std::string& dest, std::wstring const & src)
  {
std::setlocale(LC_CTYPE, "");

size_t const mbs_len = wcstombs(NULL, src.c_str(), 0);
std::vector<char> tmp(mbs_len + 1);
wcstombs(&tmp[0], src.c_str(), tmp.size());

dest.assign(tmp.begin(), tmp.end() - 1);

return dest;
}
// 把一個string轉化為wstring
std::wstring& to_wstring(std::wstring& dest, std::string const & src)
  {
std::setlocale(LC_CTYPE, "");

size_t const wcs_len = mbstowcs(NULL, src.c_str(), 0);
std::vector<wchar_t> tmp(wcs_len + 1);
mbstowcs(&tmp[0], src.c_str(), src.size());

dest.assign(tmp.begin(), tmp.end() - 1);

return dest;


2008年9月12日
#
老板要求重用SQLHSTMT句柄,找到一些資料 1、使用SQLExecDirect執行了查詢語句,記錄集會存放在hstmt中, 2、通過SQLBindCol把記錄集和變量綁定。 3、SQLFreeStmt(hstmt, SQL_UNBIND);釋放由先前對此語句句柄進行的
SQLBindCol() 調用綁定的所有列(應用程序變量或文件引用與結果集列之間的關聯將斷開)。 4、SQLCloseCursor(hstmt);將關閉任何與語句句柄相關聯的游標并廢棄任何暫掛結果
如果不需要使用返回的結果集 1、使用SQLExecDirect執行了查詢語句,記錄集會存放在hstmt中, 2、SQLCloseCursor(hstmt)或者SQLFreeStmt(hstmt,SQL_CLOSE )將關閉任何與語句句柄相關聯的游標并廢棄任何暫掛結果
2008年9月11日
#
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;
2008年2月26日
#
2008年1月31日
#
|