在数据库中建表,并插入数据。
CREATE DATABASE NorthWind; GO use NorthWind; CREATE TABLE CUSTOMERS( CustomerID VARCHAR(50), ContactName VARCHAR(50), Phone VARCHAR(20), ); INSERT INTO CUSTOMERS(CustomerID, ContactName, Phone)VALUES('000001', '张三', '1008611'); INSERT INTO CUSTOMERS(CustomerID, ContactName, Phone)VALUES('000002', '李四', '1008612'); INSERT INTO CUSTOMERS(CustomerID, ContactName, Phone)VALUES('000003', '王五', '1008613');
需要创建NorthWind的数据源。(省略)
1) SQLAllocHandle 申请环境句柄。 && SQLSetEnvAttr 设置环境句柄属性。
2) SQLAllocHandle 申请连接句柄。&& SQLSetConnectAttr 设置连接句柄属性。
3) SQLConnect 连接数据源。
4) SQLAllocHandle 申请语句句柄。
5) SQLExecDirect 执行语句。
6) SQLBindCol 绑定数据到缓冲区。
7) SQLFetch 获取数据。
8) SQLFreeHandle 释放语句句柄。
9) SQLDisconnect 断开与数据源的连接。
10) SQLFreeHandle 释放连接句柄。&& SQLFreeHandle 释放环境句柄。
#include <windows.h> #include <stdio.h> #include <sqlext.h> #define NAME_LEN 50 #define PHONE_LEN 20 int main() { int i; SQLHENV henv; SQLHDBC hdbc; SQLHSTMT hstmt = 0; SQLRETURN retcode; SQLWCHAR szName[NAME_LEN], szPhone[PHONE_LEN], sCustID[NAME_LEN]; SQLLEN cbName = 0, cbCustID = 0, cbPhone = 0; // 申请环境句柄 retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv); if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO){ printf("SQLAllocHandle error: %d\n", retcode); exit(1); } // 设置环境句柄属性 retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER*)SQL_OV_ODBC3, 0); if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO){ printf("SQLSetEnvAttr error: %d\n", retcode); exit(2); } // 申请连接句柄 retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc); if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO){ printf("SQLAllocHandle error: %d\n", retcode); exit(3); } // 设置连接句柄属性 retcode = SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER)5, 0); if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO){ printf("SQLSetConnectAttr error: %d\n", retcode); exit(4); } // 连接数据源NorthWind,数据库用户名sa,密码123456 retcode = SQLConnect(hdbc, (SQLWCHAR*) L"NorthWind", SQL_NTS, (SQLWCHAR*)L"sa", SQL_NTS, (SQLWCHAR*)L"123456", SQL_NTS); if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO){ printf("SQLConnect error: %d\n", retcode); exit(5); } // 申请语句句柄 retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt); if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO){ printf("SQLAllocHandle error: %d\n", retcode); exit(6); } // 执行语句 retcode = SQLExecDirect(hstmt, (SQLWCHAR *) L"SELECT CustomerID, ContactName, Phone FROM CUSTOMERS ORDER BY 2, 1, 3", SQL_NTS); if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO){ printf("SQLExecDirect error: %d\n", retcode); exit(7); } // 绑定数据到缓冲区 retcode = SQLBindCol(hstmt, 1, SQL_C_CHAR, &sCustID, 100, &cbCustID); retcode = SQLBindCol(hstmt, 2, SQL_C_CHAR, szName, NAME_LEN, &cbName); retcode = SQLBindCol(hstmt, 3, SQL_C_CHAR, szPhone, PHONE_LEN, &cbPhone); // 获取数据 for (i=0 ; ; i++) { retcode = SQLFetch(hstmt); if (retcode == SQL_ERROR || retcode == SQL_SUCCESS_WITH_INFO) { printf("SQLFetch error: %d\n", retcode); } if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) { wprintf(L"%d: %S %S %S\n", i + 1, sCustID, szName, szPhone); } else { break; } } // Process data if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) { SQLCancel(hstmt); // 释放语句句柄 SQLFreeHandle(SQL_HANDLE_STMT, hstmt); } // 断开与数据源的连接 SQLDisconnect(hdbc); // 释放连接句柄 SQLFreeHandle(SQL_HANDLE_DBC, hdbc); // 释放环境句柄 SQLFreeHandle(SQL_HANDLE_ENV, henv); return 0; }
1) 需要设置数据源。
2) 注意字符编码问题。
---
来源: forget