我正在使用CODBCRecordset(在CodeProject上找到的类)来查找包含39列的表中的单个记录。如果没有找到记录,那么对CRecordset :: Open的调用就可以了。如果记录符合条件,那么当调用CRecordset :: Open时,我会得到Out of Memory异常。我正在选择查询中的所有列(如果我更改查询以仅选择其中一个具有相同where子句的列,则无例外)。
我认为这是因为CRecordset的一些限制,但我找不到任何告诉我任何限制的东西。该表只有39列。
有没有人遇到这个问题?如果是这样,你有解决办法吗?
这是一个使用Visual Studio 6.0的MFC项目,如果它有任何区别。
这是查询(在这里格式化,所以wold显示没有滚动条):
SELECT `id`, `member_id`, `member_id_last_four`, `card_number`, `first_name`, `mi`, `last_name`, `participant_title_id`, `category_id`, `gender`, `date_of_birth`, `address_line_1`, `address_line_2`, `city`, `state`, `zip`, `phone`, `work_phone`, `mobile_phone`, `fax`, `email`, `emergency_name`, `emergency_phone`, `job_title`, `mail_code`, `comments`, `contract_unit`, `contract_length`, `start_date`, `end_date`, `head_of_household`, `parent_id`, `added_by`, `im_active`, `ct_active`, `organization`, `allow_members`, `organization_category_id`, `modified_date` FROM `participants` WHERE `member_id` = '27F7D0982978B470C5CF94B1B833CC93F997EE23'
复制并粘贴到我的查询浏览器中只能得到一个结果。
更多信息:
除了id之外,select语句中的每一列都被注释掉了。跑过查询,没有例外。
然后我系统地浏览并取消注释每一列,一次一个,并在每个取消注释之间重新运行查询。
当我取消注释评论栏时,我收到错误。
这定义如下(使用MySQL):LONGTEXT
答案 0 :(得分:2)
我们可以假设你的意思是你正在调用C ODBC Recordset :: 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字节)。不用说,它无法为该领域分配足够的内存。
微软承认这是一个问题,请看一下这些解决方案:
在问题补遗后编辑:
因此,鉴于您的MySQL字段是LONGTEXT,看起来CRecordSet正在尝试为其分配最大可能大小(2G)。你真的需要2 gig的评论字段吗?按每周80次打字,6cpw需要打字员7年多一点才能填满这个领域,每天工作24小时不休息: - )。
查看数据库中的所有列以查看它们是否具有适当的数据类型可能是一项有用的练习。我不是说你不能有一个2G专栏,只是你应该确定它是必要的,特别是考虑到当前的ODBC类不能用于字段这一事实那很大。
答案 1 :(得分:0)
阅读Pax的回复。它让您非常了解问题发生的原因。
解决方法:
仅当定义为(TEXT,LONGTEXT等)的字段为NULL(并且可能为空)时才会发生此错误。如果该字段中有数据,那么它将只分配字段中数据的大小而不是最大大小(从而导致错误)。
因此,如果您确实需要拥有这些大字段。这是一个潜在的解决方案:
'<blank>'
)答案 2 :(得分:0)
我是第二个Pax的建议,这个错误是由于试图分配一个足够大的缓冲区来保持最大的LONGTEXT。在获取数据之前,客户端不知道数据有多大。
LONGTEXT确实比大多数应用程序中所需的大。请考虑使用MEDIUMTEXT(最大尺寸16MB)或仅使用TEXT(最大尺寸64KB)。
PHP数据库接口存在类似问题。 PHP通常具有内存大小限制,任何LONGBLOB或LONGTEXT的提取都可能超过该限制。