加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

C++ ODBC类库

(2005-05-26 11:43:30)
标签:

杂谈

分类: MSN搬家

#ifndef _ODBC_H
#define _ODBC_H
#include "windows.h"
#include "sql.h"
#include "sqlext.h"
#include <string>
using namespace std;

class CODBCConnect
{
 SQLHANDLE  m_hEnv;
 SQLHANDLE  m_hCon;
 SQLHANDLE m_hStmt;
 char szTmpField[65535];

 int m_nCurField;
 int m_nCurRow;
 bool CreateStmtHandle();
public:
 CODBCConnect();
 ~CODBCConnect();
 bool Create();
 bool Connect(const string &datasource,const string &user="",const string &pwd="");

 bool Reset();
 bool Execute(char *src);
 long FetchMaxIdentity(char* tablename);
 bool FetchNextRow();
 char *FetchNextField();
 long GetFieldNum();
};
#endif

#include "odbc.h"
#include "string.h"
#include "stdlib.h"
#include "stdio.h"

static SQLHANDLE    g_hEnv=NULL;

SQLHANDLE GetEnvHandle()
{
 if(g_hEnv!=NULL)
 {
  return g_hEnv;
 }
 SQLAllocHandle(SQL_HANDLE_ENV,NULL,&g_hEnv);
 SQLSetEnvAttr(g_hEnv,SQL_ATTR_ODBC_VERSION,(void*)SQL_OV_ODBC3,0);
 return g_hEnv;
}

CODBCConnect::CODBCConnect()
{
 m_hEnv=NULL;
 m_hCon=NULL;
 m_hStmt=NULL;
 m_nCurRow=m_nCurField=0;
}

CODBCConnect::~CODBCConnect()
{
 if(m_hStmt!=NULL)
 {
  SQLFreeHandle(SQL_HANDLE_STMT,m_hStmt);
 }
 if(m_hCon!=NULL)
 {
  SQLFreeHandle(SQL_HANDLE_DBC,m_hCon);
 }

}

bool CODBCConnect::Create()
{
 if(m_hCon!=NULL)
  CloseHandle(m_hCon);
 m_hEnv = GetEnvHandle();
 SQLRETURN ret;
 ret=SQLAllocHandle(SQL_HANDLE_DBC,m_hEnv,&m_hCon);
 if(ret==SQL_ERROR || ret==SQL_INVALID_HANDLE)
 {
  return false;
 }
 return true;
}

bool CODBCConnect::Connect(const string &server,const string &usr,const string &pwd)
{
 if(m_hCon==NULL)
 {
  if(!Create())
   return false;
 }
 SQLCHAR servername[64];
 SQLCHAR user[64];
 SQLCHAR password[64];
 strcpy((char*)servername,server.c_str());
 strcpy((char*)user,usr.c_str());
 strcpy((char*)password,pwd.c_str());

 SQLSMALLINT server_len = strlen((char*)servername);
 SQLSMALLINT user_len = strlen((char*)user);
 SQLSMALLINT pass_len = strlen((char*)password);

 SQLRETURN ret = SQLConnect(m_hCon,servername,server_len,user,user_len,password,pass_len);
 if ((ret != SQL_SUCCESS) && (ret != SQL_SUCCESS_WITH_INFO))
 {
  return false;
 }
 else
 {
  return true;
 }

 return true;
}


bool CODBCConnect::CreateStmtHandle()
{
 if(m_hCon==NULL)
 
  return false;
 }

 SQLRETURN ret=SQLAllocHandle(SQL_HANDLE_STMT,m_hCon,&m_hStmt);
 if(ret==SQL_ERROR || ret==SQL_INVALID_HANDLE)
 {
  return false;
 }
 return true;

}
long CODBCConnect::FetchMaxIdentity(char* tablename)
{
 char sql[512];
 sprintf(sql,"DBCC CHECKIDENT (%s, NORESEED);",tablename);
 if(!Execute(sql))
  return 0;
 if(FetchNextRow())
 {
  return atol(FetchNextField());
 }
 return 0;
}
bool CODBCConnect::Execute(char *src)
{

 if(m_hStmt!=NULL)
 {
  SQLFreeHandle(SQL_HANDLE_STMT,m_hStmt);
  m_hStmt=NULL;
  CreateStmtHandle();
 }
 else
 {
  CreateStmtHandle();
 }

 
 SQLINTEGER len=strlen(src);
 SQLRETURN ret=SQLExecDirect(m_hStmt,(SQLCHAR*)src,len);

 SQLCHAR  SqlState[6], Msg[SQL_MAX_MESSAGE_LENGTH];
 SQLINTEGER NativeError;
 SQLSMALLINT i, MsgLen;
 SQLRETURN  rc2;


 bool brtn = false;
 if(ret!=SQL_SUCCESS && ret!= SQL_SUCCESS_WITH_INFO)
 {
  
  i = 1;
  memset(Msg,0,sizeof(Msg));
  while ((rc2 = SQLGetDiagRec(SQL_HANDLE_STMT,m_hStmt, i, SqlState, &NativeError,
     Msg, sizeof(Msg)-1, &MsgLen)) != SQL_NO_DATA)
  {
   memset(Msg,0,sizeof(Msg));
   i++;
  }
  brtn = false;
 }
 else
 {
  brtn = true;
 }
 
 return brtn; 
}


bool CODBCConnect::FetchNextRow()
{
 SQLRETURN ret;
 m_nCurField=0;
 
 ret=SQLFetch(m_hStmt);

 if(ret!=SQL_SUCCESS && ret!= SQL_SUCCESS_WITH_INFO)
 {
  return false;
 }
 else
 {
  return true;
 }
 
}

bool CODBCConnect::Reset()
{
 if(m_hStmt!=NULL)
 {
  SQLFreeHandle(SQL_HANDLE_STMT,m_hStmt);
  m_hStmt=NULL;
 }

 return true; 
}

long GetFieldNum()
{
 short nField;
 ret=SQLNumResultCols(m_hStmt,&num_field);
 return nField;
}

char *CODBCConnect::FetchNextField()
{
 szTmpField[0]='\0';
 if(m_nCurField>=GetFieldNum())
  return szTmpField;

 int i=m_nCurField;
 m_nCurField++;
 long len=0;
 SQLRETURN ret=SQLGetData(m_hStmt,i+1,SQL_C_CHAR,szTmpField,sizeof(szTmpField)-1,&len);

 szTmpField[len]='\0';
 if(ret!=SQL_SUCCESS && ret!= SQL_SUCCESS_WITH_INFO)
 {
 }
 return szTmpField;
}

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有