為了節省時間,我就引用上一節的數據庫的表和C語言的結構體數組,在結構體數組中添加數據,清空數據庫數據。
第一步查詢:SQLBindParameter函數的用法。
SQLRETURN SQLBindParameter( SQLHSTMT StatementHandle, // statement句柄 SQLUSMALLINT ParameterNumber, // 參數位於語句中的序號,最小為1 SQLSMALLINT InputOutputType, // 入參/出參類型標識[1] SQLSMALLINT ValueType, // 對應的C數據類型標識[2] SQLSMALLINT ParameterType, // 對應的SQL數據類型標識[2] SQLULEN ColumnSize, // 對應字段長度 SQLSMALLINT DecimalDigits, // 如果是浮點數,則對應字段精度 SQLPOINTER ParameterValuePtr, // 參數緩存 SQLLEN BufferLength, // 參數緩存字節數 SQLLEN * StrLen_or_IndPtr); // 用於表示字符串長度或NULL值的標識[3]
注意:
1、在ODBC中,整型的SQL_INTEGER類型對應的C語言數據類型標識是SQL_C_LONG,而不是SQL_C_INT,並且沒有SQL_C_INT這種類型。
2、在存入整型的數據時,SQLPOINTER ParameterValuePtr 應該要加取地址符‘&’。
3、SQLUSMALLINT ParameterNumber 這個參數不能隨便寫,要與建表時的順序相同。
第二步:寫添加數據的函數。
void workertianjiashuju(int i) { SQLRETURN ret; SQLHENV henv;//SQLHANDLE henv SQLHDBC hdbc;//SQLHANDLE hdbc SQLHSTMT hstmt;//SQLHANDLE hstmt ret=SQLAllocHandle(SQL_HANDLE_ENV,NULL,&henv);//申請環境句柄 ret=SQLSetEnvAttr(henv,SQL_ATTR_ODBC_VERSION,(SQLPOINTER)SQL_OV_ODBC3,SQL_IS_INTEGER);//設置環境屬性 ret=SQLAllocHandle(SQL_HANDLE_DBC,henv,&hdbc);//申請數據庫連接句柄 ret=SQLConnect(hdbc,(SQLCHAR*)"phonesql",SQL_NTS,(SQLCHAR*)"sa",SQL_NTS,(SQLCHAR*)"123456",SQL_NTS);//連接數據庫 if(ret==SQL_SUCCESS || ret==SQL_SUCCESS_WITH_INFO){ ret=SQLAllocHandle(SQL_HANDLE_STMT,hdbc,&hstmt);//申請SQL語句句柄 SQLCHAR sql[]="INSERT INTO worker VALUES (?,?,?,?,?,?,?,?,?,?);"; SQLINTEGER P = SQL_NTS; ret=SQLPrepare(hstmt,sql,SQL_NTS); ret=SQLBindParameter(hstmt,1,SQL_PARAM_INPUT,SQL_C_LONG,SQL_INTEGER,0,0,&gong[i].num,0,&P);//綁定參數 ret=SQLBindParameter(hstmt,2,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,20,0,gong[i].name,20,&P);//綁定參數 ret=SQLBindParameter(hstmt,3,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,10,0,gong[i].sex,10,&P);//綁定參數 ret=SQLBindParameter(hstmt,4,SQL_PARAM_INPUT,SQL_C_LONG,SQL_INTEGER,0,0,&gong[i].age,0,&P);//綁定參數 ret=SQLBindParameter(hstmt,5,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,20,0,gong[i].shenfennum,20,&P); ret=SQLBindParameter(hstmt,6,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,10,0,gong[i].xueli,10,&P); ret=SQLBindParameter(hstmt,7,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,10,0,gong[i].mianmao,10,&P); ret=SQLBindParameter(hstmt,8,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,20,0,gong[i].mima,20,&P); ret=SQLBindParameter(hstmt,9,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,10,0,gong[i].quanxian,10,&P); ret=SQLBindParameter(hstmt,10,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,20,0,gong[i].born,20,&P); ret=SQLExecute(hstmt);//直接執行SQL語句 if(ret==SQL_SUCCESS || ret==SQL_SUCCESS_WITH_INFO){ /*****************測試結構體數組********************/ printf("添加第%d條信息成功!\n",i+1); SQLFreeHandle(SQL_HANDLE_STMT,hstmt);//釋放語句句柄 }else printf("添加數據庫操作失敗!\n"); SQLDisconnect(hdbc);//斷開與數據庫的連接 } else printf("連接數據庫失敗!\n"); SQLFreeHandle(SQL_HANDLE_DBC,hdbc);//釋放連接句柄 SQLFreeHandle(SQL_HANDLE_ENV,henv);//釋放環境句柄 }
注意:SQLCHAR sql[]="INSERT INTO worker VALUES (?,?,?,?,?,?,?,?,?,?);"; 這個語句中的’?’表示要添加的數據。(添加多少個數據,就寫多少個問號)
第三步:寫主函數調用,代碼略。
完成後,數據庫中的數據變為