У меня есть пример проекта базы данных MySQL 8.0.17, который я компилирую с использованием Visual Studio CE 2017 на 64-битной машине с Windows. Это консольное приложение. Посмотрите код ниже, это шаблон. У меня проблема при попытке манипулировать строками после инициализации базы данных. то есть: раскомментирование sprintf_s () вызывает исключение. Я пытаюсь понять, если это как-то по замыслу или это ошибка? Или есть что-то еще, что я могу делать неправильно?
include "pch.h"
include <windows.h>
include <iostream>
include <winsock.h>
include <stdio.h>
include <mysql.h>
int main()
{ std::cout << "Hello World!\n";
MYSQL conn;
MYSQL_RES *res_set;
MYSQL_ROW row;
mysql_init(&conn);
char str[6];
// sprintf_s(str, 5, "test");
if(!mysql_real_connect(&conn,"localhost","usr","pas","db",0,NULL,0))
{ fprintf(stderr, "Connection Failed: %s\n", mysql_error(&conn));
} else
{ fprintf(stderr, "Successfully connected to Database.\n");
int status = mysql_query(&conn, "SELECT * FROM users");
res_set = mysql_store_result(&conn);
int count = mysql_num_rows(res_set);
printf("No of rows = %d\n", count);
while ((row = mysql_fetch_row(res_set)) != NULL)
{ for (int i = 0; i < mysql_num_fields(res_set); i++)
{ printf("%s \t", row != NULL ? row : "NULL");
} printf("\n");
}
}
mysql_close(&conn);
// getchar();
return 0;
}
Мне интересно, если я помещу sprintf_s () над mysql_init (), он будет работать нормально? Значит ли это, что мне нужно открывать новое соединение по каждому запросу? Потому что это не сработало в версии 5.7, где я мог установить соединение и выполнить несколько операторов. Любой ответ был бы очень признателен, так как я уже некоторое время борюсь с этим ...
Ниже приведено исключение, которое выдается отладчиком при вызове mysql_num_rows (), когда sprintf_s ()включено в компиляцию ...
Исключение, выданное в 0x00007FFED78550C0 (libmysql.dll) в ConsoleApplication1.exe: 0xC0000005: Местоположение чтения нарушения доступа 0x0000000000000000.
Итак, я сократил его до несколькихлинии как можно воспроизвести ошибку:
int main()
{ MYSQL conn;
MYSQL_RES *res_set;
mysql_init(&conn);
char str[50];
strcpy_s(str, "test");
if (mysql_real_connect(&conn,"localhost","user","pass","db",0,NULL,0))
{ int status = mysql_query(&conn, "SELECT * FROM users");
res_set = mysql_store_result(&conn);
int count = mysql_num_rows(res_set); // Exception is thrown here.
}
mysql_close(&conn);
}
Теперь, почему это происходит? Спасибо, Брайан ..