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

📄 qsql_odbc.cpp

📁 qt-x11-free-3.0.3.tar.gz minigui图形界面工具
💻 CPP
📖 第 1 页 / 共 3 页
字号:
#endif	    return TRUE;	}    }#endif //ODBC_CHECK_DRIVER    return TRUE;}QSqlQuery QODBCDriver::createQuery() const{    return QSqlQuery( new QODBCResult( this, d ) );}bool QODBCDriver::beginTransaction(){    if ( !isOpen() ) {#ifdef QT_CHECK_RANGE	qWarning(" QODBCDriver::beginTransaction: Database not open" );#endif	return FALSE;    }    SQLUINTEGER ac(SQL_AUTOCOMMIT_OFF);    SQLRETURN r  = SQLSetConnectAttr( d->hDbc,			    SQL_ATTR_AUTOCOMMIT,			    (SQLPOINTER)ac,			    sizeof(ac));    if ( r != SQL_SUCCESS ) {	setLastError( qMakeError( "Unable to disable autocommit", QSqlError::Transaction, d ) );	return FALSE;    }    return TRUE;}bool QODBCDriver::commitTransaction(){    if ( !isOpen() ) {#ifdef QT_CHECK_RANGE	qWarning(" QODBCDriver::commitTransaction: Database not open" );#endif	return FALSE;    }    SQLRETURN r = SQLEndTran( SQL_HANDLE_ENV,				d->hEnv,				SQL_COMMIT);    if ( r != SQL_SUCCESS ) {	setLastError( qMakeError("Unable to commit transaction", QSqlError::Transaction, d ) );	return FALSE;    }    return endTrans();}bool QODBCDriver::rollbackTransaction(){    if ( !isOpen() ) {#ifdef QT_CHECK_RANGE	qWarning(" QODBCDriver::rollbackTransaction: Database not open" );#endif	return FALSE;    }    SQLRETURN r = SQLEndTran( SQL_HANDLE_ENV,				d->hEnv,				SQL_ROLLBACK);    if ( r != SQL_SUCCESS ) {	setLastError( qMakeError( "Unable to rollback transaction", QSqlError::Transaction, d ) );	return FALSE;    }    return endTrans();}bool QODBCDriver::endTrans(){    SQLUINTEGER ac(SQL_AUTOCOMMIT_ON);    SQLRETURN r  = SQLSetConnectAttr( d->hDbc,			    SQL_ATTR_AUTOCOMMIT,			    (SQLPOINTER)ac,			    sizeof(ac));    if ( r != SQL_SUCCESS ) {	setLastError( qMakeError( "Unable to enable autocommit", QSqlError::Transaction, d ) );	return FALSE;    }    return TRUE;}QStringList QODBCDriver::tables( const QString& /* user */ ) const{    QStringList tl;    if ( !isOpen() )	return tl;    SQLHANDLE hStmt;    SQLRETURN r = SQLAllocHandle( SQL_HANDLE_STMT,				  d->hDbc,				  &hStmt );    if ( r != SQL_SUCCESS ) {#ifdef QT_CHECK_RANGE	qSqlWarning( "QODBCDriver::tables: Unable to allocate handle", d );#endif	return tl;    }    r = SQLSetStmtAttr( hStmt,			SQL_ATTR_CURSOR_TYPE,			(SQLPOINTER)SQL_CURSOR_FORWARD_ONLY,			SQL_IS_UINTEGER );    // Prevent SQLTables to display all the system tables    QString tableType = "TABLE";    r = SQLTables( hStmt,		   NULL,		   0,		   NULL,		   0,		   NULL,		   0,		   (SQLCHAR*)tableType.local8Bit().data(),		   tableType.length() );#ifdef QT_CHECK_RANGE    if ( r != SQL_SUCCESS )	qSqlWarning( "QODBCDriver::tables Unable to execute table list", d );#endif    r = SQLFetchScroll( hStmt,			SQL_FETCH_NEXT,			0);    while ( r == SQL_SUCCESS ) {	SQLINTEGER lengthIndicator = 0;	bool isNull;	QString fieldVal = qGetStringData( hStmt, 2, lengthIndicator, isNull ); // table name	tl.append( fieldVal );	r = SQLFetchScroll( hStmt,			    SQL_FETCH_NEXT,			    0);    }	r = SQLFreeHandle( SQL_HANDLE_STMT, hStmt );	if ( r!= SQL_SUCCESS )		qSqlWarning( "QODBCDriver: Unable to free statement handle" + QString::number(r), d );    return tl;}QSqlIndex QODBCDriver::primaryIndex( const QString& tablename ) const{    typedef QMap<QString,QString> FieldMap;    FieldMap fMap;    QSqlIndex index( tablename );    if ( !isOpen() )	return index;    SQLHANDLE hStmt;    SQLRETURN r = SQLAllocHandle( SQL_HANDLE_STMT,				  d->hDbc,				  &hStmt );    if ( r != SQL_SUCCESS ) {#ifdef QT_CHECK_RANGE	qSqlWarning( "QODBCDriver::primaryIndex: Unable to list primary key", d );#endif	return index;    }    r = SQLSetStmtAttr( hStmt,			SQL_ATTR_CURSOR_TYPE,			(SQLPOINTER)SQL_CURSOR_FORWARD_ONLY,			SQL_IS_UINTEGER );    r = SQLPrimaryKeys( hStmt,			NULL,			0,			NULL,			0,			(SQLCHAR*)tablename.local8Bit().data(),			tablename.length());#ifdef QT_CHECK_RANGE    if ( r != SQL_SUCCESS )	qSqlWarning( "QODBCDriver::primaryIndex: Unable to execute primary key list", d );#endif    r = SQLFetchScroll( hStmt,			SQL_FETCH_NEXT,			0);    // Store all fields in a StringList because some drivers can't detail fields in this FETCH loop    while ( r == SQL_SUCCESS ) {	SQLINTEGER lengthIndicator = 0;	bool isNull;	QString cName = qGetStringData( hStmt, 3, lengthIndicator, isNull ); // column name	fMap[cName] = qGetStringData( hStmt, 5, lengthIndicator, isNull ); // pk index name	r = SQLFetchScroll( hStmt,			    SQL_FETCH_NEXT,			    0);    }    FieldMap::Iterator i;    for (i = fMap.begin();  i != fMap.end(); i++) {    	QSqlField f = qMakeField( d, tablename, ( i.key() ) );	index.append( f );	index.setName( i.data() ); // pk index name    }    r = SQLFreeHandle( SQL_HANDLE_STMT, hStmt );    if ( r!= SQL_SUCCESS )	qSqlWarning( "QODBCDriver: Unable to free statement handle" + QString::number(r), d );    return index;}QSqlRecord QODBCDriver::record( const QString& tablename ) const{    QSqlRecord fil;    QStringList fList;    if ( !isOpen() )	return fil;    SQLHANDLE hStmt;    SQLRETURN r = SQLAllocHandle( SQL_HANDLE_STMT,				  d->hDbc,				  &hStmt );    if ( r != SQL_SUCCESS ) {#ifdef QT_CHECK_RANGE	qSqlWarning( "QODBCDriver::record: Unable to allocate handle", d );#endif	return fil;    }    r = SQLSetStmtAttr( hStmt,			SQL_ATTR_CURSOR_TYPE,			(SQLPOINTER)SQL_CURSOR_FORWARD_ONLY,			SQL_IS_UINTEGER );    r =  SQLColumns( hStmt,		     NULL,		     0,		     NULL,		     0,		     (SQLCHAR*)tablename.local8Bit().data(),		     tablename.length(),		     NULL,		     0 );#ifdef QT_CHECK_RANGE    if ( r != SQL_SUCCESS )	qSqlWarning( "QODBCDriver::record: Unable to execute column list", d );#endif    r = SQLFetchScroll( hStmt,			SQL_FETCH_NEXT,			0);    // Store all fields in a StringList because some drivers can't detail fields in this FETCH loop    while ( r == SQL_SUCCESS ) {	bool isNull;	SQLINTEGER lengthIndicator(0);	fList += qGetStringData( hStmt, 3, lengthIndicator, isNull );		r = SQLFetchScroll( hStmt,			    SQL_FETCH_NEXT,			    0);    }    QStringList::Iterator i;    for (i = fList.begin();  i != fList.end(); i++) {	QSqlField f = qMakeField( d, tablename, (*i) );	fil.append( f );    }    r = SQLFreeHandle( SQL_HANDLE_STMT, hStmt );    if ( r!= SQL_SUCCESS )	qSqlWarning( "QODBCDriver: Unable to free statement handle" + QString::number(r), d );//     QSqlIndex priIdx = primaryIndex( tablename );//     for ( uint i = 0; i < priIdx.count(); ++i )//	fil.field( priIdx.field(i)->name() )->setPrimaryIndex( TRUE );    return fil;}QSqlRecord QODBCDriver::record( const QSqlQuery& query ) const{    QSqlRecord fil;    if ( !isOpen() )	return fil;    if ( query.isActive() && query.driver() == this ) {	QODBCResult* result = (QODBCResult*)query.result();	SQLRETURN r;	SQLSMALLINT count;	r = SQLNumResultCols( result->d->hStmt, &count );#ifdef QT_CHECK_RANGE	if ( r != SQL_SUCCESS )	    qSqlWarning( "QODBCDriver::record: Unable to count result columns", d );#endif	if ( count > 0 && r == SQL_SUCCESS ) {	    for ( int i = 0; i < count; ++i ) {		QSqlField fi = qMakeField( result->d, i );		fil.append( fi );	    }	}    }    return fil;}QSqlRecordInfo QODBCDriver::recordInfo( const QString& tablename ) const{    QSqlRecordInfo fil;    QStringList fList;    if ( !isOpen() )	return fil;    SQLHANDLE hStmt;    SQLRETURN r = SQLAllocHandle( SQL_HANDLE_STMT,				  d->hDbc,				  &hStmt );    if ( r != SQL_SUCCESS ) {#ifdef QT_CHECK_RANGE	qSqlWarning( "QODBCDriver::record: Unable to allocate handle", d );#endif	return fil;    }    r = SQLSetStmtAttr( hStmt,			SQL_ATTR_CURSOR_TYPE,			(SQLPOINTER)SQL_CURSOR_FORWARD_ONLY,			SQL_IS_UINTEGER );    r =  SQLColumns( hStmt,		     NULL,		     0,		     NULL,		     0,		     (SQLCHAR*)tablename.local8Bit().data(),		     tablename.length(),		     NULL,		     0 );#ifdef QT_CHECK_RANGE    if ( r != SQL_SUCCESS )	qSqlWarning( "QODBCDriver::record: Unable to execute column list", d );#endif    r = SQLFetchScroll( hStmt,			SQL_FETCH_NEXT,			0);    // Store all fields in a StringList because some drivers can't detail fields in this FETCH loop    while ( r == SQL_SUCCESS ) {	bool isNull;	SQLINTEGER lengthIndicator(0);	fList += qGetStringData( hStmt, 3, lengthIndicator, isNull );		r = SQLFetchScroll( hStmt,			    SQL_FETCH_NEXT,			    0);    }    QStringList::Iterator i;    for (i = fList.begin();  i != fList.end(); i++) {	QSqlFieldInfo f = qMakeFieldInfo( d, tablename, (*i) );	fil.append( f );    }    r = SQLFreeHandle( SQL_HANDLE_STMT, hStmt );    if ( r!= SQL_SUCCESS )	qSqlWarning( "QODBCDriver: Unable to free statement handle" + QString::number(r), d );//     QSqlIndex priIdx = primaryIndex( tablename );//     for ( uint i = 0; i < priIdx.count(); ++i )//	fil.field( priIdx.field(i)->name() )->setPrimaryIndex( TRUE );    return fil;}QSqlRecordInfo QODBCDriver::recordInfo( const QSqlQuery& query ) const{    QSqlRecordInfo fil;    if ( !isOpen() )	return fil;    if ( query.isActive() && query.driver() == this ) {	QODBCResult* result = (QODBCResult*)query.result();	SQLRETURN r;	SQLSMALLINT count;	r = SQLNumResultCols( result->d->hStmt, &count );#ifdef QT_CHECK_RANGE	if ( r != SQL_SUCCESS )	    qSqlWarning( "QODBCDriver::record: Unable to count result columns", d );#endif	if ( count > 0 && r == SQL_SUCCESS ) {	    for ( int i = 0; i < count; ++i ) {		QSqlFieldInfo fi = qMakeFieldInfo( result->d, i );		fil.append( fi );	    }	}    }    return fil;}SQLHANDLE QODBCDriver::environment(){    return d->hEnv;}SQLHANDLE QODBCDriver::connection(){    return d->hDbc;}QString QODBCDriver::formatValue( const QSqlField* field,				  bool trimStrings ) const{    QString r;    if ( field->isNull() )	r = nullText();    else if ( field->type() == QVariant::DateTime ) {	// Use an escape sequence for the datetime fields	if ( field->value().toDateTime().isValid() ){	    QDate dt = field->value().toDateTime().date();	    QTime tm = field->value().toDateTime().time();		    // Dateformat has to be "yyyy-MM-dd hh:mm:ss", with leading zeroes if month or day < 10	    r = "{ ts '" +		QString::number(dt.year()) + "-" +		QString::number(dt.month()).rightJustify( 2, '0', TRUE ) + "-" +		QString::number(dt.day()).rightJustify( 2, '0', TRUE ) + " " +		tm.toString() +		"' }";	} else	    r = nullText();    } else {	r = QSqlDriver::formatValue( field, trimStrings );    }    return r;}

⌨️ 快捷键说明

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