📄 podbc.cxx
字号:
if (B)
SQLGetData(*row->rec->Stmt,col,ODBCType,&b.date,0,&b.dataLen);
return Convert(b.date);
case PODBC::Time:
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::Row
PODBC::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()
{
return SQL_OK(SQLFetch(m_hStmt));
}
BOOL PODBCStmt::FetchPrevious()
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -