2014-02-28 3 views
0

Есть ли вызов API, предоставляемый mysql ++, для получения количества строк, возвращаемых результатом?mysql ++ (mysqlpp): как получить число строк в результате до итерации с помощью fetch_row через UseQueryResult

У меня есть код структурирована следующим образом:

// ... 
Query q = conn.query(queryString); 
if(mysqlpp::UseQueryResult res = query.use()){ 
    // some code 

    while(mysqlpp::Row row = res.fetch_row()){ 


    } 
} 

Мой предыдущий вопрос here будет решена легко, если функция, которая возвращает количество строк результата. Я могу использовать его для выделения памяти этого размера и заполнения, поскольку я повторяю строку за строкой.

ответ

0

В случае, если кто работает в этом: цитирую user manual:

Самый прямой способ получить набор результатов является использование Query :: магазин(). Это возвращает объект StoreQueryResult, , который происходит из std :: vector, что делает его контейнером с произвольным доступом для строк. В свою очередь, каждый объект Row похож на std :: vector объектов String, по одному для каждого поля в наборе результатов. Таким образом, вы можете рассматривать StoreQueryResult как двумерный массив: вы можете получить пятое поле во второй строке, просто указав result[1][4]. Вы также можете получить доступ к элементам строки по имени поля, например: result[2]["price"].

И

Менее прямой способ работы с результатами запроса является использование Query :: использование(), который возвращает объект UseQueryResult. Этот класс действует как входной итератор STL, а не std :: vector: вы проходите обработку результатов набора по одной строке за раз, всегда вперед. Вы не можете искать в результирующем наборе, и вы не можете узнать, сколько результатов пока что не найдено конца. При оплате этих неудобств вы получаете лучшую эффективность памяти, , потому что весь набор результатов не нужно хранить в ОЗУ. Это очень полезно, когда вам нужны большие результирующие наборы.

Предложение найдено here: http://lists.mysql.com/plusplus/9047

является использование COUNT (*) запрос и получать тот результат, а затем использовать Query.use снова. Чтобы избежать несогласованного подсчета, можно обернуть два запроса в одну транзакцию следующим образом:

START TRANSACTION; 
BEGIN; 

SELECT COUNT(*) FROM myTable; 

SELECT * FROM myTable; 

COMMIT; 
+0

Этот подход работал отлично со мной. –