📄 qsql_odbc.cpp
字号:
#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 + -