📄 recset.cpp
字号:
// MetaSet.cpp: implementation of the CRecSet class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "RecSet.h"
void ctod(char *bit, int &y,int &m,int &d, int &h,int &f,int &s, int &w);
int trim0(char *);
int trim(char *);
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CRecSet::CRecSet(CDatabaseX* pdb, char *tableName, char *aliaName )
: CSQLSetX(pdb)
{
m_pDatabase = pdb;
m_trueTableName = tableName;
m_aliaTableName = aliaName;
nkf=0;
memset(rowIdVar,0, 256);
memset(autoVar,0, 256);
memset(chkVar,0, 256);
memset(m_sel, _IS_NO_USE_, sizeof(BOOL)*256);
for (int j=0; j<50; j++)
{
for (int i=0; i<256; i++) metas[j][i]=NULL;
}
deleteVars();
m_nFields = 0;
where = "";
fldsNotes="";
//打开输入表:
CString cstr;
SQLRETURN nRetcode;
SQLHSTMT hstmt;
SQLSMALLINT ColumnNumber;
SQLCHAR ColumnName[32];
SQLSMALLINT BufferLength;
SQLSMALLINT NameLength;
SQLSMALLINT DataType;
SQLUINTEGER ColumnSize ;
SQLSMALLINT DecimalDigits;
SQLSMALLINT Nullable;
SQLINTEGER strLen_or_Ind;
SQLPOINTER TargetValuePtr;
//分配一个临时语句,以取得当前表的字段信息:
nRetcode = SQLAllocStmt(m_pDatabase->m_hdbc, &hstmt);
if (!Check(nRetcode))
{
return ;
}
//调用 ODBC 函数以得到字段的集合(每字段一行)
nRetcode= SQLColumns(hstmt,
NULL, SQL_NTS,
NULL, SQL_NTS,
(UCHAR FAR *)(const char*)m_trueTableName, SQL_NTS,
NULL, SQL_NTS ) ;
if (!Check(nRetcode))
{
nRetcode=SQLCloseCursor(hstmt);
nRetcode=SQLFreeStmt(hstmt, SQL_CLOSE);
nRetcode=SQLFreeStmt(hstmt, SQL_DROP);
return ;
}
//表述每一字段的属性数目(也即结果集合的列数,目前有12项):
short mColumn;
nRetcode = SQLNumResultCols(hstmt, &mColumn);
char m_strColumnName[256];
char m_strTypeName[256];
UINT m_nDataType;
UINT m_lPrecision;
UINT m_nScale;
UINT m_nRadix;
UINT m_nNullable;
//构造用于读取各字段的参数:
for (ColumnNumber=1; ColumnNumber<=mColumn; ColumnNumber++)
{
BufferLength = 32;
//字段的名称,SQL类型,宽度,小数位数,允许NULL否等:
nRetcode = SQLDescribeCol(hstmt, ColumnNumber,
ColumnName,
BufferLength,
&NameLength,
&DataType,
&ColumnSize ,
&DecimalDigits,
&Nullable);
_strupr((char*)ColumnName);
//列的名字
if (_tcsnicmp((char*)ColumnName, "column_name", strlen("column_name"))==0)
nRetcode = SQLBindCol(hstmt,ColumnNumber, SQL_C_CHAR,
m_strColumnName,
128,&strLen_or_Ind);
//原始类型
else if (_tcsnicmp((char*)ColumnName, "type_name", strlen("type_name"))==0)
nRetcode = SQLBindCol(hstmt,ColumnNumber, SQL_C_CHAR,
m_strTypeName,
128,&strLen_or_Ind);
//数据SQL类型
else if (_tcsnicmp((char*)ColumnName, "data_type", strlen("data_type"))==0)
nRetcode = SQLBindCol(hstmt,ColumnNumber, SQL_C_SLONG,
&m_nDataType,
0, &strLen_or_Ind);
//列宽度
else if (_tcsnicmp((char*)ColumnName, "precision", strlen("precision"))==0 || _tcsnicmp((char*)ColumnName, "COLUMN_SIZE", strlen("COLUMN_SIZE"))==0)
nRetcode = SQLBindCol(hstmt,ColumnNumber, SQL_C_SLONG,
&m_lPrecision,
0, &strLen_or_Ind);
else if (_tcsnicmp((char*)ColumnName, "scale", strlen("scale"))==0 || _tcsnicmp((char*)ColumnName, "DECIMAL_DIGITS", strlen("DECIMAL_DIGITS"))==0 )
nRetcode = SQLBindCol(hstmt,ColumnNumber, SQL_C_SLONG,
&m_nScale,
0, &strLen_or_Ind);
else if (_tcsnicmp((char*)ColumnName, "radix", strlen("radix"))==0||_tcsnicmp((char*)ColumnName, "NUM_PREC_RADIX", strlen("NUM_PREC_RADIX"))==0)
nRetcode = SQLBindCol(hstmt,ColumnNumber, SQL_C_SLONG,
&m_nRadix,
0, &strLen_or_Ind);
else if (_tcsnicmp((char*)ColumnName, "nullable", strlen("nullable"))==0)
nRetcode = SQLBindCol(hstmt,ColumnNumber, SQL_C_SLONG,
&m_nNullable,
0, &strLen_or_Ind);
}
//返回各字段一般信息:
m_nFields = 0;
ColumnNumber=0;
nRetcode = SQLFetch(hstmt);
int ii;
while(nRetcode != SQL_NO_DATA_FOUND)
{
if (nRetcode != SQL_SUCCESS) break;
//将列名转为大写:
_strupr((char*)m_strColumnName); trim((char*)m_strColumnName);
#if 0
if (m_strColumnName=="ROWID")
{
nRetcode = SQLFetch(hstmt);
continue;
}
if (m_strColumnName=="REC_SYS_DATE")
{
nRetcode = SQLFetch(hstmt);
continue;
}
#endif
for (ii=0; ii<ColumnNumber; ii++)
{
if (m_strName[ii]==m_strColumnName) break;
}
if (ii<ColumnNumber)
{
nRetcode = SQLFetch(hstmt);
continue;
}
if (CloseBindLong)
{
if (m_nDataType== SQL_SQL_NTEXT ||
m_nDataType== SQL_BINARY ||
m_nDataType== SQL_VARBINARY ||
m_nDataType== SQL_LONGVARCHAR ||
m_nDataType== SQL_LONGVARBINARY ||
m_nDataType== SQL_ORA_LOB)
{
nRetcode = SQLFetch(hstmt);
continue;
}
}
ColumnNumber++;
//允许null否:
nullable[ColumnNumber-1] = m_nNullable;
if (strcmp(m_strColumnName,"ROWID")==0 )
{
nullable[ColumnNumber-1] = 1;
}
if (strcmp(m_strColumnName,"REC_SYS_DATE")==0)
{
nullable[ColumnNumber-1] = 1;
}
//字段的其它信息:
cstr = m_strColumnName;
m_Name.Add ( "["+cstr+"]" );
m_Width.Add(m_lPrecision );
m_Type.Add ( m_nDataType);
m_strName.Add( m_strColumnName );//label
m_strType.Add( m_strTypeName ); //原始类型
m_strTable.Add( m_trueTableName);
switch (m_nDataType)
{
case SQL_BIT:
TargetValuePtr = new BOOL;
m_Value.Add(TargetValuePtr);
break;
case SQL_TINYINT:
TargetValuePtr = new BYTE;
m_Value.Add(TargetValuePtr);
break;
case SQL_SMALLINT:
TargetValuePtr = new int;
m_Value.Add(TargetValuePtr);
break;
case SQL_INTEGER:
TargetValuePtr = new long;
m_Value.Add(TargetValuePtr);
break;
case SQL_REAL:
case SQL_FLOAT:
TargetValuePtr = new float;
m_Value.Add(TargetValuePtr);
break;
case SQL_DOUBLE:
TargetValuePtr = new double;
m_Value.Add(TargetValuePtr);
break;
case SQL_DATE:
TargetValuePtr = new DATE_STRUCT;
m_Value.Add(TargetValuePtr);
break;
case SQL_TIME:
TargetValuePtr = new TIME_STRUCT;
m_Value.Add(TargetValuePtr);
break;
case SQL_TIMESTAMP:
TargetValuePtr = new TIMESTAMP_STRUCT;
m_Value.Add(TargetValuePtr);
break;
case SQL_SQL_NCHAR:
case SQL_CHAR:
TargetValuePtr = new char[(WORD)m_lPrecision+1];
m_Value.Add(TargetValuePtr);
break;
case SQL_DECIMAL:
case SQL_NUMERIC:
TargetValuePtr = new char[(WORD)m_lPrecision+1];
m_Value.Add(TargetValuePtr);
break;
case SQL_GUID:
case SQL_SQL_NVARCHAR:
case SQL_VARCHAR:
TargetValuePtr = new char[(WORD)m_lPrecision+1];
m_Value.Add(TargetValuePtr);
break;
case SQL_SQL_NTEXT:
case SQL_BINARY:
case SQL_VARBINARY:
case SQL_LONGVARCHAR:
case SQL_LONGVARBINARY:
case SQL_ORA_LOB:
TargetValuePtr = new CMyByteArray;
m_Value.Add(TargetValuePtr);
break;
default:
TargetValuePtr = new BOOL;
m_Value.Add(TargetValuePtr);
break;
}
nRetcode = SQLFetch(hstmt);
}
m_nFields = ColumnNumber;
nRetcode=SQLCloseCursor(hstmt);
nRetcode=SQLFreeStmt(hstmt, SQL_CLOSE);
nRetcode=SQLFreeStmt(hstmt, SQL_DROP);
}
void CRecSet::deleteVars()
{
int i, n;
n = m_Value.GetSize();
for (i=n-1; i>=0; i--)
{
switch (m_Type[i])
{
case SQL_BIT:
delete (BOOL *)m_Value[i];
break;
case SQL_TINYINT:
delete (BYTE *)m_Value[i];
break;
case SQL_SMALLINT:
delete (int *)m_Value[i];
break;
case SQL_INTEGER:
delete (long *)m_Value[i];
break;
case SQL_REAL:
case SQL_FLOAT:
delete (float *)m_Value[i];
break;
case SQL_DOUBLE:
delete (double *)m_Value[i];
break;
case SQL_DATE:
delete (DATE_STRUCT *)m_Value[i];
break;
case SQL_TIME:
delete (TIME_STRUCT *)m_Value[i];
break;
case SQL_TIMESTAMP:
delete (TIMESTAMP_STRUCT *)m_Value[i];
break;
case SQL_SQL_NCHAR:
case SQL_CHAR:
case SQL_DECIMAL:
case SQL_NUMERIC:
delete (char *)m_Value[i];
break;
case SQL_GUID:
case SQL_SQL_NVARCHAR:
case SQL_VARCHAR:
delete (char *)m_Value[i];
break;
case SQL_SQL_NTEXT:
case SQL_BINARY:
case SQL_VARBINARY:
case SQL_LONGVARCHAR:
case SQL_LONGVARBINARY:
case SQL_ORA_LOB:
CMyByteArray* pByteArray;
pByteArray= (CMyByteArray*)m_Value[i];
delete pByteArray;
break;
default:
delete (BOOL *)m_Value[i];
break;
}
}
m_Value.RemoveAll(); //指针数组
m_Name.RemoveAll(); //串数组
m_strName.RemoveAll(); //串数组
m_strTable.RemoveAll(); //串数组
m_strType.RemoveAll(); //串数组
m_Width.RemoveAll(); //字数组
m_Type.RemoveAll(); //整数数组
}
CRecSet::~CRecSet()
{
deleteVars();
}
void CRecSet::OnSetOptions(HSTMT hstmt)
{
// TODO: Add your specialized code here and/or call the base class
CSQLSetX::OnSetOptions(hstmt);
}
void CRecSet::DoFieldExchange(CFieldExchange* pFX)
{
//{{AFX_FIELD_MAP(CRecSet)
for (int i=0; i<m_nFields; i++)
{
switch (m_Type[i])
{
case SQL_BIT:
SetFX_Bool(m_Name[i], *(BOOL *)m_Value[i]);
break;
case SQL_TINYINT:
SetFX_Byte(m_Name[i], *(BYTE *)m_Value[i]);
break;
case SQL_SMALLINT:
SetFX_Int( m_Name[i], *(int *)m_Value[i]);
break;
case SQL_INTEGER:
SetFX_Long( m_Name[i], *(long *)m_Value[i]);
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -