В чем проблема использования функций манипуляции со строками с MySql? - PullRequest
0 голосов
/ 01 ноября 2019

У меня есть пример проекта базы данных 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);
}

Теперь, почему это происходит? Спасибо, Брайан ..

Ответы [ 2 ]

0 голосов
/ 04 ноября 2019

Спасибо тем, кто ответил на мой вопрос. Я откатился до версии 5.7 MySQL, и она работает правильно. Возможно, я попытался принять более новую версию 8.0 немного раньше .?

0 голосов
/ 01 ноября 2019

Вы не проверяете, являются ли поля строк пустыми

Используйте вместо

while ((row = mysql_fetch_row(res_set)) != NULL)
{ for (int i = 0; i < mysql_num_fields(res_set); i++)
  {
    printf("%s ", row[i] ? row[i] : "NULL");  
  } 
  printf("\n");
}
...