Advertisement
Guest User

Untitled

a guest
May 30th, 2016
44
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.60 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. #include <Windows.h>
  4.  
  5. // Required header:
  6. #include <sql.h>
  7. #include <sqltypes.h>
  8. #include <sqlext.h>
  9.  
  10. void HandleDiagnosticRecord(SQLHANDLE hHandle,
  11. SQLSMALLINT hType,
  12. RETCODE RetCode);
  13.  
  14. int main()
  15. {
  16. SQLHENV hEnv;
  17. SQLHDBC hDbc;
  18. SQLHSTMT hStmt;
  19.  
  20. SQLWCHAR * dsnName = L"sqlODBC";
  21. SQLCHAR * userID = (SQLCHAR *)"";
  22. SQLCHAR * pswd = (SQLCHAR *)"";
  23. SQLWCHAR * stmt = L"select * from tb1";
  24.  
  25. if (SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hEnv) != SQL_SUCCESS) {
  26. std::cout << "Alloc handle error: SQL_HANDLE_ENV" << std::endl;
  27. exit(1);
  28. }
  29. if (SQLSetEnvAttr(hEnv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0) != SQL_SUCCESS) {
  30. std::cout << "Set Attribute error: SQL_HANDLE_ENV" << std::endl;
  31. exit(1);
  32. }
  33.  
  34. if (SQLAllocHandle(SQL_HANDLE_DBC, hEnv, &hDbc) != SQL_SUCCESS) {
  35. std::cout << "Alloc handle error: SQL_HANDLE_DBC" << std::endl;
  36. exit(1);
  37. }
  38. SQLSetConnectAttr(hDbc, 5, (SQLPOINTER)SQL_LOGIN_TIMEOUT, 0);
  39. if (RETCODE errmsg = SQLConnect(hDbc, dsnName, SQL_NTS, (SQLWCHAR*)userID, SQL_NTS, (SQLWCHAR*)pswd, SQL_NTS) == SQL_ERROR) // ok
  40. //if (RETCODE errmsg = SQLDriverConnect(hDbc, GetDesktopWindow(), L"", SQL_NTS, NULL, 0, NULL, SQL_DRIVER_COMPLETE) == SQL_ERROR) // ok
  41. // connection이 성공 시 SQL_SUCCESS, 혹은 SQL_SUCCESS_WITH_INFO 반환.
  42. {
  43. std::cout << "DB connection error." << std::endl;
  44. switch (errmsg) {
  45. case SQL_ERROR:
  46. std::cout << "SQL_ERROR" << std::endl;
  47. break;
  48. case SQL_SUCCESS_WITH_INFO:
  49. std::cout << "SQL_SUCCESS_WITH_INFO" << std::endl;
  50. break;
  51. case SQL_INVALID_HANDLE:
  52. std::cout << "SQL_INVALID_HANDLE" << std::endl;
  53. break;
  54. default:
  55. std::cout << "etc error" << std::endl;
  56. break;
  57. }
  58. HandleDiagnosticRecord(hDbc, SQL_HANDLE_DBC, errmsg);
  59. exit(1);
  60. }
  61.  
  62. SQLAllocHandle(SQL_HANDLE_STMT, hDbc, &hStmt);
  63. //RETCODE RetCode = SQLExecDirect(hStmt, (SQLWCHAR*)stmt, SQL_NTS); // error 42000: systax error (stmt should be given in wchar(L"~") type.)
  64. //RETCODE RetCode = SQLExecDirect(hStmt, stmt, SQL_NTS); // ok (stmt type changed to wchar(L"~") type.)
  65. RETCODE RetCode = SQLExecDirect(hStmt, L"SELECT * FROM tb1", SQL_NTS); // ok
  66. // 성공 시 SQL_SUCCESS 반환
  67.  
  68. switch (RetCode)
  69. {
  70. case SQL_SUCCESS_WITH_INFO:
  71. {
  72. std::cout << "SQL_SUCCESS_WITH_INFO" << std::endl;
  73. HandleDiagnosticRecord(hStmt, SQL_HANDLE_STMT, RetCode);
  74. // fall through
  75. }
  76. case SQL_SUCCESS:
  77. {
  78. std::cout << "SQLExecDirect(..) success!" << std::endl;
  79.  
  80. SQLSMALLINT num;
  81. std::cout << "SQLNumResultCols: " << SQLNumResultCols(hStmt, &num) << std::endl;
  82. std::cout << "num: " << num << std::endl;
  83. break;
  84. }
  85.  
  86. case SQL_ERROR:
  87. {
  88. std::cout << "SQL_ERROR" << std::endl;
  89. HandleDiagnosticRecord(hStmt, SQL_HANDLE_STMT, RetCode);
  90. break;
  91. }
  92.  
  93. default:
  94. fwprintf(stderr, L"Unexpected return code %hd!\n", RetCode);
  95.  
  96. }
  97.  
  98. SQLFreeHandle(SQL_HANDLE_STMT, hStmt);
  99. SQLFreeHandle(SQL_HANDLE_DBC, hDbc);
  100. SQLFreeHandle(SQL_HANDLE_ENV, hEnv); //End the connection
  101.  
  102. std::cout << "Program ends." << std::endl;
  103.  
  104. return 0;
  105. }
  106.  
  107. void HandleDiagnosticRecord(SQLHANDLE hHandle,
  108. SQLSMALLINT hType,
  109. RETCODE RetCode)
  110. {
  111. SQLSMALLINT iRec = 0;
  112. SQLINTEGER iError;
  113. WCHAR wszMessage[1000];
  114. WCHAR wszState[SQL_SQLSTATE_SIZE + 1];
  115.  
  116. if (RetCode == SQL_INVALID_HANDLE)
  117. {
  118. fwprintf(stderr, L"Invalid handle!\n");
  119. return;
  120. }
  121.  
  122. while (SQLGetDiagRec(hType,
  123. hHandle,
  124. ++iRec,
  125. wszState,
  126. &iError,
  127. wszMessage,
  128. (SQLSMALLINT)(sizeof(wszMessage) / sizeof(WCHAR)),
  129. (SQLSMALLINT *)NULL) == SQL_SUCCESS)
  130. {
  131. // Hide data truncated..
  132. if (wcsncmp(wszState, L"01004", 5))
  133. {
  134. fwprintf(stderr, L"[%5.5s] %s (%d)\n", wszState, wszMessage, iError);
  135. }
  136. }
  137. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement