// 用ODBC实现了文本和多媒体字段的插入。#include "stdafx.h"#include <windows.h> #include <stdio.h> #include <sql.h> #include <sqltypes.h> #include <sqlext.h> #include <fstream>#include <iostream>#include "string.h"using namespace std;HENV henv; // 环境句柄 HDBC hdbc; // 连接句柄 // 初始化void initlize(void) ...{ // 申请环境句柄 SQLAllocHandle(SQL_HANDLE_ENV, NULL, &henv); //设置环境句柄属性 SQLSetEnvAttr(henv,SQL_ATTR_ODBC_VERSION,(SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER); // 申请连接句柄 SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc); } // 资源销毁 void destrory(void) ...{ // 释放连接句柄和环境句柄 SQLFreeHandle(SQL_HANDLE_DBC, hdbc); SQLFreeHandle(SQL_HANDLE_ENV, henv); } // 连接数据源 int connect_to_dsn(char * dsn, char * uid, char * pwd) ...{ RETCODE ret = SQL_SUCCESS; // 用最基本的SQLConnect方法连接ODBC数据源,连接成功返回1,否则为-1 ret = SQLConnect(hdbc, (SQLCHAR *)dsn, SQL_NTS, (SQLCHAR *)uid, SQL_NTS, (SQLCHAR *)pwd, SQL_NTS); if (ret!= SQL_SUCCESS || ret!=SQL_SUCCESS_WITH_INFO) return -1; else return 1; } // 断开数据源 int disconnect_from_dsn(void) ...{ RETCODE ret = SQL_SUCCESS; // 调用函数SQLDisconnect关闭所有的连接,成功返回1,否则返回-1 ret = SQLDisconnect(hdbc); if (ret!= SQL_SUCCESS&& ret!= SQL_SUCCESS_WITH_INFO) return -1; else return 1; } // 错误信息的处理 void display_error(HSTMT stmt) ...{ short recnumber = 1; unsigned char sqlstate[6]; long nativeerror; unsigned char messagetext[256]; RETCODE ret=SQL_SUCCESS; for ( ; ; ) ...{ //调用函数SQLGetDiagRec诊断错误,并打印错误代码,类型等 ret=SQLGetDiagRec(SQL_HANDLE_STMT, stmt, recnumber, sqlstate, &nativeerror, messagetext, 256, NULL); if (ret == SQL_NO_DATA_FOUND) break; printf("SQLSTATE: %s NATIVE: %d MESSAGE: %s", sqlstate, nativeerror, messagetext); recnumber = recnumber + 1; } } // 显示指定表的数据 int display_data(char * tablename) ...{ HSTMT stmt; char sql[256]; char colname[120]; short cols = 0; short i = 0; int lgid[1]; long clgid; char lgname[20]; long clgname; int lgscore[1]; long clgscore; DATE_STRUCT lgdate[1];//为什么要用数组 long clgdate; char lgcomment[10]=...{0}; long clgcomment; RETCODE ret = SQL_SUCCESS,ret1 = SQL_SUCCESS; //申请语句句柄,失败返回-1,成功则继续执行程序 ret = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &stmt); if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) return -1; //调用函数SQLExecDirect立即执行 sprintf(sql, "select * from %s;", tablename); ret = SQLExecDirect(stmt, (SQLCHAR *)sql, SQL_NTS); if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) ...{ display_error(stmt); SQLFreeHandle(SQL_HANDLE_STMT, stmt); return -1; } //返回结果集中列的数目 SQLNumResultCols(stmt, &cols); // 打印查询结果集的标题信息 for (i=1; i<=cols; i++) ...{ SQLDescribeCol(stmt, i, (SQLCHAR *)colname, 120, NULL, NULL, NULL, NULL, NULL); printf(" %s", colname); printf(" "); } printf(" "); //采用SQLGetData的方法取得数据打印显示 for ( ; ; ) ...{ //在结果集中检索下一行元组 ret = SQLFetch(stmt); if (ret == SQL_NO_DATA_FOUND) break; //返回结果集中当前行第一列的值,存在就打印,否则就打印NULL。 SQLGetData(stmt, 1, SQL_C_SLONG, lgid, 4, &clgid); if (clgid == SQL_NULL_DATA) printf("NULL"); else printf("%d",lgid[0]); printf(" "); //返回结果集中当前行第二列的值,存在就打印,否则就打印NULL。 SQLGetData(stmt, 2, SQL_C_CHAR, lgname, 20, &clgname); if (clgname == SQL_NULL_DATA) printf("NULL"); else printf(" %s",lgname); printf(" "); //返回结果集中当前行第三列的值,存在就打印,否则就打印NULL。 SQLGetData(stmt,3, SQL_C_SLONG, lgscore, 4, &clgscore); if (clgscore == SQL_NULL_DATA) printf("NULL"); else printf(" %d",*lgscore); printf(" "); //返回结果集中当前行第四列的值,存在就打印,否则就打印NULL。 SQLGetData(stmt,4, SQL_C_TYPE_DATE, lgdate, 20, &clgdate); if (clgdate == SQL_NULL_DATA) printf("NULL"); else printf(" %d-%d-%d",lgdate[0].year,lgdate[0].month,lgdate[0].day); printf(" "); //利用函数SQLGetData取出长数据 /**//* while((ret1=SQLGetData(stmt,5, SQL_C_BINARY, lgcomment, sizeof(lgcomment),&clgcomment))!=SQL_NO_DATA) { clgcomment = (clgcomment > 80) || (clgcomment == SQL_NO_TOTAL) ?80 :clgcomment; if (clgcomment == SQL_NO_TOTAL) printf("NULL"); else printf(" %s",lgcomment); printf(" "); } */ ret1=SQLGetData(stmt,5, SQL_C_BINARY, lgcomment, sizeof(lgcomment),&clgcomment); if (clgcomment == SQL_NO_TOTAL) printf("NULL"); else ...{ lgcomment[9]='