C语言 ODBC 方法访问数据库

1. 在数据库中添加数据

在数据库中建表,并插入数据。

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');

2. 创建数据源 

需要创建NorthWind的数据源。(省略)

3. C语言代码实现 

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


你可能感兴趣的:(c,odbc)