"out of memory"の例外をCRecordsetを選択する際にLONGTEXTカラムからMySQL
質問
を使用していCODBCRecordset(クラスからCodeProject)を単一の記録テーブル39列あります。ていない場合の記録はその後に呼び出CRecordset::オープンに影響はありません。る場合の条件を取得し、メモリが不足する場合の例外でCRecordset::オープン呼び出されます。私が選択すべての列のデフォを変更した場合、購入したクエリのものをつ選んでくださ列の同一のwhere句を利用しています。
っているものと推察されるが一部の制限CRecordsetができません聞かせていただきましての限界がある。のテーブルのみ39列あります。
で走るのですが。といってい周辺/ソリューション?
このMFCプロジェクトをVisual Studio6.0ます。
このクエリー(形式となってい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'
コピー&ペーストに私のクエリーのブラウザだったら一つだけます。
詳細情報:
コメントアウトされてい各カラムのselectステート以外のid。走エリの例外ではありません。
そして系統的によって、uncommented各カラムは、同時に、再たクエリにとstrncasecmp.
私strncasecmpコメント欄にそのエラーになります。
この定義として以下の(MySQL):LONGTEXT
解決 3
Paxの応答を読みます。これにより、問題が発生する理由を深く理解できます。
回避策:
このエラーは、(TEXT、LONGTEXTなど)として定義されたフィールドがNULL(および場合によっては空)の場合にのみ発生します。フィールドにデータがある場合、最大サイズではなく、フィールドのデータのみをサイズに割り当てます(それによりエラーが発生します)。
したがって、これらの大きなフィールドが絶対に必要な場合があります。考えられる解決策は次のとおりです。
- フィールドをデータベースのデフォルト値に設定します。 (つまり、
'< blank>'
) - 値を表示するとき;デフォルト値が見つかった場合は、NULL /空を渡します。
- 値を更新するとき; NULL /空が見つかった場合、デフォルト値を渡します。
他のヒント
C ODBC Recordset :: Open()を呼び出していることを想定できますか?より正確には、次のようなものです:
CDatabase db;
db.Open (NULL,FALSE,FALSE,"ODBC;",TRUE);
CODBCRecordSet rs (&db);
rs.Open ("select blah, blah, blah from ...");
応答後に編集:
さまざまなODBCドライバーには、無効なフィールド長を取得したことが原因であると思われるいくつかの既知のバグがあります。これらのリンクを参照してください:
- http://forums.microsoft.com/msdn/showpost .aspx?postid = 2700779& siteid = 1
- https://connect.microsoft.com/VisualStudio/feedback /ViewFeedback.aspx?FeedbackID=296391
これは、CRecordsetがフィールドを保持するのに十分な大きさのバッファを割り当てるためです。列がゼロの長さを返すため、最大8ビットサイズ(255バイト)ではなく、最大32ビットサイズ(〜2G)として解釈されます。言うまでもなく、フィールドに十分なメモリを割り当てることができません。
Microsoftはこれを問題として認識しています。解決策については以下をご覧ください。
質問補遺の後に編集:
したがって、MySQLフィールドがLONGTEXTである場合、CRecordSetは最大サイズ(2G)を割り当てようとしているように見えます。コメントフィールドに2ギガが本当に必要ですか? 80 wpmで入力すると、6cpwはタイピストがそのフィールドを埋めるのに7年強かかり、休むことなく1日24時間働きます:-)。
データベース内のすべての列を見て、適切なデータ型があるかどうかを確認することは、役に立つ練習になるかもしれません。特に、現在のODBCクラスがフィールドで機能しないという事実に照らして、2Gカラムができないとは言っていません。その大きい。
った人に勧めるこのエラーに伴う割り当てをバッファに十分に大きいの最大のLONGTEXT可能です。顧客は知らないう大型のデータはこれまで取得します。
LONGTEXTあうように来る必要はほとんどのアプリケーション.利用をお考えのMEDIUMTEXT(最大サイズ16MB)やテキスト(最大サイズ64KB)です。
あるのと同様の問題PHPのデータベースのインタフェースPHPは通常のメモリサイズ制限および他のフェッチのLONGBLOBはLONGTEXTれを超えることを制限します。