ODBC API 连接 SQL SERVER---嘟嘟胖

  
//代码如下:
 
//所有的ODBC函数都以SQL开始
//#define DEBUG XXXX;
//#include <conio.h>//getch()
#include <stdio.h>
#include <afxwin.h> MFC core and standard components
#include <sqlext.h> //包含有扩展的ODBC的定义
#include <sql.h>      //包含有基本的ODBC API的定义
#include <odbcinst.h>
#pragma comment(lib, "odbc32.lib")
#pragma comment(lib, "odbccp32.lib")//SQLConfigDataSource()函数
#include <iostream.h>
#include <iomanip.h>
 
 
//#include "sqltypes.h"
//#include "sqlucode.h"
//#include "odbcss.h"
 
char *Trim( char *String ) ;
 
 
int main(int argc, char* argv[])
{
 
 SQLRETURN sr=SQL_SUCCESS; //       #define SQL_SUCCESS 0 #define SQL_SUCCESS_WITH_INFO 1
                           //      #define SQL_ERROR (-1)
 SQLHENV hEnv=0; //                分配odbc环境 
 SQLHDBC hDbc=0;//                 分配连接句柄
 SQLHSTMT hStmt;//                  分配SQL语句句柄,每次执行完成后释放
 
 //
char iID[20];//第一列
char tmJoin[20];//第二列
char szName[20];//第三列
char fTall[20];//第四列
 SQLINTEGER cbID,cbJoin,cbName,cbTall;//保存得到的数据的长度
 //
 int i=0;
 SQLCHAR    SqlState[6];
 SQLINTEGER NativeError;
 SQLCHAR ErrMsg[SQL_MAX_MESSAGE_LENGTH];
 //
 char szDSN[] = "IPMAC";//ODBC数据源
 char szUID[] = "sa"; //SQL用户
 char szPWD[] = ""; //口令
 LPCSTR svSQL="select * from IPMAC";
 
#if 1   
 //利用动态链接库Odbcinst.dll动态创建DSN
 if(SQLConfigDataSource(NULL,ODBC_ADD_SYS_DSN,"SQL Server","DSN=JSP/0Description=TestAPIODBC/0SERVER=(local)/0DATABASE=IPMAC"))
 {
 printf("32位ODBC数据源配置 Success!/n/n");
 } 
#endif
   
 sr = SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&hEnv);
#ifdef DEBUG
 if(sr==SQL_SUCCESS||sr==SQL_SUCCESS_WITH_INFO)
 {
 printf("1~~创建环境句柄SQLAllocHandle Success!/n");
 }
#endif
 
 //设定odbc版本,将ODBC设置成为版本3,否则某些ODBC API 函数不能被支持
 sr = SQLSetEnvAttr(hEnv,SQL_ATTR_ODBC_VERSION,(SQLPOINTER) SQL_OV_ODBC3,SQL_IS_INTEGER);
#ifdef DEBUG
 if(sr==SQL_SUCCESS||sr==SQL_SUCCESS_WITH_INFO)
 {
 printf("2~~SQLSetEnvAttr Success!/n");
 }
#endif
 //分配odbc连接句柄
 /*分配环境句柄后,在建立至数据源的连接之前,我们必须分配一个连接句柄,每一个到数据源的连接对应于
 一个连接句柄。首先,程序定义了一个SQLHDBC类型的变量,用于存放连接句柄,然后调用SQLAllocHandle函
 数分配句柄。如下代码所示:
    SQLHDBC hdbc;SQLAllocHandle(SQL_HANDLE_DBC,henv,&hdbc);henv为环境句柄。    */
    sr = SQLAllocHandle(SQL_HANDLE_DBC,hEnv,&hDbc);
#ifdef DEBUG
    if(sr==SQL_SUCCESS||sr==SQL_SUCCESS_WITH_INFO)
 {
      printf("3~~创建连接句柄SQL_HANDLE_DBC Success!/n");
 }
#endif
 //连接连接属性
 /*当连接句柄分配完成后,我们可以设置连接属性,所有的连接属性都有缺省值,但是我们可以通过调用函数
 SQLSetConnectAttr()来设置连接属性。用函数SQLGetConnectAttr()获取这些连接属性。函数格式如下:
 SQLRETURN SQLSetConnectAttr(SQLHDBC ConnectionHandle,SQLINTEGER Attribute,SQLPOINTER ValuePtr,SQLINTEGER StringLength);
 SQLRETURN SQLGetConnectAttr(SQLHDBC ConnectionHandle,SQLINTEGER Attribute,SQLPOINTER ValuePtr,SQLINTEGER StringLength);
    应用程序可以根据自己的需要设置不同的连接属性。*/
 sr = SQLSetConnectAttr(hDbc,SQL_ATTR_LOGIN_TIMEOUT,(void*)7,0);
#ifdef DEGUG
    if(sr==SQL_SUCCESS||sr==SQL_SUCCESS_WITH_INFO)
 {
 printf("4~~设置连接属性SQLSetConnectAttr Success!/n");
 }
#endif
 
 //连接
 /*完成对连接属性的设置之后,就可以建立到数据源的连接了。对于不同的程序和用户接口,可以用不同的函数
   建立连接:SQLConnect、SQLDriverConnect、SQLBrowseConnect。
    SQLConnect该函数提供了最为直接的程序控制方式,我们只要提供数据源名称、用户ID和口令,就可以进行
       连接了。函数格式:
SQLRETURN SQLConnect(SQLHDBC ConnectionHandle,SQLCHAR ServerName,SQLSMALLINT NameLength1,SQLCHAR UserName,SQLSMALLINT NameLength2,SQLCHAR *Authentication,SQLSMALLINT NameLength3);
参数:ConnectionHandle 连接句柄
     ServerName 数据源名称
        NameLength1 数据源名称长度
        UserName 用户ID
     NameLength2 用户ID长度
        Authentication 用户口令
        NameLength3 用户口令长度
 返回值:SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_ERROR, or SQL_INVALID_HANDLE.
 成功返回SQL_SUCCESS*/
 sr = SQLConnect(hDbc,(SQLCHAR *)szDSN, SQL_NTS,(SQLCHAR *)szUID,SQL_NTS,(SQLCHAR *)NULL,SQL_NTS);
    /*如果返回值为SQL_ERROR或SQL_SUCCESS_WITH_INFO,可以用函数SQLGetDiagRec获取相应SQLSTATE的值*/
 if(sr != SQL_SUCCESS && sr != SQL_SUCCESS_WITH_INFO)
 {
 TRACE("ERROR");
 while(SQLGetDiagRec(SQL_HANDLE_DBC,hDbc,i,SqlState, &NativeError,ErrMsg,sizeof(ErrMsg),NULL)!= SQL_NO_DATA)
   TRACE("Diag : %d SQLSTATE :%s NativeError : %d ,ErrMsg : %s/n",i ++,SqlState,NativeError,ErrMsg);
 }
 else
 {
 printf("5~~连接Connect Success!/n");
    }
 
 
//分配语句句柄sr = SQLAllocStmt(hDbc,&hStmt);SQLAllocStmt() 已被废弃,且替换为 SQLAllocHandle();
 sr=SQLAllocHandle(SQL_HANDLE_STMT, hDbc, &hStmt);
 
#ifdef DEBUG
    if(sr == SQL_SUCCESS||sr == SQL_SUCCESS_WITH_INFO)
 {
 printf("6~~分配语句句柄SQL_HANDLE_STMT Success!/n");
 }
#endif
 
//执行SQL查询语句
 sr=SQLExecDirect(hStmt,(UCHAR *)svSQL,SQL_NTS);
 
    if (sr == SQL_SUCCESS||sr == SQL_SUCCESS_WITH_INFO)
    {
        printf("7~~执行SQL查询语句SQLExecDirect Success!/n");
        printf("/n-------------get date from db-------------/n");
        //cout<<setw(20)<<"部门"<<setw(20)<<"姓名"<<setw(20)<<"职位"<<setw(20)<<"IP地址"<<endl ;
 while ((sr=SQLFetch(hStmt))!=SQL_NO_DATA)
 {
   //执行SQL语句后遍历结果集来得到数据
 
   SQLGetData(hStmt, 1, SQL_C_CHAR, &iID, 20, &cbID);
   SQLGetData(hStmt, 2, SQL_C_CHAR, tmJoin, 20, &cbJoin);//datatime类型放在SQLCHAR数组中,数组length要足够
   SQLGetData(hStmt, 3, SQL_C_CHAR, szName, 20, &cbName);
   SQLGetData(hStmt, 4, SQL_C_CHAR, &fTall, 20, &cbTall);
 // cout<<iID<<' '<<tmJoin<<' '<<szName<<' '<<fTall<<endl ;
   printf("%s %s %s %s/n",iID,tmJoin,szName,fTall);
 }
 }
 
    //释放句柄
 if(hStmt!=SQL_NULL_HANDLE)
 {
 SQLFreeHandle( SQL_HANDLE_STMT, hStmt );
     hStmt=NULL;
 }
 if(hDbc != SQL_NULL_HANDLE)
 {
 sr = SQLDisconnect(hDbc);
 SQLFreeHandle(SQL_HANDLE_DBC,hDbc);
 hDbc=NULL;
 }
 if(hEnv != SQL_NULL_HANDLE)
 {
 SQLFreeHandle(SQL_HANDLE_ENV,hEnv);
 hEnv=NULL;
 }
 //
 printf("API ODBC Success!/n");
 system("PAUSE");
 return 0;
}
 
 
 
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值