Я знаю, как получить тип столбцов в стандартной таблице (например, SHOW FIELDS FROM ...
), но есть ли способ получить типы возвращаемых данных из пользовательского запроса с различными выборками столбцов и объединениями разных таблиц (например, SELECT table1.var1,table2.var2 FROM table1 JOIN table2
)?
Статья на сайте MySQL под названием Разработка приложений баз данных с использованием MySQL Connector / C ++ содержит следующий подраздел:
Доступ к метаданным набора результатов
Когда обрабатываемый оператор SQL неизвестен до времени выполнения,
ResultSetMetaData
Интерфейс может использоваться для определения методов, которые будут использоваться для извлечения данных из результирующего набора.ResultSetMetaData
предоставляет информацию о структуре данного набора результатов. Данные предоставленыResultSetMetaData
Объект включает в себя количество столбцов в наборе результатов, имена или метки и типы этих столбцов, а также атрибуты каждого столбца и имена таблицы, схемы и каталога, к которым принадлежит таблица указанного столбца.когда
getMetaData()
называется наResultSet
объект, он возвращаетResultSetMetaData
объект, описывающий столбцы этогоResultSet
объект.Подписи некоторых из соответствующих методов приведены ниже. Для полного списка методов, поддерживаемых
ResultSetMetaData
Интерфейс, проверьте заголовок resultset_metadata.h в вашей установке Connector / C ++./* resultset.h */ ResultSetMetaData * ResultSet::getMetaData() const; /* prepared_statement.h */ ResultSetMetaData * PreparedStatement::getMetaData() const; /* resultset_metadata.h */ std::string ResultSetMetaData::getCatalogName(unsigned int columnIndex); std::string ResultSetMetaData::getSchemaName(unsigned int columnIndex); std::string ResultSetMetaData::getTableName(unsigned int columnIndex); unsigned int ResultSetMetaData::getColumnCount(); unsigned int ResultSetMetaData::getColumnDisplaySize(unsigned int columnIndex); std::string ResultSetMetaData::getColumnLabel(unsigned int columnIndex); std::string ResultSetMetaData::getColumnName(unsigned int columnIndex); int ResultSetMetaData::getColumnType(unsigned int columnIndex); std::string ResultSetMetaData::getColumnTypeName(unsigned int columnIndex); int ResultSetMetaData::isNullable(unsigned int columnIndex); bool ResultSetMetaData::isReadOnly(unsigned int columnIndex); bool ResultSetMetaData::isWritable(unsigned int columnIndex);
Следующий фрагмент кода демонстрирует, как извлечь все имена или метки столбцов, их типы данных и размеры вместе с именем таблицы и именами схем, к которым они принадлежат.
ResultSet *rs; ResultSetMetaData *res_meta; res_meta = rs -> getMetaData(); int numcols = res_meta -> getColumnCount(); cout << "\nNumber of columns in the result set = " << numcols << endl; cout.width(20); cout << "Column Name/Label"; cout.width(20); cout << "Column Type"; cout.width(20); cout << "Column Size" << endl; for (int i = 0; i < numcols; ++i) { cout.width(20); cout << res_meta -> getColumnLabel (i+1); cout.width(20); cout << res_meta -> getColumnTypeName (i+1); cout.width(20); cout << res_meta -> getColumnDisplaySize (i+1) << endl; } cout << "\nColumn \"" << res_meta -> getColumnLabel(1); cout << "\" belongs to the Table: \"" << res_meta -> getTableName(1); cout << "\" which belongs to the Schema: \"" << res_meta -> getSchemaName(1) << "\"" << endl; //delete res_meta; delete rs;
Начиная с версии 1.0.5, разъем заботится о чистке
ResultSetMetaData
объекты автоматически, когда они выходят из области видимости. Это избавит клиентов от удаленияResultSetMetaData
объекты явно. Из-за неявного уничтожения объектов метаданных клиенты не смогут удалитьResultSetMetaData
объекты напрямую. Любая попытка удалитьResultSetMetaData
объект приводит к ошибке времени компиляции. Аналогично используяauto_ptr
шаблон класса для создания экземпляра объекта типаResultSetMetaData
приводит к ошибке времени компиляции. Например, компиляция вышеуказанного кода завершается неудачно с Connector / C ++ 1.0.5 и более поздними версиями, когда операторdelete res_meta;
не комментируется.Подготовленные заявления и метаданные набора результатов
PreparedStatement::getMetaData()
получаетResultSetMetaData
объект, который содержит информацию о столбцахResultSet
объект, который будет возвращен, когдаPreparedStatement
объект выполнен.Потому что
PreparedStatement
объект предварительно скомпилирован, можно узнать оResultSet
возразить, что он вернется без необходимости его выполнения. Следовательно, можно вызвать методgetMetaData
наPreparedStatement
объект, а не ждать, чтобы выполнить его, а затем вызыватьResultSet::getMetaData
метод наResultSet
объект, который возвращается.Метод
PreparedStatement::getMetaData
поддерживается только в Connector / C ++ 1.0.4 и более поздних версиях.
Других решений пока нет …