如何使用mysql.h在C ++中处理MySQL NULL?

时间:2013-01-24 01:30:02

标签: c++ mysql null

我正在尝试检查if中的某些字段值。 MySQL中的大多数值都是NULL

似乎搞砸了一切。

我做

while ((row = mysql_fetch_row(res)) !=NULL){
    if(row[1] != "-1"){
        rows.push_back(row[0]);
    }
}

row[1]的字段是INT LENGTH 1,等于1-1NULL。大多数是NULL,但有些是-1。我认为 mysql.h将所有值输出为char*(至少这是我迄今为止能够让它工作的唯一方式)。

无论如何,奇怪的是,rows被填满了,但它充满了“没有”。我甚至不确定它是空字符串还是什么。

请帮忙。

非常感谢提前!


我在std::cout循环中将rows[i] for放在前面和后面。它输出了大量的-- s。

如果我std::cout原始row[0],则输出正常。


对于us2012:

std::vector< char* > rows;

while ((row = mysql_fetch_row(res)) !=NULL){
    std::cout << "-" << row[0] << "-" << std::endl;
    if(row[1] != "-1"){
        rows.push_back(row[0]);
    }
}

std::cout << "Valids:" << std::endl;
for(int i = 0; i < rows.size(); ++i)
{
    std::cout << "id: -" << rows[i] << "-" << std::endl;
}

当我使用它时

if(row[1] && row[1] != "-1")

if反向运作。

注意:我在intwhilecout以及rows中增加了invalidRows。该计数器提供389rows.size() 2invalidRows.size() 387

我会在 cout之后row[0] {<1}}看看我是否可以if cout


row[0]输出正确数据后,

if if(row[1] != "-1")


...forbids comparison between pointer and integer...提供mysql.h


为什么if(row[1] && std::string(row[1]).compare("-1") != 0)

CentOS的。我几乎找不到任何东西,我的主人也没有支持。


invalidRows将所有内容都放入row[

没有gave]&amp;&amp; if(row[1] && std::string(row[1]).compare("-1") == 0) what():basic_string :: _ S_construct NULL无效已中止`


答案

一直是std::vector< std::string >!我的逻辑搞砸了所有C ++崩溃问题。

使用row[x]可以push _back为{{1}}。

1 个答案:

答案 0 :(得分:2)

首先要做的事情:您使用的API是C API。这没有什么本质上的错误,但这意味着你必须处理许多似乎不必要的东西,因为  C ++有更好的工具可用于此。如果可能的话,你应该使用像MySQL ++这样的C ++包装器:http://tangentsoft.net/mysql++/(这个建议的所有学分转到下面的评论中的@ Non-Stop Time Travel)


在您的原始代码中,您不是在比较字符串,而是在比较地址。您的条件将row[1]中存储的内存地址与常量字符串文字"-1"的内存地址进行比较。您真正想要的是({1}})char *C++ Compare char array with string

您还要推回指向strcmp的指针,这是暂时的,它会在while循环的每次迭代中重新分配!你必须复制这些并存储指向副本的指针。

这是一个非常快速的想法,你如何处理这个问题。虽然不是很好的C ++(事实上,如果它不是为了矢量和cout,它也可能是C.见上面的原因。):

row[0]

一般来说,当你在C ++中处理字符串时,我建议使用#include <string.h> std::vector<char*> rows; while ((row = mysql_fetch_row(res)) !=NULL){ if(strcmp(row[1],"-1") != 0){ char * store = new char[strlen(row[0])+1]; strncpy(store ,row[0] ,strlen(row[0])+1); rows.push_back(store); } } std::cout << "Valids:" << std::endl; for(int i = 0; i < rows.size(); ++i) { std::cout << "id: -" << rows[i] << "-" << std::endl; } //clean up for(int i = 0; i < rows.size(); ++i) { delete [] rows[i]; } std::string而不是,但这里有问题 - 如果你的mysql行包含二进制数据,你就不要t已经保证以空值终止的字符串了(请参阅此处的MYSQL_ROW规范:http://dev.mysql.com/doc/refman/5.0/en/c-api-data-structures.html)。正如 Non-Stop Time Travel 在下面的评论中所指出的,{{ 1}}支持内部std::string::compare,但下面的代码示例不适用于它们。

std::string