#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;
}
ODBC執行存儲過程例子
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.