Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ &引用;“内存不足”;从MySQL中选择长文本列时CRecordset中出现异常_C++_Mysql_Database_Mfc_Recordset - Fatal编程技术网

C++ &引用;“内存不足”;从MySQL中选择长文本列时CRecordset中出现异常

C++ &引用;“内存不足”;从MySQL中选择长文本列时CRecordset中出现异常,c++,mysql,database,mfc,recordset,C++,Mysql,Database,Mfc,Recordset,我使用CODBCRecordset(CodeProject上的一个类)在一个有39列的表中查找一条记录。如果未找到任何记录,则可以调用CRecordset::Open。如果记录与条件匹配,则在调用CRecordset::Open时会出现内存不足异常。我正在选择查询中的所有列(如果我将查询更改为仅选择一个具有相同where子句的列,则没有例外) 我想这是因为CRecordset中有一些限制,但我找不到任何东西告诉我任何限制。该表只有39列 有人遇到过这个问题吗?如果是这样,您是否有解决方案 这是一

我使用CODBCRecordset(CodeProject上的一个类)在一个有39列的表中查找一条记录。如果未找到任何记录,则可以调用CRecordset::Open。如果记录与条件匹配,则在调用CRecordset::Open时会出现内存不足异常。我正在选择查询中的所有列(如果我将查询更改为仅选择一个具有相同where子句的列,则没有例外)

我想这是因为CRecordset中有一些限制,但我找不到任何东西告诉我任何限制。该表只有39列

有人遇到过这个问题吗?如果是这样,您是否有解决方案

这是一个使用VisualStudio6.0的MFC项目,如果有什么不同的话

以下是查询(在此处格式化,以便在不显示滚动条的情况下显示):

选择'id'、'member\u id'、'member\u id\u last\u four'、'card\u number'、'first\u name', `mi`、`last\u name`、`participant\u title\u id`、`category\u id`、`gender`、, `出生日期、地址行、地址行、城市、州、, `zip`、`phone`、`work\u phone`、`mobile\u phone`、`fax`、`email`、, `紧急情况名称','紧急情况电话','职务','邮件代码', `注释“,”合同单位“,”合同长度“,”开始日期“, `结束日期“,”户主“,”家长id“,”由“,”添加“,”激活“, `ct_活动“”、`organization`、`allow_members`、`organization_category_id`、, `修改日期` 来自“参与者” 其中'member_id'=“27F7D0982978B470C5CF94B1B833CC93F997EE23” 复制并粘贴到我的查询浏览器中只会得到一个结果

更多信息:

注释掉select语句中除id之外的每一列。运行查询,无异常

然后,我系统地检查并取消对每一列的注释,一次一列,并在每个取消注释之间重新运行查询

当我取消注释注释列时,我得到了错误


它的定义如下(使用MySQL):LONGTEXT

我们可以假设您的意思是调用CODBCRecordset::Open(),是吗?或者更准确地说,类似于:

CDatabase db;
db.Open (NULL,FALSE,FALSE,"ODBC;",TRUE);
CODBCRecordSet rs (&db);
rs.Open ("select blah, blah, blah from ...");
响应后编辑:

各种ODBC驱动程序中存在一些已知的错误,这些错误似乎是由检索无效字段长度引起的。请参阅以下链接:

这似乎是因为CRecordset将分配一个足够大的缓冲区来保存字段。由于列返回的长度为零,因此它被解释为最大32位大小(~2G),而不是最大8位大小(255字节)。不用说,它无法为字段分配足够的内存

Microsoft已承认这是一个问题,请查看以下解决方案:

问题补遗后编辑:

因此,考虑到您的MySQL字段是一个长文本,CRecordSet似乎正在尝试为其分配最大可能大小(2G)。你真的需要2 gig的评论栏吗?以每分钟80分钟的速度打字,6cpw需要一名打字员7年多一点的时间来填写该字段,每天24小时不休息地工作:-)


查看数据库中的所有列,看看它们是否具有适当的数据类型,这可能是一个有用的练习。我并不是说你不能拥有2G列,只是你应该确定这是必要的,特别是考虑到当前的ODBC类不能处理这么大的字段。它能让你更好地理解问题发生的原因

解决办法:

仅当定义为(TEXT、LONGTEXT等)的字段为NULL(可能为空)时,才会发生此错误。如果字段中有数据,则它将仅为字段中的数据分配大小,而不是最大大小(从而导致错误)

所以,如果有一种情况,你必须有这些大的场。以下是一个潜在的解决方案:

  • 在数据库中为字段指定默认值。(即,
  • 然后在显示值时;如果找到默认值,则传递NULL/empty
  • 然后在更新值时;如果发现NULL/empty,则传递默认值

  • 我支持Pax的建议,即这个错误是由于试图分配一个足够大的缓冲区来容纳尽可能大的长文本。客户端在获取数据之前不知道数据有多大

    在大多数应用程序中,LONGTEXT确实比您需要的要大得多。考虑使用中等文本(最大大小16MB)或只是文本(最大大小64KB)代替。
    PHP数据库接口中也存在类似的问题。PHP通常有一个内存大小限制,对LONGBLOB或LONGTEXT的任何获取都可能超过该限制。

    是。然后,当我调试代码时,它会在CODBCRecordset::Open函数中的CRecordset::Open命令处引发异常。虽然我无法使用任何信息来修复我的问题,但这是我问题的根源。导致问题的列在MySQL数据库中定义为LONGTEXT。这就是内存不足异常的原因。有关更多详细信息,请参阅原始帖子。
    CDatabase db;
    db.Open (NULL,FALSE,FALSE,"ODBC;",TRUE);
    CODBCRecordSet rs (&db);
    rs.Open ("select blah, blah, blah from ...");