用ODBC实现文本和多媒体字段的数据库插入和读取

本文介绍使用ODBC实现数据库中文本及多媒体字段的插入操作。通过C++代码示例详细展示了如何初始化环境、连接数据库、执行SQL语句以及处理结果集等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

// 用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]='
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值