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

📄 podbc.cxx

📁 pwlib源码库
💻 CXX
📖 第 1 页 / 共 3 页
字号:
{   return SQL_OK(SQLFetch(m_hStmt));}BOOL PODBCStmt::FetchPrevious(){   SQLRETURN nRet=SQLFetchScroll(m_hStmt,SQL_FETCH_PRIOR,0);   return SQL_OK(nRet);}BOOL PODBCStmt::FetchNext(){   SQLRETURN nRet=SQLFetchScroll(m_hStmt,SQL_FETCH_NEXT,0);   return SQL_OK(nRet);}BOOL PODBCStmt::FetchRow(PINDEX nRow,BOOL Absolute){   SQLRETURN nRet=SQLFetchScroll(m_hStmt,      (Absolute ? SQL_FETCH_ABSOLUTE : SQL_FETCH_RELATIVE),nRow);   return SQL_OK(nRet);}BOOL PODBCStmt::FetchFirst(){   SQLRETURN nRet=SQLFetchScroll(m_hStmt,SQL_FETCH_FIRST,0);   return SQL_OK(nRet);}BOOL PODBCStmt::FetchLast(){   SQLRETURN nRet=SQLFetchScroll(m_hStmt,SQL_FETCH_LAST,0);   return SQL_OK(nRet);}BOOL PODBCStmt::Cancel(){   SQLRETURN nRet=SQLCancel(m_hStmt);   return SQL_OK(nRet);}PStringArray PODBCStmt::TableList(PString option){	PString list;	PString entry;    SQLINTEGER len = 129;	SQLINTEGER cb = 0;	SQLRETURN nRet;/// This Statement will need reviewing as it/// depends on the Database, Might work on some/// but not on others      nRet = SQLTables(m_hStmt, 0, SQL_NTS, 0, SQL_NTS,0, SQL_NTS,(unsigned char *)(const char *)option,option.GetLength());	if (SQL_OK(nRet)) {		SQLBindCol(m_hStmt, 3, SQL_C_CHAR, entry.GetPointer(len),129,&cb);		while (Fetch())		{			SQLGetData(m_hStmt, 3, SQL_C_CHAR, entry.GetPointer(len), 129, &cb);				if (entry.GetLength() > 0) {					list = list + ":" + entry;					entry.MakeEmpty();				}		}	}	return list.Tokenise(":",FALSE);}BOOL PODBCStmt::SQL_OK(SQLRETURN res) {	if ((res==SQL_SUCCESS_WITH_INFO) || (res==SQL_SUCCESS))		  return TRUE;	if (res != SQL_NEED_DATA)				GetLastError();	return FALSE;}void PODBCStmt::GetLastError(){  SQLRETURN   rc;  SQLINTEGER    NativeError;  int buflen = SQL_MAX_MESSAGE_LENGTH;  SQLSMALLINT MsgLen, i = 1;  PString ErrStr, Msg;   while ((rc = SQLGetDiagRec(SQL_HANDLE_STMT, m_hStmt, i, (unsigned char *)ErrStr.GetPointer(6), 	      &NativeError,(unsigned char *)Msg.GetPointer(buflen), buflen, &MsgLen)) != SQL_NO_DATA)    {	     odbclink->OnSQLError(ErrStr, Msg);      i++;   }}///////////////////////////////////////////////////////////////////////////////// PODBCRecordunsigned int PODBCRecord::Precision;int PODBCRecord::MaxCharSize;PTime::TimeFormat PODBCRecord::TimeFormat; //--PODBCRecord::PODBCRecord(PODBCStmt * hStmt)	: Stmt(hStmt){	m_hStmt=*hStmt;	dbase = (PODBC::DataSources)hStmt->dbase;  // Database name	if (!Precision) Precision = 4;	if (!TimeFormat) TimeFormat = PTime::RFC1123;	MaxCharSize = 56;  //56 Kbytes (Stupid MSAccess)}PINDEX PODBCRecord::ColumnCount(){   short nCols=0;   if(!Stmt->SQL_OK(SQLNumResultCols(m_hStmt,&nCols)))    return 0;   return nCols;}BOOL PODBCRecord::InternalBindColumn(USHORT Column,LPVOID pBuffer,        ULONG pBufferSize,LONG * pReturnedBufferSize,        USHORT nType){   LONG pReturnedSize=0;   SQLRETURN Ret=SQLBindCol(m_hStmt,Column,nType,               pBuffer,pBufferSize,&pReturnedSize);   if(*pReturnedBufferSize)    *pReturnedBufferSize=pReturnedSize;cout << pReturnedSize;   return Stmt->SQL_OK(Ret);}PINDEX PODBCRecord::ColumnByName(PString Column){   PINDEX nCols=ColumnCount();   for(PINDEX i=1;i<(nCols+1);i++)   {    if(Column == ColumnName(i))      return i;   }   return 0;}BOOL PODBCRecord::InternalGetData(USHORT Column, LPVOID pBuffer,     ULONG pBufLen, LONG * dataLen, int Type){   SQLINTEGER od=0;   int Err=SQLGetData(m_hStmt,Column,Type,pBuffer,pBufLen,&od);   if (!Stmt->SQL_OK(Err))		return FALSE;       if(dataLen)    *dataLen=od;   return TRUE;}PString PODBCRecord::GetLongData(PINDEX Column){   PString sbin;   PString Data;   SQLINTEGER len = MAX_DATA_LEN;   SQLINTEGER cb =0;    while (InternalGetData((USHORT)Column,sbin.GetPointer(len + 1),len,&cb))	{		if (sbin.Right(1) == '\0')			// Remove Null Char			Data = Data + sbin.Left(sbin.GetLength()-1);		else			Data = Data + sbin;	}	return Data;}void PODBCRecord::Data(PINDEX Column, PODBC::Field & field){   SQLINTEGER len = MAX_DATA_LEN;//   SQLINTEGER cb =0;   BOOL B = TRUE;    /// Bind Switch (Readonly Fields are not Bound   PODBC::Field::Bind & b = field.Data;   PODBC::FieldTypes ctype = ColumnType(Column); /// Set the Attributes   field.isReadOnly = !IsColumnUpdatable(Column);   field.isNullable	= IsColumnNullable(Column);   field.isAutoInc = IsColumnAutoIndex(Column); /// Mark Columns which ReadOnly to Be Ignored when Binding.   if (field.isReadOnly) B = FALSE;   	switch (ctype) {	 /// Numeric Data		case PODBC::BigInt:			  if (B) SQLBindCol(m_hStmt, Column,SQL_C_SBIGINT, &b.sbint,0,&b.dataLen);				AddField(field,ColumnName(Column),ctype, PODBC::oPInt64);			break;		case PODBC::TinyInt:			   if (B) SQLBindCol(m_hStmt, Column, SQL_C_UTINYINT, &b.sbit, 0, &b.dataLen);				AddField(field,ColumnName(Column),ctype, PODBC::oshort);			break;						case PODBC::Bit:			   if (B) SQLBindCol(m_hStmt, Column, SQL_C_BIT, &b.sbit, 0, &b.dataLen);				AddField(field,ColumnName(Column),ctype, PODBC::oBOOL);			break;			case PODBC::Char:			   if (B) SQLBindCol(m_hStmt, Column, SQL_C_CHAR, &b.suchar, 0, &b.dataLen);				AddField(field,ColumnName(Column),ctype,PODBC::ochar);			break;		case PODBC::Integer:			   if (B) SQLBindCol(m_hStmt, Column, SQL_C_LONG, &b.slint, 0, &b.dataLen);				AddField(field,ColumnName(Column),ctype,PODBC::olong);			break;						case PODBC::SmallInt:			   if (B) SQLBindCol(m_hStmt, Column, SQL_C_SSHORT, &b.ssint, 0, &b.dataLen);				AddField(field,ColumnName(Column),ctype, PODBC::oint);			break;		case PODBC::Numeric:		case PODBC::Decimal:		case PODBC::Float:		case PODBC::Real:		case PODBC::Double:				field.Decimals = ColumnPrecision(Column);			   if (B) SQLBindCol(m_hStmt, Column, SQL_C_DOUBLE, &b.sdoub, 0, &b.dataLen);				AddField(field,ColumnName(Column),ctype,PODBC::odouble);			break;	  /// Data Structures		case PODBC::Date:  			   if (B) SQLBindCol(m_hStmt, Column, SQL_C_TYPE_DATE, &b.date, 0, &b.dataLen);				AddField(field,ColumnName(Column),ctype,PODBC::oPTime);			break;		case PODBC::Time:			   if (B) SQLBindCol(m_hStmt, Column, SQL_C_TYPE_TIME, &b.time, 0, &b.dataLen);				AddField(field,ColumnName(Column),ctype,PODBC::oPTime);			break;		case PODBC::TimeStamp:			   if (B) SQLBindCol(m_hStmt, Column, SQL_C_TYPE_TIMESTAMP, &b.timestamp, 0, &b.dataLen);				AddField(field,ColumnName(Column),ctype,PODBC::oPTime);			break;		case PODBC::Guid:   			   if (B) SQLBindCol(m_hStmt, Column, SQL_C_GUID, &b.guid, 0, &b.dataLen);				AddField(field,ColumnName(Column),ctype,PODBC::oPGUID);			break;	  /// Binary Data		case PODBC::Binary:		case PODBC::VarBinary:		case PODBC::LongVarBinary:		case PODBC::LongVarChar:			if (dbase == PODBC::MSAccess)   /// Stupid Access Stuff!			   if (B) SQLBindCol(m_hStmt, field.col, SQL_C_CHAR, b.sbinlong.GetPointer(len*MaxCharSize), len*MaxCharSize, &b.dataLen);			else {			   if (B) SQLBindCol(m_hStmt, Column, SQL_LONGVARCHAR, (SQLPOINTER)Column, 0, &b.dataLen);				if (field.LongData) 					b.dataLen = SQL_LEN_DATA_AT_EXEC(0);				else				    b.dataLen = SQL_LEN_DATA_AT_EXEC(len);			} 						AddField(field,ColumnName(Column),ctype,PODBC::oPString);			break;				  /// Character 		case PODBC::DateTime:		case PODBC::Unknown:		case PODBC::VarChar:		default:			    b.sbin.SetSize(len+1);				AddField(field,ColumnName(Column),ctype,PODBC::oPString);				if (B) SQLBindCol(m_hStmt, Column, SQL_C_CHAR, b.sbin.GetPointer(len), len, &b.dataLen);			break;	};}BOOL PODBCRecord::PostNew(PODBC::Row & rec){   SQLRETURN nRet;   nRet = SQLBulkOperations(m_hStmt,			// Statement handle			SQL_ADD								// Operation			);   return InternalSaveLongData(nRet,rec);}BOOL PODBCRecord::PostUpdate(PODBC::Row & rec){   SQLRETURN nRet;   nRet = SQLSetPos(m_hStmt,			// Statement handle	   (unsigned short)1,				// RowNumber	   SQL_UPDATE,						// Operation	   SQL_LOCK_NO_CHANGE				// LockType	   );   return InternalSaveLongData(nRet,rec);}BOOL PODBCRecord::PostDelete(PINDEX row){   SQLRETURN nRet;   nRet = SQLSetPos(m_hStmt,			// Statement handle	   (unsigned short)row,				// RowNumber	   SQL_DELETE,						// Operation	   SQL_LOCK_NO_CHANGE				// LockType	   );   return (Stmt->SQL_OK(nRet));}BOOL PODBCRecord::InternalSaveLongData(SQLRETURN nRet, PODBC::Row & rec){   SQLPOINTER pToken;   SQLINTEGER cbData;   PString DataSlice;   PINDEX frag, col=0; /// Everything OK but no Long Data   if (Stmt->SQL_OK(nRet)) return TRUE; /// Error Somewhere else.   if (nRet != SQL_NEED_DATA) return FALSE;	/// If More Data Required   while (nRet == SQL_NEED_DATA) {	 nRet = SQLParamData(m_hStmt,&pToken);	 if (col != (PINDEX)pToken) {		 col = (PINDEX)pToken;		 DataSlice = PString();		 frag = 0;		 cbData = MAX_DATA_LEN;	 }	 	 if (nRet == SQL_NEED_DATA) {		 while (rec[col].DataFragment(DataSlice,frag, cbData))			SQLPutData(m_hStmt,DataSlice.GetPointer(cbData),cbData);	 }   }   return TRUE;}PODBC::FieldTypes PODBCRecord::ColumnType( PINDEX Column ){   int nType=SQL_C_DEFAULT;   SQLTCHAR svColName[ 256 ]=_T("");   SWORD swCol=0,swType=0,swScale=0,swNull=0;   UDWORD pcbColDef;   SQLDescribeCol( m_hStmt,            // Statement handle       Column,             // ColumnNumber       svColName,          // ColumnName       sizeof( svColName), // BufferLength       &swCol,             // NameLengthPtr       &swType,            // DataTypePtr       &pcbColDef,         // ColumnSizePtr       &swScale,           // DecimalDigitsPtr       &swNull );          // NullablePtr   nType=(int)swType;   return( (PODBC::FieldTypes)nType );}DWORD PODBCRecord::ColumnSize( PINDEX Column ){//   int nType=SQL_C_DEFAULT;   SQLTCHAR svColName[ 256 ]=_T("");   SWORD swCol=0,swType=0,swScale=0,swNull=0;   DWORD pcbColDef=0;   SQLDescribeCol( m_hStmt,            // Statement handle       Column,             // ColumnNumber       svColName,          // ColumnName       sizeof( svColName), // BufferLength       &swCol,             // NameLengthPtr       &swType,            // DataTypePtr       &pcbColDef,         // ColumnSizePtr       &swScale,           // DecimalDigitsPtr       &swNull );          // NullablePtr   return pcbColDef;}DWORD PODBCRecord::ColumnScale( PINDEX Column ){//   int nType=SQL_C_DEFAULT;   SQLTCHAR svColName[ 256 ]=_T("");   SWORD swCol=0,swType=0,swScale=0,swNull=0;   DWORD pcbColDef=0;   SQLDescribeCol( m_hStmt,            // Statement handle       Column,             // ColumnNumber       svColName,          // ColumnName       sizeof( svColName), // BufferLength       &swCol,             // NameLengthPtr       &swType,            // DataTypePtr       &pcbColDef,         // ColumnSizePtr       &swScale,           // DecimalDigitsPtr       &swNull );          // NullablePtr   return swScale;}PString PODBCRecord::ColumnName(PINDEX Column) //, PString Name, SHORT NameLen ){//   int nType=SQL_C_DEFAULT;   SWORD swCol=0,swType=0,swScale=0,swNull=0;   DWORD pcbColDef=0;   TCHAR Name[256]=_T("");   SQLRETURN Ret=    SQLDescribeCol( m_hStmt,            // Statement handle       Column,               // ColumnNumber       (SQLTCHAR*)(LPTSTR)Name,     // ColumnName       sizeof(Name),    // BufferLength       &swCol,             // NameLengthPtr       &swType,            // DataTypePtr       &pcbColDef,         // ColumnSizePtr       &swScale,           // DecimalDigitsPtr       &swNull );          // NullablePtr   if (!Stmt->SQL_OK(Ret))		return PString();   return Name;}BOOL PODBCRecord::IsColumnNullable( PINDEX Column ) {//   int nType=SQL_C_DEFAULT;   SQLTCHAR svColName[ 256 ]=_T("");   SWORD swCol=0,swType=0,swScale=0,swNull=0;   UDWORD pcbColDef;   SQLDescribeCol( m_hStmt,            // Statement handle       Column,             // ColumnNumber       svColName,          // ColumnName       sizeof( svColName), // BufferLength       &swCol,             // NameLengthPtr       &swType,            // DataTypePtr       &pcbColDef,         // ColumnSizePtr       &swScale,           // DecimalDigitsPtr       &swNull );          // NullablePtr   return (swNull==SQL_NULLABLE);}BOOL PODBCRecord::IsColumnUpdatable(PINDEX Column ){   SWORD colUpdate=0;   SQLColAttribute(m_hStmt,		// StatementHandle        (SQLSMALLINT)(Column),  // ColumnNumber        SQL_DESC_UPDATABLE,		// FieldIdentifier        NULL,					// CharacterAttributePtr        0,						// BufferLength        NULL,					// StringLengthPtr        &colUpdate);			// NumericAttributePtr   return (colUpdate != SQL_ATTR_READONLY);}BOOL PODBCRecord::IsColumnAutoIndex(PINDEX Column ){   SWORD colIndex=0;   SQLColAttribute(m_hStmt,		// StatementHandle        (SQLSMALLINT)(Column),  // ColumnNumber        SQL_DESC_AUTO_UNIQUE_VALUE,		// FieldIdentifier        NULL,							// CharacterAttributePtr        0,								// BufferLength        NULL,							// StringLengthPtr        &colIndex);					// NumericAttributePtr   return (colIndex == SQL_TRUE);}unsigned int PODBCRecord::ColumnPrecision(PINDEX Column ){   SWORD coldigits=0;   SQLColAttribute(m_hStmt,				// StatementHandle        (SQLSMALLINT)(Column),			// ColumnNumber        SQL_DESC_PRECISION,				// FieldIdentifier        NULL,							// CharacterAttributePtr        0,								// BufferLength        NULL,							// StringLengthPtr        &coldigits);					// NumericAttributePtr   if (Precision < (unsigned)coldigits)	   return Precision;   else	   return coldigits;}#pragma warning(default:4100)#pragma warning(default:4244)

⌨️ 快捷键说明

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