Получить тип возвращаемых данных в запросе MySQL

Я знаю, как получить тип столбцов в стандартной таблице (например, SHOW FIELDS FROM ...), но есть ли способ получить типы возвращаемых данных из пользовательского запроса с различными выборками столбцов и объединениями разных таблиц (например, SELECT table1.var1,table2.var2 FROM table1 JOIN table2)?

3

Решение

Статья на сайте 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 и более поздних версиях.

8

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]