1024バイト以上の文字列を扱うには?


まるささ  2011-03-17 16:35:29  No: 72458  IP: 192.*.*.*

はじめまして、サービスとして動作させるプログラムを作成しています。
プログラムの中で、DBにアクセスする為、プログラム中にSQLを
記述しているのですが、SQLの長さが1024バイト以上ある場合、
途中で切れてしまうのです。

具体的には、4096バイトのchar型の配列にSQLを下記のようにセット
します。

char temp[4096] ;

strcpy_s(temp, sizeof(temp), "select .........") ;
strcat_s(temp, sizeof(temp), "  from ....") ;
strcat_s(temp, sizeof(temp), "  where ....") ;

このようにしているのですが、1024バイトを境に、strcat_sで文字列が
tempに足しこまれないという状況です。

たとえば、上の「where」の「h」の部分が1024バイト目だった場合、
tempには、「wh」までは、セットされますが、それ以降がセットされませ
ん。

デバッガでは、配列自体は、4096バイト確保されているようなのですが
1024バイト目以降に、文字列がセットされないのは、何か設定など
があるのでしょうか?
charの配列を使用せず、CStringクラスを使用しても、1024バイトまでは
文字列を足しこむことができますが、1024バイト目以降が無視されて
しまい、困っています。
何か、お分かりの片いたら、教えてもらえませんか?

編集 削除
tetrapod  2011-03-17 17:58:43  No: 72459  IP: 192.*.*.*

char [4096] に対して 1024 バイト以後に文字がセットされない、なんてことは
絶対無いので、少なくとも 提示 temp に関しては、セットされる。
# ウチで試した範囲では問題ない

temp から SQL ドライバに渡す際に欠落しているのだと思うが?

ただ、文字の単純結合で SQL 文を生成するのは SQL インジェクションの元なので
セキュリティ的に問題ないか要精査。実際のところ再考慮したほうがいい。
# strcat で結合するくらいなら sprintf/snprintf のほうがいいと思うが?

編集 削除
Blue  2011-03-17 18:01:20  No: 72460  IP: 192.*.*.*

何で確認していますか?
TRACEマクロ?

TRACEマクロなら内部でOutputDebugStringを使うときにある程度の文字数で切れます。

編集 削除
まるささ  2011-03-18 10:30:49  No: 72461  IP: 192.*.*.*

tetrapodさん、Blueさん、ありがとうございました。

tetrapodさん、使用するSQLが長いため、固定部分はstrcatで
連結しているのですが、長い文字列の生成は、どのようにしていますか?

Blueさん、TRACEは、途中で切られてしまうのは、調べている段階で
判明していました。

色々調べていたところ、ログを採取しているのですが、このログを採取
する時に、「wsprintf」を使用していました。
「wsprintf」を使用してしまうと、1024バイトで切れてしまうことが
わかりました。
これを、「sprintf_s」に変えてやると、切れることなく動作する様に
なりました。

編集 削除
tetrapod  2011-03-18 11:06:24  No: 72462  IP: 192.*.*.*

> 長い文字列の生成
俺としては SQL 文を「長い文字列」として生成することはありえない。

だから「長い文字列」をどう作るか、などどうでも良くて、
正しい SQL 文= SQL インジェクション脆弱性の無い SQL 文を作ることと考えるべき。

それ以上のことは今の情報量からだと言えないな・・・

snprintf(buf, BUFSIZE, "SELECT %s FROM %s WHERE PWD='%s' ID='%s'" ...);
とすれば strcat なしに [長い文字列] としての SQL 文は作れる。
が、これは SQL インジェクション脆弱性をもろに含んでいるので0点。
俺なら根幹設計から全部やりなおしさせるレベル。

編集 削除
眞鋳  2011-03-19 00:03:52  No: 72463  IP: 192.*.*.*

そういえばodbcの場合ですけど、長いsql分は駄目だった様な・・・
ごめんなさい人世代前の話かも、確信もないのすけど。
そんな話をしていたのを思い出しまして。

編集 削除
眞鋳  2011-03-19 10:53:46  No: 72464  IP: 192.*.*.*

一世代前でした、訂正します。

編集 削除