使用 SQLConnect 進行連線
SQLConnect 是最簡單的連線函式。 該函式需要資料來源名稱,並接受選擇性的使用者識別碼和密碼。 其適用於將資料來源名稱硬式編碼且不需要使用者識別碼或密碼的應用程式。 也適用於想要控制自己的「外觀和風格」或沒有使用者介面的應用程式。 這類應用程式可使用 SQLDataSources 建立資料來源的清單、提示使用者輸入資料來源、使用者識別碼和密碼,然後呼叫 SQLConnect。
下列範例會使用名為 Northwind 的 DSN 連線到 Northwind 資料庫,並從 Employees 資料表中的所有記錄擷取所有名字和姓氏欄位。
// Connecting_with_SQLConnect.cpp
// compile with: user32.lib odbc32.lib
#include <windows.h>
#include <sqlext.h>
#include <mbstring.h>
#include <stdio.h>
#define MAX_DATA 100
#define MYSQLSUCCESS(rc) ((rc == SQL_SUCCESS) || (rc == SQL_SUCCESS_WITH_INFO) )
class direxec {
RETCODE rc; // ODBC return code
HENV henv; // Environment
HDBC hdbc; // Connection handle
HSTMT hstmt; // Statement handle
unsigned char szData[MAX_DATA]; // Returned data storage
SDWORD cbData; // Output length of data
unsigned char chr_ds_name[SQL_MAX_DSN_LENGTH]; // Data source name
public:
direxec(); // Constructor
void sqlconn(); // Allocate env, stat, and conn
void sqlexec(unsigned char *); // Execute SQL statement
void sqldisconn(); // Free pointers to env, stat, conn, and disconnect
void error_out(); // Displays errors
};
// Constructor initializes the string chr_ds_name with the data source name.
// "Northwind" is an ODBC data source (odbcad32.exe) name whose default is the Northwind database
direxec::direxec() {
_mbscpy_s(chr_ds_name, SQL_MAX_DSN_LENGTH, (const unsigned char *)"Northwind");
}
// Allocate environment handle and connection handle, connect to data source, and allocate statement handle.
void direxec::sqlconn() {
SQLAllocEnv(&henv);
SQLAllocConnect(henv, &hdbc);
rc = SQLConnect(hdbc, chr_ds_name, SQL_NTS, NULL, 0, NULL, 0);
// Deallocate handles, display error message, and exit.
if (!MYSQLSUCCESS(rc)) {
SQLFreeConnect(henv);
SQLFreeEnv(henv);
SQLFreeConnect(hdbc);
if (hstmt)
error_out();
exit(-1);
}
rc = SQLAllocStmt(hdbc, &hstmt);
}
// Execute SQL command with SQLExecDirect() ODBC API.
void direxec::sqlexec(unsigned char * cmdstr) {
rc = SQLExecDirect(hstmt, cmdstr, SQL_NTS);
if (!MYSQLSUCCESS(rc)) { //Error
error_out();
// Deallocate handles and disconnect.
SQLFreeStmt(hstmt,SQL_DROP);
SQLDisconnect(hdbc);
SQLFreeConnect(hdbc);
SQLFreeEnv(henv);
exit(-1);
}
else {
for ( rc = SQLFetch(hstmt) ; rc == SQL_SUCCESS ; rc=SQLFetch(hstmt) ) {
SQLGetData(hstmt, 1, SQL_C_CHAR, szData, sizeof(szData), &cbData);
// In this example, the data is sent to the console; SQLBindCol() could be called to bind
// individual rows of data and assign for a rowset.
printf("%s\n", (const char *)szData);
}
}
}
// Free the statement handle, disconnect, free the connection handle, and free the environment handle.
void direxec::sqldisconn() {
SQLFreeStmt(hstmt,SQL_DROP);
SQLDisconnect(hdbc);
SQLFreeConnect(hdbc);
SQLFreeEnv(henv);
}
// Display error message in a message box that has an OK button.
void direxec::error_out() {
unsigned char szSQLSTATE[10];
SDWORD nErr;
unsigned char msg[SQL_MAX_MESSAGE_LENGTH + 1];
SWORD cbmsg;
while (SQLError(0, 0, hstmt, szSQLSTATE, &nErr, msg, sizeof(msg), &cbmsg) == SQL_SUCCESS) {
sprintf_s((char *)szData, sizeof(szData), "Error:\nSQLSTATE=%s, Native error=%ld, msg='%s'", szSQLSTATE, nErr, msg);
MessageBox(NULL, (const char *)szData, "ODBC Error", MB_OK);
}
}
int main () {
direxec x; // Declare an instance of the direxec object.
x.sqlconn(); // Allocate handles, and connect.
x.sqlexec((UCHAR FAR *)"SELECT FirstName, LastName FROM employees"); // Execute SQL command
x.sqldisconn(); // Free handles and disconnect
}