首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在MySql中使用字符串操作函数有什么问题?

问在MySql中使用字符串操作函数有什么问题?
EN

Stack Overflow用户
提问于 2019-11-02 03:09:49
回答 2查看 40关注 0票数 0

我有一个MySQL 8.0.17数据库示例项目,我正在64位windows计算机上使用Visual Studio CE 2017编译。这是一个控制台应用程序。请看下面的代码,它是样板。我遇到的问题是在初始化数据库后尝试操作字符串时。即:取消注释sprintf_s()会导致抛出异常。我在试着理解这是出于某种原因的设计,还是一个bug?或者我可能还做错了什么?

代码语言:javascript
复制
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版本中不是这样工作的,在5.7版本中,我可以建立连接,然后执行几个语句。任何回应都会非常感谢,因为我已经在这方面挣扎了一段时间了……

以下是当编译中包含sprintf_s()时,调试器在调用mysql_num_rows()时抛出的异常...

ConsoleApplication1.exe中的0x00007FFED78550C0 (libmysql.dll)处引发异常: 0xC0000005:访问冲突读取位置0x0000000000000000。

因此,我将其精简为尽可能少的行,以重现错误:

代码语言:javascript
复制
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);
}

为什么会发生这种情况呢?谢谢,布莱恩..。

EN

回答 2

Stack Overflow用户

发布于 2019-11-02 03:44:10

您没有检查是否有任何行字段为空

改为使用

代码语言:javascript
复制
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");
}
票数 0
EN

Stack Overflow用户

发布于 2019-11-04 10:48:53

感谢那些回答了我问题的人。我回滚到MySQL的5.7版本,它工作正常。也许我尝试采用最新的8.0版本有点太早了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58664597

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档