⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 c_sql.cpp

📁 使VC连接数据库变的更简单
💻 CPP
字号:
#include"stdafx.h"
#include"C_SQL.h"
int C_ResultSet::AlignBuffer(int length)
{
	int AlignSize=4;
	if((length%AlignSize)!=0)
		return length+AlignSize-(length%AlignSize);
	else
		return length+4;
}
void C_ResultSet::SetStmt(SQLHSTMT hOdbcStmt)
{
	this->hOdbcStmt=hOdbcStmt;
}
SQLHSTMT C_ResultSet::GetStmt()
{
	return hOdbcStmt;
}
bool C_ResultSet::Open()
{
	SQLSMALLINT NumCols,i;
	SQLRETURN sr;
	sr=SQLNumResultCols(hOdbcStmt,&NumCols);
	if(sr!=SQL_SUCCESS&&sr!=SQL_SUCCESS_WITH_INFO)
		return false;
    CTypeArray=(SQLSMALLINT*)malloc(NumCols *sizeof(SQLSMALLINT));
	ColLenArray=(SQLINTEGER *)malloc(NumCols *sizeof(SQLINTEGER));
	RecLenArray=(SQLINTEGER *)malloc(NumCols *sizeof(SQLINTEGER));
	OffsetArray=(SQLINTEGER *)malloc(NumCols *sizeof(SQLINTEGER));
	OffsetArray[0]=0;
	for(i=0;i<NumCols;i++)
	{
		unsigned char name[1024];
		short input[4];
		unsigned long colsize[1];
		sr=SQLDescribeCol(hOdbcStmt,i+1,name,1024,&input[0],&input[1],&colsize[0],&input[2],&input[3]);
		if(sr!=SQL_SUCCESS&&sr!=SQL_SUCCESS_WITH_INFO)
			return false;
		switch(input[1])
		{
		case SQL_CHAR:
			CTypeArray[i]=SQL_C_CHAR;
			break;
		case SQL_VARCHAR:
          	CTypeArray[i]=SQL_C_CHAR;
			break;
		case SQL_INTEGER:
			CTypeArray[i]=SQL_C_ULONG;
			break;
        case SQL_REAL:
				CTypeArray[i]=SQL_C_FLOAT;
			break;
		case SQL_FLOAT:
				CTypeArray[i]=SQL_C_FLOAT;
			break;
		case SQL_DOUBLE:
				CTypeArray[i]=SQL_C_DOUBLE;
			break;
		case SQL_TYPE_DATE:
				CTypeArray[i]=SQL_C_TYPE_DATE;
			break;
		case SQL_TYPE_TIME:
				CTypeArray[i]=SQL_C_TYPE_TIME;
			break;
		case SQL_TYPE_TIMESTAMP:
				CTypeArray[i]=SQL_C_TYPE_TIMESTAMP;
			break;
		}
     sr=SQLDescribeCol(hOdbcStmt,i+1,name,1024,&input[0],&input[1],&colsize[0],&input[2],&input[3]);
     if(sr!=SQL_SUCCESS&&sr!=SQL_SUCCESS_WITH_INFO)
			return false;
	 ColLenArray [i]=AlignBuffer(colsize[0]);
	 if(i)
		 OffsetArray[i]=OffsetArray[i-1]+ColLenArray[i-1];
	}
	DataPtr=malloc(OffsetArray[NumCols-1]+ColLenArray[NumCols-1]);
    for(i=0;i<NumCols;i++)
	{
		SQLBindCol(hOdbcStmt,((SQLUSMALLINT)i)+1,CTypeArray[i],(BYTE*)DataPtr+OffsetArray[i],ColLenArray[i],&RecLenArray[i]);
		if(sr!=SQL_SUCCESS&&sr!=SQL_SUCCESS_WITH_INFO)
			return false;
	}
	return true;
}
bool C_ResultSet::Close()
{
	SQLCloseCursor(hOdbcStmt);
	free(CTypeArray);
	free(ColLenArray);
	free(RecLenArray);
	free(OffsetArray);
	free(DataPtr);
	if(hOdbcStmt!=SQL_NULL_HANDLE)
	{
		SQLRETURN sr=SQLFreeHandle(SQL_HANDLE_STMT,hOdbcStmt);
	    if(sr!=SQL_SUCCESS&&sr!=SQL_SUCCESS_WITH_INFO)
			return false;
	}
	       return true;
}
int C_ResultSet::GetColumnCount()
{
	    short length[1];
	    SQLRETURN sr=SQLNumResultCols(hOdbcStmt,&length[0]);
		if(sr!=SQL_SUCCESS&&sr!=SQL_SUCCESS_WITH_INFO)
		length[0]=-1;
		return (int)length[0];
}
CString C_ResultSet::GetColumnName(int column)
{
	unsigned char name[1024];
	short input[3];
	unsigned long colsize[1];
	SQLRETURN  sr=SQLDescribeCol(hOdbcStmt,column,name,1024,&input[0],&input[1],&colsize[0],&input[2],&input[3]);
     if(sr!=SQL_SUCCESS&&sr!=SQL_SUCCESS_WITH_INFO)
	   return "ERROR";
	 CString ColumnName((LPCTSTR)name,input[0]);
	 return ColumnName;
}
CString C_ResultSet::GetColumnType(int column)
{
	unsigned char name[1024];
	short input[3];
	unsigned long colsize[1];
	SQLRETURN sr=SQLDescribeCol(hOdbcStmt,column,name,1024,&input[0],&input[1],&colsize[0],&input[2],&input[3]);
   if(sr!=SQL_SUCCESS&&sr!=SQL_SUCCESS_WITH_INFO)
	   return "ERROR";
   CString Type;
   switch(input[1])
   {
   case SQL_BIGINT:
	   Type="SQL_BIGINT";
	   break;
   case SQL_BINARY:
	   Type="SQL_BINARY";
	   break;
   case SQL_BIT:
	   Type="SQL_BIT";
	   break;
   case SQL_CHAR:
	   Type="SQL_CHAR";
	   break;
   case SQL_TYPE_DATE:
	   Type="SQL_TYPE_DATE";
	   break;
   case SQL_DECIMAL:
	   Type="SQL_DECIMAL";
	   break;
	case SQL_DOUBLE:
	   Type="SQL_DOUBLE";
	   break;
	case SQL_FLOAT:
	   Type="SQL_FLOAT";
	   break;
	case SQL_INTEGER:
	   Type="SQL_INTEGER";
	   break;
	case SQL_LONGVARBINARY:
	   Type="SQL_LONGVARBINARY";
	   break;
	case SQL_LONGVARCHAR:
	   Type="SQL_LONGVARCHAR";
	   break;
	case SQL_NUMERIC:
	   Type="SQL_NUMERIC";
	   break;
	case SQL_REAL:
	   Type="SQL_REAL";
	   break;
	case SQL_SMALLINT:
	   Type="SQL_SMALLINT";
	   break;
	case SQL_TYPE_TIME:
	   Type="SQL_TYPE_TIME";
	   break;
	case SQL_TYPE_TIMESTAMP:
	   Type="SQL_TYPE_TIMESTAMP";
	   break;
	case SQL_TINYINT:
	   Type="SQL_TINYINT";
	   break;
	case SQL_VARBINARY:
	   Type="SQL_VARBINARY";
	   break;
	case SQL_VARCHAR:
	   Type="SQL_VARCHAR";
	   break;
	default: Type="No such type";
   }
   return Type;
}

int C_ResultSet::GetColumnLength(int column)
{
	unsigned  char name[1024];
	short input[3];
	unsigned long colsize[1];
	SQLRETURN  sr=SQLDescribeCol(hOdbcStmt,column,name,1024,&input[0],&input[1],&colsize[0],&input[2],&input[3]);
     if(sr!=SQL_SUCCESS&&sr!=SQL_SUCCESS_WITH_INFO)
	   return -1;
	 return (int)input[2];
}

int C_ResultSet::MoveNext()
{
	SQLRETURN sr=SQLFetch(hOdbcStmt);
	if(sr==SQL_SUCCESS&&sr==SQL_SUCCESS_WITH_INFO)
	   return 1;
	else if(sr==SQL_NO_DATA)
		return 0;
	else
        return -1;
}
int C_ResultSet::MovePrior()
{
	    SQLRETURN sr=SQLFetchScroll(hOdbcStmt,SQL_FETCH_PRIOR,0);
		if(sr==SQL_SUCCESS&&sr==SQL_SUCCESS_WITH_INFO)
	    return 1;
		else if(sr==SQL_NO_DATA)
			return 0;
		else 
			return -1;
}
int C_ResultSet::MoveFirst()
{
   	SQLRETURN sr=SQLFetchScroll(hOdbcStmt,SQL_FETCH_FIRST,0);
   	if(sr==SQL_SUCCESS&&sr==SQL_SUCCESS_WITH_INFO)
	   return 1;
	else if(sr==SQL_NO_DATA)
	   return 0;
	else 
	  return -1;
}
int C_ResultSet::MoveLast()
{
  	SQLRETURN sr=SQLFetchScroll(hOdbcStmt,SQL_FETCH_LAST,0);
   	if(sr==SQL_SUCCESS&&sr==SQL_SUCCESS_WITH_INFO)
	   return 1;
	else if(sr==SQL_NO_DATA)
	   return 0;
	else 
	  return -1;
}
int C_ResultSet::MovePosition(int position)
{
  SQLRETURN sr=SQLFetchScroll(hOdbcStmt,SQL_FETCH_ABSOLUTE,position);
   	if(sr==SQL_SUCCESS&&sr==SQL_SUCCESS_WITH_INFO)
	   return 1;
	else if(sr==SQL_NO_DATA)
	   return 0;
	else 
	  return -1;
}
CString C_ResultSet::GetString(int column)
{
	if(RecLenArray[column-1]>=0)
	{
		char *s=(char *)((BYTE *)DataPtr+OffsetArray[column-1]);
		CString Record((LPCTSTR)s,RecLenArray[column-1]);
		return Record;
	}
	else
	{
		CString Record("");
		return Record;
	}
}
int C_ResultSet::GetInt(int column)
{
	int *i=(int *)((BYTE *)DataPtr+OffsetArray[column-1]);
	return *i;
}
long C_ResultSet::GetLong(int column)
{
   	long *i=(long *)((BYTE *)DataPtr+OffsetArray[column-1]);
	return *i;
}
bool C_ResultSet::GetBool(int column)
{
   	bool *b=(bool *)((BYTE *)DataPtr+OffsetArray[column-1]);
	return *b;
}
float C_ResultSet::GetFloat(int column)
{
		float *f=(float *)((BYTE *)DataPtr+OffsetArray[column-1]);
	return *f;
}
  
double C_ResultSet::GetDouble(int column)
{
		double *d=(double *)((BYTE *)DataPtr+OffsetArray[column-1]);
	return *d;
}
TimeStamp C_ResultSet::GetDateTime(int column)
{
		TimeStamp *ts=(TimeStamp *)((BYTE *)DataPtr+OffsetArray[column-1]);
	    return *ts;
}

bool C_Connection::Open(CString DSN,CString UserID,CString UserPassword)
{
	SQLRETURN sr=SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&hOdbcEnv);
	if(sr!=SQL_SUCCESS&&sr!=SQL_SUCCESS_WITH_INFO)
	  return false;
	sr=SQLSetEnvAttr(hOdbcEnv,SQL_ATTR_ODBC_VERSION,(SQLPOINTER)SQL_OV_ODBC3,SQL_IS_INTEGER);
	sr=SQLAllocHandle(SQL_HANDLE_DBC,hOdbcEnv,&hOdbcConn);
	if(sr!=SQL_SUCCESS&&sr!=SQL_SUCCESS_WITH_INFO)
	 return false;
	sr=SQLConnect(hOdbcConn,(UCHAR *)LPCTSTR(DSN),SQL_NTS,(UCHAR *)LPCTSTR(UserID),SQL_NTS,(UCHAR *)LPCTSTR(UserPassword),SQL_NTS);
     if(sr!=SQL_SUCCESS&&sr!=SQL_SUCCESS_WITH_INFO)
	 return false;
	return true;
}

bool C_Connection::Update(CString sql)
{
	SQLHSTMT hOdbcStmt;
	SQLRETURN sr=SQLAllocHandle(SQL_HANDLE_STMT,hOdbcConn,&hOdbcStmt);
   if(sr!=SQL_SUCCESS&&sr!=SQL_SUCCESS_WITH_INFO)
	 return false;
   sr=SQLExecDirect(hOdbcStmt,(UCHAR *)LPCTSTR(sql),SQL_NTS);
   if(sr!=SQL_SUCCESS&&sr!=SQL_SUCCESS_WITH_INFO)
	 return false;
   if(hOdbcStmt!=SQL_NULL_HANDLE)
	   SQLFreeHandle(SQL_HANDLE_STMT,hOdbcStmt);
   return true;
}
bool C_Connection::Query(C_ResultSet *cr,CString sql)
{
	SQLHSTMT hOdbcStmt;
	SQLRETURN sr=SQLAllocHandle(SQL_HANDLE_STMT,hOdbcConn,&hOdbcStmt);
     if(sr!=SQL_SUCCESS&&sr!=SQL_SUCCESS_WITH_INFO)
	 return false;
   sr=SQLSetStmtAttr(hOdbcStmt,SQL_ATTR_CURSOR_TYPE,(void *)SQL_CURSOR_DYNAMIC,SQL_IS_UINTEGER);
    if(sr!=SQL_SUCCESS&&sr!=SQL_SUCCESS_WITH_INFO)
	 return false;

   sr=SQLExecDirect(hOdbcStmt,(UCHAR *)LPCTSTR(sql),SQL_NTS);
   if(sr!=SQL_SUCCESS&&sr!=SQL_SUCCESS_WITH_INFO)
	 return false;
   cr->SetStmt(hOdbcStmt);
   return true;
}
bool C_Connection::Close()
{
	SQLRETURN sr;
	if(hOdbcConn!=SQL_NULL_HANDLE)
	{
		sr=SQLDisconnect(hOdbcConn);
		if(sr!=SQL_SUCCESS&&sr!=SQL_SUCCESS_WITH_INFO)
	 return false;
	}
	if(hOdbcConn!=SQL_NULL_HANDLE)
	{
		sr=SQLFreeHandle(SQL_HANDLE_DBC,hOdbcConn);
		if(sr!=SQL_SUCCESS&&sr!=SQL_SUCCESS_WITH_INFO)
	 return false;
	}
	if(hOdbcEnv!=SQL_NULL_HANDLE)
	{
		sr=SQLFreeHandle(SQL_HANDLE_ENV,hOdbcEnv);
		if(sr!=SQL_SUCCESS&&sr!=SQL_SUCCESS_WITH_INFO)
	 return false;
	}
	return true;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -