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

📄 podbc.cxx

📁 pwlib源码库
💻 CXX
📖 第 1 页 / 共 3 页
字号:
			if (B) SQLGetData(*row->rec->Stmt,col,ODBCType,&b.time,0,&b.dataLen);			 return Convert(b.time);		case PODBC::TimeStamp:			if (B) SQLGetData(*row->rec->Stmt,col,ODBCType,&b.timestamp,0,&b.dataLen);			return Convert(b.timestamp);		case PODBC::Guid:   			if (B) SQLGetData(*row->rec->Stmt,col,ODBCType,&b.guid,0,&b.dataLen);			return Convert(b.guid);	  /// Binary/Long Data Cannot be Bound Need to get it!		case PODBC::Binary:		case PODBC::VarBinary:		case PODBC::LongVarBinary:		case PODBC::LongVarChar:					return row->rec->GetLongData(col);;					  /// Character 		case PODBC::DateTime:		case PODBC::Unknown:		case PODBC::VarChar:		default:		  if (B) SQLGetData(*row->rec->Stmt,col,ODBCType,b.sbin.GetPointer(len),len,&b.dataLen);			return b.sbin;	};}void PODBC::Field::SetValue(PString value){ Bind &b = Data;/// If Field is marked as ReadOnly Do not Update	if (isReadOnly) return;/// If Field is not Nullable and the New Value length =0 No Update.	if ((!isNullable) && (value.GetLength() == 0)) return;	switch (ODBCType) {		case PODBC::BigInt:			Convert(b.sbint,value);			break;		case PODBC::TinyInt:		case PODBC::Bit:			 Convert(b.sbit,value);				 break;			case PODBC::Char:			 Convert(b.suchar,value);			 break;		case PODBC::Integer:			 Convert(b.slint,value);			 break;						case PODBC::SmallInt:			 Convert(b.ssint,value);			 break;		case PODBC::Numeric:		case PODBC::Decimal:		case PODBC::Float:		case PODBC::Real:		case PODBC::Double:			 Convert(b.sdoub,value);			 break;	  /// Date Times		case PODBC::Date:  			 Convert(b.date,value);			 break;		case PODBC::Time:			 Convert(b.time,value);			 break;		case PODBC::TimeStamp:			 Convert(b.timestamp,value);			 break;		case PODBC::Guid:   			 Convert(b.guid,value);	  /// Binary Data		case PODBC::Binary:		case PODBC::VarBinary:		case PODBC::LongVarBinary:		case PODBC::LongVarChar:			b.sbinlong = value;					if (row->rec->dbase == PODBC::MSAccess) {					b.sbinlong.SetSize(MAX_DATA_LEN * PODBCRecord::MaxCharSize);					b.dataLen = b.sbinlong.GetLength();				}			break;				  /// Character 		case PODBC::DateTime:		case PODBC::Unknown:		case PODBC::VarChar:		default:			b.sbin = value;			b.sbin.SetSize(MAX_DATA_LEN);			b.dataLen = b.sbin.GetLength();	};}void PODBC::Field::SetDefaultValues() {  if ((isReadOnly) || (isAutoInc))  return;   /// Set Default Values		switch (Type)		{			case oPString:				case ochar:					if (isNullable)					SetValue(PString());				else					SetValue("?");				break;			case oPTime:				SetValue(PTime().AsString());				break;			default:				SetValue(0);		} }PString PODBC::Field::operator=(const PString & str){ 	return AsString();}BOOL PODBC::Field::DataFragment(PString & Buffer,PINDEX & fragment,long & size){  PINDEX fragcount = PINDEX(Data.sbinlong.GetLength()/size);// Value less than Buffer Size  if (fragcount == 0) {	  Buffer = Data.sbinlong;	  return FALSE;  }// Buffer Fragment  if (fragcount < fragment) {	  Buffer.Splice(Data.sbinlong,(fragment * size)+1,size);	  fragment = fragment++;	  return TRUE;  }// Last Fragment  PINDEX blen = Data.sbinlong.GetLength() - (fragment * size);  Buffer = Data.sbinlong.Right(blen);  size = blen;  return FALSE; }BOOL PODBC::Field::Post() {	return row->Post();}/////////////////////////////////////////////////////////////////////////////// PODBC::Table	  PODBC::Table::Table(PODBC * odbc, PString Query)	:	stmt(PODBCStmt(odbc)){	PString query;	tableName = PString();// Do the Query	if (Query.Trim().Left(6) == "SELECT") {		// Select Query		query = Query;	} else {									// Table Query		tableName = Query;		query = "SELECT * FROM [" + tableName + "];";	}	if (!stmt.Query(query))		return;	// Create the Row Handler	RowHandler = new Row(&stmt);}PODBC::Table::~Table() {}     	  PODBC::Row PODBC::Table::NewRow() {	RowHandler->SetNewRow();	return *RowHandler;}BOOL PODBC::Table::DeleteRow(PINDEX row){	return RowHandler->Delete(row);}BOOL PODBC::Table::Post(){	return RowHandler->Post();}PINDEX PODBC::Table::Rows()  { 	return RowHandler->RowCount; }PINDEX PODBC::Table::Columns() { 	return RowHandler->Columns(); }	  PStringArray PODBC::Table::ColumnNames() { 	return RowHandler->ColumnNames(); }PODBC::Row & PODBC::Table::operator[] (PINDEX row) { 	if (RowHandler->Navigate(row))		return *RowHandler; 	return *RowHandler;}PODBC::Row & PODBC::Table::RecordHandler(){	return *RowHandler;}PODBC::Field & PODBC::Table::operator() (PINDEX row, PINDEX col) { 	RowHandler->Navigate(row);	return RowHandler->Column(col); }PODBC::Field & PODBC::Table::Column(PINDEX col){     return RowHandler->Column(col);}PODBC::Field & PODBC::Table::Column(PString Name){	return RowHandler->Column(Name);}///////////////////////////////////////////////////////////////////// PODBC::RowPODBC::Row::Row(PODBCStmt * stmt)	: rec(new PODBCRecord(stmt))	{  /// Create a blank Row (RecordHolder) with default Recordset Info.	for (PINDEX i=0; i < rec->ColumnCount(); i++)	{   		Field * nfield = new Field;		nfield->row = this;		nfield->col = i+1;	 // Default Attributes		nfield->isReadOnly = FALSE;		nfield->isNullable = TRUE;		nfield->isAutoInc = FALSE;		nfield->Decimals = 0;		nfield->LongData = stmt->odbclink->NeedLongDataLen();		rec->Data(i+1, *nfield);	    		  /// Append to PArray		Fields.Append(nfield);	}      NewRow = FALSE;// Attempt to get the first Record  if (!stmt->FetchFirst())   	  RowCount = 0;   else	  	  RowCount = 1;// Get the Record Count  (Need a better way other than fetching! :-( )	 while(stmt->Fetch())	 {		 RowCount++;	 }	   /// Put the RecordHolder to point to the First Row	 if (RowCount > 0) {		stmt->FetchFirst();		CurRow = 1;	 } else 		CurRow = 0;}PODBC::Field & PODBC::Row::Column(PINDEX col) {   /// Column = 0 return blank field	if ((col == 0) || (col > Fields.GetSize()))    		return *(new PODBC::Field());	 return Fields[col-1];}PODBC::Field & PODBC::Row::Column(PString name){    PINDEX i = rec->ColumnByName(name);	return Column(i);}PINDEX PODBC::Row::Columns(){	return rec->ColumnCount();}PStringArray PODBC::Row::ColumnNames(){	PStringArray Names;	for (PINDEX i = 0; i < Fields.GetSize(); i++)	{		Names.AppendString(rec->ColumnName(i+1));	}	return Names;}PINDEX PODBC::Row::Rows(){	return RowCount;}PODBC::Field & PODBC::Row::operator[] (PINDEX col) {  	return Column(col);} PODBC::Field & PODBC::Row::operator[] (PString col) {      PINDEX i = rec->ColumnByName(col);	return Column(i);}void PODBC::Row::SetNewRow(){	CurRow = RowCount+1;	NewRow = TRUE;	for (PINDEX i = 0; i < Fields.GetSize(); i++)	{		Column(i).SetDefaultValues();	}}BOOL PODBC::Row::Navigate(PINDEX row){	if ((row > 0) && (CurRow != row)) {		if (!rec->Stmt->FetchRow(row,TRUE)) 			return FALSE;		CurRow = row;	}   return TRUE;}BOOL PODBC::Row::Post(){  BOOL Success;	if (NewRow) {	   NewRow = FALSE;	   RowCount++;	   CurRow = RowCount;	   Success = rec->PostNew(*this);	} else {	   Success = rec->PostUpdate(*this);	}	return Success;}BOOL PODBC::Row::Delete(PINDEX row){	if (row > 0) {		if (!Navigate(row))			return FALSE;	}	if (!rec->PostDelete())		return FALSE;	RowCount--;	return TRUE;}// PDSNConnection/////////////////////////////////////////////////////////////////////////////////////PDSNConnection::PDSNConnection(){}PDSNConnection::~PDSNConnection(){}BOOL PDSNConnection::Connect( PString Source ,PString Username, PString Password){   int nConnect = SQLAllocHandle( SQL_HANDLE_ENV, SQL_NULL_HANDLE, &m_hEnv );	if( nConnect == SQL_SUCCESS || nConnect == SQL_SUCCESS_WITH_INFO ) {	nConnect = SQLSetEnvAttr( m_hEnv, 				 SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0 );	if( nConnect == SQL_SUCCESS || nConnect == SQL_SUCCESS_WITH_INFO ) {	 nConnect = SQLAllocHandle( SQL_HANDLE_DBC, m_hEnv, &m_hDBC );	 if( nConnect == SQL_SUCCESS || nConnect == SQL_SUCCESS_WITH_INFO ) {	  SQLSetConnectOption( m_hDBC,SQL_LOGIN_TIMEOUT,5 );                	  nConnect=SQLConnect( m_hDBC,		 ( SQLTCHAR *)(const char *)Source,		 SQL_NTS, 		 ( SQLTCHAR *)(const char *)Username,		 SQL_NTS,		 ( SQLTCHAR *)(const char *)Password,		 SQL_NTS );	  return ((nConnect == SQL_SUCCESS) || (nConnect == SQL_SUCCESS_WITH_INFO));	 }	}	}   if( m_hDBC != NULL ) {    m_nReturn = SQLDisconnect( m_hDBC );    m_nReturn = SQLFreeHandle( SQL_HANDLE_DBC,  m_hDBC );   }   if( m_hEnv!=NULL )    m_nReturn = SQLFreeHandle( SQL_HANDLE_ENV, m_hEnv );   m_hDBC              = NULL;   m_hEnv              = NULL;   m_nReturn           = SQL_ERROR;   return FALSE;} //--PODBCStmt::PODBCStmt(PODBC * odbc)	: odbclink(odbc){   HDBC hDBCLink = *odbc;   SQLRETURN m_nReturn;   m_nReturn = SQLAllocHandle( SQL_HANDLE_STMT, hDBCLink, &m_hStmt );   SQLSetStmtAttr(m_hStmt, SQL_ATTR_CONCURRENCY,                        (SQLPOINTER) SQL_CONCUR_ROWVER, 0);   SQLSetStmtAttr(m_hStmt, SQL_ATTR_CURSOR_TYPE,                       (SQLPOINTER)SQL_CURSOR_KEYSET_DRIVEN, 0);   SQLSetStmtAttr(m_hStmt, SQL_ATTR_ROW_BIND_TYPE, 					   (SQLPOINTER)SQL_BIND_BY_COLUMN, 0);   SQLSetStmtAttr(m_hStmt, SQL_ATTR_ROW_ARRAY_SIZE, 					   (SQLPOINTER)1, 0);   SQLSetStmtAttr(m_hStmt, SQL_ATTR_ROW_STATUS_PTR, 					   NULL, 0);   dbase = odbc->dbase;   if(!SQL_OK(m_nReturn))    m_hStmt=INVALID_HANDLE_VALUE;}PODBCStmt::~PODBCStmt(){   SQLCloseCursor(m_hStmt);   if(m_hStmt!=INVALID_HANDLE_VALUE)    SQLFreeHandle(SQL_HANDLE_STMT,m_hStmt);}BOOL PODBCStmt::IsValid(){    return m_hStmt!=INVALID_HANDLE_VALUE;}DWORD PODBCStmt::GetChangedRowCount(void){   long nRows=0;   if(!SQL_OK(SQLRowCount(m_hStmt,&nRows)))    return 0;   return nRows;}BOOL PODBCStmt::Query(PString strSQL){   SQLRETURN nRet=SQLExecDirect( m_hStmt, (SQLTCHAR *)(const char *)strSQL, SQL_NTS );    return SQL_OK( nRet );}BOOL PODBCStmt::Fetch()

⌨️ 快捷键说明

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