newbie1992 Ответов: 1

Как получить данные из mysql_querry


Здравствуйте, я пытаюсь получить группу данных из mysql с помощью языка c++
я провел некоторые исследования, но получил только информацию о том, как получить одни данные
для примера

из таблицы "mytable"
есть 2 Колума

один 1-й столбец-это имя
2-я колонка-возраст

в столбце имя я получил
"Джессика", "Джесси" и "Джесси".

возраст был 10, 12, 18 лет

как сохранить все данные в виде списка строк
когда я звоню SELECT * from mytable

Что я уже пробовал:

char* retrieveData(char* sqlStatement) {
		mysql_query(_mysqlCon, sqlStatement);
		_mysqlResult = mysql_store_result(_mysqlCon);
		if((_mysqlRows = mysql_fetch_row(_mysqlResult)) == NULL) return "No student's data was found";
		else while (1) {
			return _mysqlRows[0];
		}
		mysql_free_result(_mysqlResult);
		mysql_close(_mysqlCon);
	}

вот что я сделал.
но в результате я получил только Джессику

когда я меняюсь на _mysqlRow[1];
у меня есть 10

но когда я пытаюсь принести _mysqlRow[2] в _mysqlRow[5]
результат оказался нулевым..

но когда я попробую это сделать
__declspec(dllexport) int dataRow(char* sqlStatement) {
		mysql_query(_mysqlCon, sqlStatement);
		_mysqlResult = mysql_store_result(_mysqlCon);
		return mysql_num_rows(_mysqlResult);
		mysql_free_result(_mysqlResult);
		mysql_close(_mysqlCon);
	}

это на самом деле говорит мне, что строка данных была 6..

Mohibur Rashid

Что произойдет, если вы снова вызовете mysql_fetch_row, прежде чем освободитесь и закроетесь?
Что в конечном итоге произойдет, если вы продолжите это делать?

Скажем, у вас есть 10 строк. И вы сделали это 11 раз, что будет в mysqlrows?
Пожалуйста, расследуйте

1 Ответов

Рейтинг:
11

Jochen Arndt

Прочтите документацию по используемым функциям и посмотрите на некоторые примеры кода. И то, и другое можно найти в интернете.

Чтобы повторить результаты, используйте что-то вроде этого (непроверенное):

MYSQL_RES *result = mysql_store_result(mysqlCon);
if (result != NULL) 
{
    int numFields = mysql_num_fields(result);
    MYSQL_ROW row;
    while ((row = mysql_fetch_row(result))) 
    { 
        // Row
        for (int i = 0; i < numFields; i++) 
        { 
            // Access field with row[i]
        }
    } 
    mysql_free_result(result);
}
else
{
    // Handle no matching data found
}
mysql_close(mysqlCon);

Некоторые заметки:

Не возвращайтесь из функции без очистки. В вашем коде результат может быть не освобожден, и соединение может быть не закрыто.

Вы не должны использовать имена и определения, которые начинаются с подчеркивания. Они зарезервированы для использования реализацией компилятора.


newbie1992

хорошо, сэр... отметил с благодарностью..
кстати, сэр... на самом деле я только что нашел, в чем проблема моего кода..
я делал dll-файл с c++
он используется для извлечения данных из базы данных и возврата значения обратно в c#
это мой код:

из c++

__declspec(dllexport) char* retrieveData(char* sqlStatement, int noOfstatement) {
mysql_query(mysqlCon, sqlStatement);
mysqlResult = mysql_store_result(mysqlCon);
if (! (mysqlResult = = NULL)) {
while ((mysqlRows = mysql_fetch_row(mysqlResult))) {
printf ("%s\t%s\n", mysqlRows[0], mysqlRows[1]);
}
mysql_free_result(mysqlResult);
}
mysql_close(mysqlCon);
}

в c#

[DllImport("C:\\Users\\user\\Desktop\\bookbarConnector\\Debug\\bookbarConnector.dll")]
public static extern intptr retrieveData([MarshalAs(UnmanagedType.LPStr)] string sqlStatement, int noOfstatement);

содержащие вредоносные элементы();
retrieveData(Маршал.PtrToStingAnsi ("select name, ic from studentdatabase where name LIKE 'j%'"), 2);

из приведенного выше кода я могу распечатать только одну строку данных
но после того, как я изменю возвращаемый тип данных на void
это, наконец, дает 4 строки данных

newbie1992

в этом случае есть ли что-нибудь для хранения данных, которые я получил из запроса?

моя идея состоит в том, чтобы попытаться протолкнуть весь элемент, который я получил из querry, в список символов
затем медленно передайте строку в c#.
это хорошая практика? или есть какая-нибудь лучшая рекомендация?

Jochen Arndt

Почему вы хотите вызвать библиотеку DLL C++ вместо использования соединителя MySQL C#?

Это делает все намного сложнее. Вам нужно будет вернуть строковый массив, который требует правильного выделения в библиотеке DLL C++. Это также приведет к потере возможности возвращать нестроковые данные (например, даты и значения с плавающей запятой), которые подвержены ошибкам преобразования.

Чтобы избежать вышесказанного, вам придется вернуть массив вариантных данных. Это был бы "профессиональный" метод, но это довольно сложная задача.

newbie1992

я создаю этот dll файл
так что мой c# будет сосредоточен только на пользовательском интерфейсе
и dll файл будет выступать в качестве движка для этой программы
это плохая идея, сэр?

Jochen Arndt

Это плохая идея, потому что вы делаете ее сложной и запутанной. Перемещение кода в библиотеку DLL не приведет к его исчезновению. Он по-прежнему будет частью вашего приложения и, скорее всего, не будет использоваться никаким другим приложением.

Просто поместите операции с базой данных в собственный класс C#.

newbie1992

Хорошо, сэр ... спасибо за совет