📄 c_sql.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 + -