ODBC執行存儲過程例子

#include <stdio.h> #include <Windows.h> #include <stdlib.h> #include <sql.h> #include <sqlext.h> #include <string.h> #include <windows.h> #include <sqlext.h> #define STR_LEN 128 + 1 #define REM_LEN 254 + 1 // Declare buffers for result set data SQLCHAR szSchema[STR_LEN]; SQLCHAR szCatalog[STR_LEN]; SQLCHAR szColumnName[STR_LEN]; SQLCHAR szTableName[STR_LEN]; SQLCHAR szTypeName[STR_LEN]; SQLCHAR szRemarks[REM_LEN]; SQLCHAR szColumnDefault[STR_LEN]; SQLCHAR szIsNullable[STR_LEN]; SQLINTEGER ColumnSize; SQLINTEGER BufferLength; SQLINTEGER CharOctetLength; SQLINTEGER OrdinalPosition; SQLSMALLINT DataType; SQLSMALLINT DecimalDigits; SQLSMALLINT NumPrecRadix; SQLSMALLINT Nullable; SQLSMALLINT SQLDataType; SQLSMALLINT DatetimeSubtypeCode; // Declare buffers for bytes available to return SQLINTEGER cbCatalog; SQLINTEGER cbSchema; SQLINTEGER cbTableName; SQLINTEGER cbColumnName; SQLINTEGER cbDataType; SQLINTEGER cbTypeName; SQLINTEGER cbColumnSize; SQLLEN cbBufferLength; SQLINTEGER cbDecimalDigits; SQLINTEGER cbNumPrecRadix; SQLINTEGER cbNullable; SQLINTEGER cbRemarks; SQLINTEGER cbColumnDefault; SQLINTEGER cbSQLDataType; SQLINTEGER cbDatetimeSubtypeCode; SQLINTEGER cbCharOctetLength; SQLINTEGER cbOrdinalPosition; SQLINTEGER cbIsNullable; //https://support.huaweicloud.com/devg-dws/dws_04_0123.html //#define RESULT_LEN 256 // //#define CHECK_ERROR(e, s, h, t) ({\ // if (e!=SQL_SUCCESS && e != SQL_SUCCESS_WITH_INFO) {extract_error(s, h, t); goto exit;} \ //}) // // void extract_error(const char *fn, SQLHANDLE handle, SQLSMALLINT type) { SQLINTEGER i = 0; SQLINTEGER NativeError; SQLCHAR SQLState[7]; SQLCHAR MessageText[256]; SQLSMALLINT TextLength; SQLRETURN ret; fprintf(stderr, "\nThe driver reported the following error %s\n", fn); do { ret = SQLGetDiagRec(type, handle, ++i, (SQLCHAR*)SQLState, &NativeError, (SQLCHAR*)MessageText, sizeof(MessageText), &TextLength); if (SQL_SUCCEEDED(ret)) { printf("%s:%ld:%ld:%s\n", SQLState, (long)i, (long)NativeError, MessageText); } } while (ret == SQL_SUCCESS); } //int main() { // // SQLHENV henv = SQL_NULL_HENV; // Environment // SQLHDBC hdbc = SQL_NULL_HDBC; // Connection handle // SQLHSTMT hstmt = SQL_NULL_HSTMT; // Statement handle // SQLRETURN retcode; // SQLCHAR strResult[RESULT_LEN]; // SQLCHAR outstr[1024]; // SQLSMALLINT outstrlen; // int i = 0; // // Allocate environment handle // retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv); // /*CHECK_ERROR(retcode, "SQLAllocHandle(SQL_HANDLE_ENV)", // henv, SQL_HANDLE_ENV); //*/ // // Set the ODBC version environment attribute // retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, // (SQLPOINTER*)SQL_OV_ODBC3, 0); // extract_error("SQLSetEnvAttr(SQL_ATTR_ODBC_VERSION)", henv, SQL_HANDLE_ENV); // //CHECK_ERROR(retcode, "SQLSetEnvAttr(SQL_ATTR_ODBC_VERSION)", // /* henv, SQL_HANDLE_ENV);*/ // // Allocate connection handle // retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc); // /*CHECK_ERROR(retcode, "SQLAllocHandle(SQL_HANDLE_DBC)", // hdbc, SQL_HANDLE_DBC);*/ // // Set login timeout to 5 seconds // //SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER)5, 0); // /*CHECK_ERROR(retcode, "SQLSetConnectAttr(SQL_LOGIN_TIMEOUT)", // hdbc, SQL_HANDLE_DBC);*/ // // Connect to data source // retcode = SQLDriverConnect(hdbc, NULL, (SQLCHAR*)"Driver=ODBC Driver 17 for SQL Server;Server=127.0.0.1;Uid=sa;Pwd=123456;database=WHQJAccountsDB", SQL_NTS, outstr, sizeof(outstr), &outstrlen, SQL_DRIVER_NOPROMPT); // // Allocate statement handle // retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt); // //CHECK_ERROR(retcode, "SQLAllocHandle(SQL_HANDLE_STMT)", // // hstmt, SQL_HANDLE_STMT); // retcode = SQLExecDirect(hstmt, // (SQLCHAR*) "SELECT @@Version", SQL_NTS); // //CHECK_ERROR(retcode, "SQLExecDirect()", hstmt, SQL_HANDLE_STMT); // // // Bind columns // // retcode = SQLBindCol(hstmt, 1, SQL_C_CHAR, &strResult, RESULT_LEN, 0); // // // // Fetch and print each row of data until SQL_NO_DATA returned. // for (i = 0; ; i++) { // retcode = SQLFetch(hstmt); // if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) { // printf("Result is: %s", strResult); // } // else { // if (retcode != SQL_NO_DATA) { // /* CHECK_ERROR(retcode, "SQLFetch()", hstmt, SQL_HANDLE_STMT);*/ // } // else { // break; // } // } // } // //exit: // // printf("\nComplete.\n"); // // Free handles // // Statement // if (hstmt != SQL_NULL_HSTMT) // SQLFreeHandle(SQL_HANDLE_STMT, hstmt); // // Connection // if (hdbc != SQL_NULL_HDBC) { // SQLDisconnect(hdbc); // SQLFreeHandle(SQL_HANDLE_DBC, hdbc); // } // // Environment // if (henv != SQL_NULL_HENV) // SQLFreeHandle(SQL_HANDLE_ENV, henv); // return 0; //} SQLHDESC hIpd = NULL; SQLHENV henv = NULL; SQLHDBC hdbc = NULL; SQLRETURN retcode; SQLHSTMT hstmt = NULL; SQLCHAR szQuote[50] = "9"; SQLINTEGER cbValue = SQL_NTS; int main() { retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv); retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER*)SQL_OV_ODBC3, 0); retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc); retcode = SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER)5, 0); //retcode = SQLConnect(hdbc, (SQLCHAR*) "Driver=ODBC Driver 17 for SQL Server;Server=127.0.0.1;Uid=sa;Pwd=123456;database=WHQJAccountsDB", SQL_NTS, (SQLCHAR*)NULL, 0, NULL, 0); SQLCHAR outstr[1024]; SQLSMALLINT outstrlen; retcode = SQLDriverConnect(hdbc, NULL, (SQLCHAR*)"Driver=ODBC Driver 17 for SQL Server;Server=127.0.0.1;Uid=sa;Pwd=123456;database=WHQJAccountsDB", SQL_NTS, outstr, sizeof(outstr), &outstrlen, SQL_DRIVER_NOPROMPT); retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt); retcode = SQLPrepare(hstmt, (SQLCHAR*)"{call SQLBindParameter(?)}", SQL_NTS); int len = 10; //retcode = SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_NUMERIC, 4, 0, &len, sizeof(len), &cbValue); ///*retcode = SQLGetStmtAttr(hstmt, SQL_ATTR_IMP_PARAM_DESC, &hIpd, 0, 0); //retcode = SQLSetDescField(hIpd, 1, SQL_DESC_NAME, "@dwUserID", SQL_NTS);*/ //retcode = SQLBindParameter(hstmt, 2, SQL_PARAM_OUTPUT, SQL_C_CHAR, SQL_CHAR, 50, 0, szQuote, 0, &cbValue); ////retcode = SQLGetStmtAttr(hstmt, SQL_ATTR_IMP_PARAM_DESC, &hIpd, 0, 0); ////retcode = SQLSetDescField(hIpd, 2, SQL_DESC_NAME, "@strErrorDescribe", SQL_NTS); /*retcode = SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, 50, 0, szQuote, 0, &cbValue); retcode = SQLGetStmtAttr(hstmt, SQL_ATTR_IMP_PARAM_DESC, &hIpd, 0, 0); retcode = SQLSetDescField(hIpd, 2, SQL_DESC_NAME, "@strErrorDescribe", SQL_NTS);*/ retcode = SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, 50, 0, szQuote, 0, &cbValue); retcode = SQLGetStmtAttr(hstmt, SQL_ATTR_IMP_PARAM_DESC, &hIpd, 0, 0); retcode = SQLSetDescField(hIpd, 1, SQL_DESC_NAME, "@UserID", SQL_NTS); //retcode = SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, 50, 0, szQuote, 0, &cbValue); //retcode = SQLGetStmtAttr(hstmt, SQL_ATTR_IMP_PARAM_DESC, &hIpd, 0, 0); //retcode = SQLSetDescField(hIpd, 2, SQL_DESC_NAME, "@dwUserID", SQL_NTS); retcode = SQLExecute(hstmt); /*SQLLEN rowsCount = 0; retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt); retcode = SQLRowCount(hstmt, &rowsCount);*/ /*SQLCHAR szColumnName[REM_LEN]; SQLINTEGER cbColumnName; SQLBindCol(hstmt, 1, SQL_C_WCHAR, szColumnName, REM_LEN , &cbColumnName); while ((retcode = SQLFetch(hstmt)) == SQL_SUCCESS) { printf("%s", szColumnName); }*/ while ((SQLFetch(hstmt)) != SQL_NO_DATA_FOUND) { SQLLEN Strlen_or_IndPtr = 0; char typename2[100]; SQLColAttribute(hstmt, 1, SQL_DESC_TYPE_NAME, typename2, sizeof(typename2), NULL, NULL); printf("SQLColAtrribute %s\n", typename2); SQLCHAR t1[32], t2[255], t3[255]; retcode = SQLGetData(hstmt, 1, SQL_C_ULONG, &t1, 32, &Strlen_or_IndPtr); retcode = SQLGetStmtAttr(hstmt, SQL_ATTR_IMP_ROW_DESC, &hIpd, 0, 0); retcode = SQLGetDescField(hIpd, 1, SQL_DESC_NAME, &t2, 255, &Strlen_or_IndPtr); printf("%s", t1); retcode = SQLGetData(hstmt, 2, SQL_C_DEFAULT, &t2, 255, &Strlen_or_IndPtr); retcode = SQLGetStmtAttr(hstmt, SQL_ATTR_IMP_ROW_DESC, &hIpd, 0, 0); retcode = SQLGetDescField(hIpd, 2, SQL_DESC_NAME, &t2, 255, &Strlen_or_IndPtr); retcode = SQLGetData(hstmt, 3, SQL_C_DEFAULT, &t3, 255, &Strlen_or_IndPtr); } //retcode = SQLGetData(myStatementHandle, 1, SQL_C_DEFAULT, &t1, 32, &Strlen_or_IndPtr); // 獲取結果集中列數據 //retcode = SQLGetData(myStatementHandle, 2, SQL_C_DEFAULT, &t2, 255, &Strlen_or_IndPtr); //retcode = SQLGetData(myStatementHandle, 3, SQL_C_DEFAULT, &t3, 255, &Strlen_or_IndPtr); extract_error("SQLExecute", henv, SQL_HANDLE_ENV); return 0; }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章