From: Carlos G.A. <car...@ho...> - 2002-04-29 16:56:28
|
Hello: I´m working with the driver since a week ago and i found some errors, at this moment i have only a problem within fix with the update of the BLOB fields, the other errors that i have encountered are explained in this mail. Best Regards Carlos Guzmán Álvarez P.D.: Sorry about my bad English but i´m Spanish. Main.cpp: 1.- In the SQLDisconnect function the block: #ifdef LOGGING fclose (logFile); #endif should be: #ifdef LOGGING if ( logFile ) fclose (logFile); #endif 2.- The SQLSetConnectOption don´t work the problem is inthe parameters type it should be: RETCODE SQL_API SQLSetConnectOption (HDBC arg0, SQLUSMALLINT arg1, SQLUINTEGER arg2) { TRACE ("SQLSetConnectOption"); return SQLSetConnectAttr (arg0, arg1, (SQLPOINTER *)arg2, 0); } OdbcStatement.cpp 1.- The OdbcStatement::setParameter method don´t wotk good with SQL_C_CHAR parameters that aren´t null terminated strings I fixed it adding a new method to the PreparedStatement class and implementingg it in the IscPreparedStatement and IscCallableStatement classes, this new method can pass the length of the string: .... switch(binding->sqlType) { case SQL_CHAR: case SQL_VARCHAR: { /* * binding->precision is a new property of the class Binding */ statement->setString (parameter, (char*) binding->pointer, binding->precision); } break; } .... Sqlda.cpp: 1.- Sqlda::allocbuffer makes that the data returned by a SQLStatement was incorrect and that SQLColAttributes returned bad results for SQL_COLUMN_LENGTH. SQL_COLUMN_DISPLAY_SIZE, ..., i fixed this commenting this line: var->sqllen = length; With this line commented it´s neccesary other change in: IscStatement.cpp In the method IscStatement::setValue: .... case SQL_TEXT: { char *data = (char*) var->sqldata; data [var->sqllen] = 0; value->setString (data, false); } break; IscStatement.cpp 1.- The getIscDate method of the class IscStatement should be: ( this error already has been posted in a past message ) ISC_DATE IscStatement::getIscDate(DateTime value) { return value.date; } IscIndexInfoResultSet.cpp 1.- The method IscIndexInfoResultSet::getIndexInfo is incorrect it should be: void IscIndexInfoResultSet::getIndexInfo(const char * catalog, const char * schemaPattern, const char * tableNamePattern, bool unique, bool approximate) { const char *v6 = "select NULL as table_cat,\n" // 1 "\tNULL as table_schem,\n" // 2 "\tidx.rdb$relation_name as table_name,\n" // 3 "\tidx.rdb$unique_flag as non_unique,\n" // 4 "\tNULL as index_qualifier,\n" // 5 "\tidx.rdb$index_name as index_name,\n" // 6 "\t(3) as \"TYPE\",\n" // 7 (SQL_INDEX_OTHER) "\tseg.rdb$field_position as ordinal_position,\n" // 8 "\tseg.rdb$field_name as column_name,\n" // 9 "\tidx.rdb$index_type as asc_or_desc,\n" // 10 "\tidx.rdb$statistics as cardinality,\n" // 11 "\tNULL as \"PAGES\",\n" // 12 "\tNULL as filter_condition\n" // 13 "from rdb$indices idx, rdb$index_segments seg\n" " where idx.rdb$index_name = seg.rdb$index_name\n"; const char *preV6 = "select NULL as table_cat,\n" // 1 "\tNULL as table_schem,\n" // 2 "\tidx.rdb$relation_name as table_name,\n" // 3 "\tidx.rdb$unique_flag as non_unique,\n" // 4 "\tNULL as index_qualifier,\n" // 5 "\tidx.rdb$index_name as index_name,\n" // 6 "\t(3) as odbc_type,\n" // 7 (SQL_INDEX_OTHER) "\tseg.rdb$field_position as ordinal_position,\n" // 8 "\tseg.rdb$field_name as column_name,\n" // 9 "\tidx.rdb$index_type as asc_or_desc,\n" // 10 "\tidx.rdb$statistics as cardinality,\n" // 11 "\tNULL as odbc_pages,\n" // 12 "\tNULL as filter_condition\n" // 13 "from rdb$indices idx, rdb$index_segments seg\n" " where idx.rdb$index_name = seg.rdb$index_name\n"; JString sql = (metaData->storesMixedCaseQuotedIdentifiers()) ? v6 : preV6; if (tableNamePattern) sql += expandPattern (" and idx.rdb$relation_name %s '%s'\n", tableNamePattern); if (unique) sql += " and idx.rdb$unique_flag = 1"; sql += " order by idx.rdb$relation_name, idx.rdb$unique_flag, idx.rdb$index_name, seg.rdb$field_position"; prepareStatement (sql); numberColumns = 13; } IscPrimaryKeysResultSet.cpp 1.- The method IscPrimaryKeysResultSet::getPrimaryKeys is incorrect it should be: void IscPrimaryKeysResultSet::getPrimaryKeys(const char * catalog, const char * schemaPattern, const char * tableNamePattern) { JString sql = "select NULL as table_cat,\n" // 1 "\tNULL as table_schem,\n" // 2 "\trel.rdb$relation_name as table_name,\n" // 3 "\tseg.rdb$field_name as column_name,\n" // 4 "\tseg.rdb$field_position as key_seq,\n" // 5 "\tidx.rdb$index_name as pk_name\n" // 6 "from rdb$relation_constraints rel, rdb$indices idx, rdb$index_segments seg\n" " where rel.rdb$constraint_type = 'PRIMARY KEY'\n" " and rel.rdb$index_name = idx.rdb$index_name\n" " and idx.rdb$index_name = seg.rdb$index_name\n"; if (tableNamePattern) sql += expandPattern (" and rel.rdb$relation_name %s '%s'", tableNamePattern); sql += " order by rel.rdb$relation_name, idx.rdb$index_name, seg.rdb$field_position"; prepareStatement (sql); numberColumns = 6; } IscProcedureColumnsResultSet.cpp 1.- The method IscProcedureColumnsResultSet::getProcedureColumns is incorrect it should be: void IscProcedureColumnsResultSet::getProcedureColumns(const char * catalog, const char * schemaPattern, const char * procedureNamePattern, const char * columnNamePattern) { JString sql = "select NULL as table_cat,\n" // 1 "\tNULL as table_schem,\n" // 2 "\tpp.rdb$procedure_name as procedure_name,\n" // 3 "\tpp.rdb$parameter_name as column_name,\n" // 4 "\tpp.rdb$parameter_type as column_type,\n" // 5 "\tpp.rdb$field_type as data_type,\n" // 5 + 1 "\tpp.rdb$field_sub_type as type_name,\n" // 6 + 1 "\tpp.rdb$field_length as column_size,\n" // 7 + 1 "\tnull as buffer_length,\n" // 8 + 1 "\tf.rdb$field_scale as decimal_digits,\n" // 9 + 1 "\t10 as num_prec_radix,\n" // 10 + 1 "\tf.rdb$null_flag as nullable,\n" // 11 + 1 "\tf.rdb$description as remarks,\n" // 12 + 1 "\tf.rdb$default_value as column_def,\n" // 13 + 1 "\tnull as SQL_DATA_TYPE,\n" // 14 + 1 "\tnull as SQL_DATETIME_SUB,\n" // 15 + 1 "\tf.rdb$field_length as CHAR_OCTET_LENGTH,\n" // 16 + 1 "\tpp.rdb$parameter_number as ordinal_position,\n" // 17 + 1 "\t'YES' as IS_NULLABLE\n" // 18 + 1 "from rdb$procedure_parameters pp, rdb$fields f\n" "where pp.rdb$field_source = f.rdb$field_name"; if (procedureNamePattern) sql += expandPattern (" and pp.rdb$procedure_name %s '%s'", procedureNamePattern); if (columnNamePattern) sql += expandPattern (" and pp.rdb$parameter_name %s '%s'", columnNamePattern); sql += " order by pp.rdb$procedure_name, pp.rdb$parameter_number"; prepareStatement (sql); numberColumns = 19; } _________________________________________________________________ Envíe y reciba su correo de Hotmail desde el móvil: http://mobile.msn.com |