unixODBC編程(四)插入數據
訪問www.tomcoding.com網站,學習Oracle內部數據結構,詳細文檔說明,下載Oracle的exp/imp,DUL,logminer,ASM工具的源代碼,學習高技術含量的內容。
ODBC插入數據也有一定的步驟,我們先來看一下。
1. 分配一個語句句柄,使用SQLAllocHandle()函數,句柄類型為SQL_HANDLE_STMT。
2. 準備語句,使用SQLPrepare()函數。
3. 為綁定的變量賦值。
4. 綁定輸入變量,使用SQLBindParameter()函數。
5. 執行語句,使用SQLExecute()函數。
6. 提交執行結果,使用SQLEndTran()函數。
這里只有兩個新函數,SQLBindParameter()和SQLEndTran()。看一下他們的原型和參數。
綁定輸入變量函數。
SQLRETURN SQLBindParameter(
SQLHSTMT StatementHandle,
SQLUSMALLINT ParameterNumber,
SQLSMALLINT InputOutputType,
SQLSMALLINT ValueType,
SQLSMALLINT ParameterType,
SQLULEN ColumnSize,
SQLSMALLINT DecimalDigits,
SQLPOINTER ParameterValuePtr,
SQLLEN BufferLength,
SQLLEN * StrLen_or_IndPtr);
StatementHandle是一個輸入參數,語句句柄。
ParameterNumber是一個輸入參數,參數編號,按遞增參數順序按順序排序,從 1 開始。
InputOutputType是一個輸入參數,指示綁定的參數是輸入還是輸出,這里是SQL_PARAM_INPUT。
ValueType是一個輸入參數,指示綁定參數的 C 數據類型。參考下面的表。
ParameterType是一個輸入參數,指示綁定參數的 SQL 數據類型。參考下面的表。
ColumnSize是一個輸入參數,指示綁定參數列大小,即表的列長度。字符類型的列可以設置長度,其他類型會忽略。
DecimalDigits是一個輸入參數,指示綁定參數標記的列的十進制數字位數。其他類型忽略。
ParameterValuePtr是一個輸入參數,指向綁定參數數據的緩沖區的指針。
BufferLength是一個輸入/輸出參數,指示ParameterValuePtr 緩沖區的長度(以字節為單位)。主要限制輸出的數據不要超出緩沖區。
StrLen_or_IndPtr是一個輸入參數,指向綁定參數長度緩沖區的指針,用作輸入的數據長度或指示變量。
ValueType類型對照表
|
C 類型標識符 |
ODBC C typedef |
C 類型 |
|
SQL_C_CHAR |
SQLCHAR * |
unsigned char * |
|
SQL_C_WCHAR |
SQLWCHAR * |
wchar_t * |
|
SQL_C_SSHORT |
SQLSMALLINT |
short int |
|
SQL_C_USHORT |
SQLUSMALLINT |
unsigned short int |
|
SQL_C_SLONG |
SQLINTEGER |
long int |
|
SQL_C_ULONG |
SQLUINTEGER |
unsigned long int |
|
SQL_C_FLOAT |
SQLREAL |
FLOAT |
|
SQL_C_DOUBLE |
SQLDOUBLE、SQLFLOAT |
Double |
|
SQL_C_BIT |
SQLCHAR |
unsigned char |
|
SQL_C_STINYINT |
SQLSCHAR |
signed char |
|
SQL_C_UTINYINT[j] |
SQLCHAR |
unsigned char |
|
SQL_C_SBIGINT |
SQLBIGINT |
_int64 |
|
SQL_C_UBIGINT |
SQLUBIGINT |
unsigned _int64 |
|
SQL_C_BINARY |
SQLCHAR * |
unsigned char * |
事務提交函數。
SQLRETURN SQLEndTran(
SQLSMALLINT HandleType,
SQLHANDLE Handle,
SQLSMALLINT CompletionType);
HandleType是一個輸入參數,句柄類型標識符。 包含SQL_HANDLE_ENV(如果 Handle 是環境句柄 )或SQL_HANDLE_DBC(如果 Handle 是連接句柄)。
Handle是一個輸入參數,HandleType 指示的類型句柄,指示事務的范圍。
CompletionType是一個輸入參數,以下兩個值之一:SQL_COMMIT或SQL_ROLLBACK。
看一個實際的例子,在表中插入一條數據,表結構為:
Name Null? Type
----------------------------------------- -------- ----------------------------
ID NOT NULL NUMBER
F1 VARCHAR2(100)
F2 VARCHAR2(200)
F3 VARCHAR2(200)
F4 VARCHAR2(200)
插入語句為insert into test_tab1 (id, f1, f2, f3, f4) values (?, ?, ?, ?, ?),問號表示輸入參數,需要在后面綁定變量。實際的代碼如下。
#include "stdio.h" #include "stdlib.h" #include "string.h" #include "sql.h" #include "sqlext.h" #include "sqltypes.h" SQLHANDLE envh; /* env handle */ SQLHANDLE dbch; /* connect handle */ SQLHANDLE stmth; /* statement handle */ int main(int argc, char *argv[]){ int conn = 0; SQLRETURN rc; SQLLEN ind1; SQLLEN ind2; SQLLEN ind3; SQLLEN ind4; SQLLEN ind5; SQLINTEGER id; char dsn_str[32]; char usrname[32]; char passwd[32]; char sqltxt[512]; char f1[32]; char f2[32]; char f3[32]; char f4[32]; if (argc < 3) { fprintf(stderr, "usage: %s dsn username password\n", argv[0]); return (-1); } strncpy(dsn_str, argv[1], 32); dsn_str[31] = '\0'; strncpy(usrname, argv[2], 32); usrname[31] = '\0'; strncpy(passwd, argv[3], 32); passwd[31] = '\0'; rc = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &envh); if (rc != SQL_SUCCESS) { fprintf(stderr, "Allocate environment handle error.\n"); return (-1); } rc = SQLSetEnvAttr(envh, SQL_ATTR_ODBC_VERSION, (void *)SQL_OV_ODBC3, 0); if (rc != SQL_SUCCESS) { fprintf(stderr, "Set ODBC version error.\n"); goto free_exit; } rc = SQLAllocHandle(SQL_HANDLE_DBC, envh, &dbch); if (rc != SQL_SUCCESS) { fprintf(stderr, "Allocate DB connection handle error.\n"); goto free_exit; } rc = SQLSetConnectAttr(dbch, SQL_ATTR_LOGIN_TIMEOUT, (SQLPOINTER)10, 0); if (rc != SQL_SUCCESS) { fprintf(stderr, "Set connection timeout value error.\n"); goto free_exit; } rc = SQLConnect(dbch, (SQLCHAR *)dsn_str, SQL_NTS, (SQLCHAR *)usrname, SQL_NTS, (SQLCHAR *)passwd, SQL_NTS); if (rc != SQL_SUCCESS) { fprintf(stderr, "Connect to DB error.\n"); goto free_exit; } conn = 1; fprintf(stdout, "connect DB ok ......\n"); rc = SQLAllocHandle(SQL_HANDLE_STMT, dbch, &stmth); if (rc != SQL_SUCCESS) { fprintf(stderr, "Allocate statment handle error.\n"); goto free_exit; } sprintf(sqltxt, "insert into test_tab1 (id, f1, f2, f3, f4) values (?, ?, ?, ?, ?)"); rc = SQLPrepare(stmth, (SQLCHAR *)sqltxt, SQL_NTS); if (rc != SQL_SUCCESS) { fprintf(stderr, "Prepare statment error.\n"); goto free_exit; } id = 10; strcpy(f1, "AAAAAAAAAA"); strcpy(f2, "BBBBBBBBBBBB"); strcpy(f3, "CCCCCCCCCCCCCC"); strcpy(f4, "DDDDDDDDDDDDDDDD"); ind1 = 0; ind2 = SQL_NTS; ind3 = SQL_NTS; ind4 = SQL_NTS; ind5 = SQL_NTS; rc = SQLBindParameter(stmth, 1, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &id, 0, &ind1); if (rc != SQL_SUCCESS) { fprintf(stderr, "Bind column 1 error.\n"); goto free_exit; } rc = SQLBindParameter(stmth, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, 100, 0, &f1, 0, &ind2); if (rc != SQL_SUCCESS) { fprintf(stderr, "Bind column 2 error.\n"); goto free_exit; } rc = SQLBindParameter(stmth, 3, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, 200, 0, &f2, 0, &ind3); if (rc != SQL_SUCCESS) { fprintf(stderr, "Bind column 3 error.\n"); goto free_exit; } rc = SQLBindParameter(stmth, 4, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, 200, 0, &f3, 0, &ind4); if (rc != SQL_SUCCESS) { fprintf(stderr, "Bind column 4 error.\n"); goto free_exit; } rc = SQLBindParameter(stmth, 5, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, 200, 0, &f4, 0, &ind5); if (rc != SQL_SUCCESS) { fprintf(stderr, "Bind column 5 error.\n"); goto free_exit; } rc = SQLExecute(stmth); if (rc != SQL_SUCCESS) { fprintf(stderr, "Execute statment error.\n"); goto free_exit; } rc = SQLEndTran(SQL_HANDLE_DBC, dbch, SQL_COMMIT); if (rc != SQL_SUCCESS) { fprintf(stderr, "End Transaction error.\n"); goto free_exit; } fprintf(stdout, "Insert data successed ......\n"); SQLFreeHandle(SQL_HANDLE_STMT, stmth); SQLDisconnect(dbch); SQLFreeHandle(SQL_HANDLE_DBC, dbch); SQLFreeHandle(SQL_HANDLE_ENV, envh); return (0); free_exit: if (stmth != NULL) { SQLFreeHandle(SQL_HANDLE_STMT, stmth); } if (conn) { SQLDisconnect(dbch); } if (dbch != NULL) { SQLFreeHandle(SQL_HANDLE_DBC, dbch); } if (envh != NULL) { SQLFreeHandle(SQL_HANDLE_ENV, envh); } return (-1); }
如果對編程有興趣,請訪問www.tomcoding.com網站,里面有高技術含量的代碼和文檔下載。

浙公網安備 33010602011771號