データベースから255バイト以上のデータを抽出したい場合は


いつか  2008-04-01 21:08:41  No: 30351

タイトル通りにデータベースから255バイト以上のカラムのデータを抽出したいのですが

例えば次のようなテーブル(MS-SQL)があったとして

testtable
----------------
coloumn1   varchar(500)
coloumn2   varchar(200)

普通の検索SQLを使って次のようにDELPHIコードを
書いてみましたが・・・

function Tpr.GetProjectCD: string;
var
   sSQL: string;
   clmn1, clmn2: string;
begin
   result := '';
   sSQL := ' SELECT coloumn1, coloumn2 FROM testtable ';

   with dm.qryWork do begin
       Close;
       SQL.Clear;
       SQL.Add(sSQL);
       OPEN;
       if RecordCount > 0 then begin
           result := FieldByName('coloumn1').AsString;
       end;
   end;

end;

いくらやってもカラム1のデータが255バイトしか取り出せないです。
カラム1に入っている全てのデータを取り出したい場合は
どうすれば良いのでしょうか。

ご存知の方はぜひ教えてください。これの為もう三日間苦労しています。
ではどうぞ宜しくお願いいたします。


pekesuke  2008-04-01 22:02:34  No: 30352

いつかさん、こんにちわ。

BLOBの読み込みになると思います。

var
  strs: TStream;
  Buff: string;
begin
  strs := qryWork.CreateBlobStream(qryWork.FieldByName('coloumn1'),bmRead);
  try
    strs.Read(Buff,strs.Size);
  finally
    strs.Free;
  end;
end;
で読み込めたと思います。


いつか  2008-04-02 22:46:12  No: 30353

お返事ありがとうございます。

早速ですがおっしゃった通りにしてみましたが
キャスティングエラーがしてしまいます。
それで下記の感じで試してみましたが

if FieldByName('coloumn1').IsBlob then begin
   // 教えてもらったコード
end

やはり通らないですね。該当カラムが255バイトを超えていても
データタイプがBLOBタイプではないためだったか
教えてもらった方法ではダメでだったんですが
申し訳ありませんが他に良い方法ないでしょうか。

では、宜しくお願いします。


いつか  2008-04-02 23:00:29  No: 30354

やはり、255バイト以上のデータを使うなら
カラムのデータタイプをBLOBに指定しなければならないでしょうか。

困りますね。


pekesuke  2008-04-03 01:43:45  No: 30355

FireBirdでvarcahar(300)で作成したフィールドを見ると
Memoフィールドになっていました。
> result := FieldByName('coloumn1').AsString;

result := FieldByName('coloumn1').AsMemo;
でやってみては同でしょうか。


HOta  2008-04-03 02:26:04  No: 30356

Delphiのバージョンは何でしょうか?


いつか  2008-04-03 22:32:17  No: 30357

pekesukeさん、お返事してくださってありがとうございます。

早速ですが教えてもらった通りにAsMemoでやってみましたがコンパイルに通らないです。AsMomoプロパティーが未定義の識別子として扱われているようですが
自分が何か間違えたのでしょうか。

HOtaさん自分のDelphiのバージョンはDelphi7です。ちょっと古いバージョンですが会社ではこれ以上バージョンアップする気は全くなさそうですね。
実際に同パッケージの新しいバージョンの開発にも.Netを使ってるし
もしかしてDelphiは近いうちこの業界でなくなるかも知れないですよね。


DEKO  2008-04-03 23:53:00  No: 30358

接続に使っている方法は
・BDE
・ADOExpress
どちらでしょうか?

BDE接続であれば、
http://support.codegear.com/article/36002
まず、こちらをご覧ください。


いつか  2008-04-04 01:53:55  No: 30359

DEKOさん
お返事ありがとうございます。

接続方式はBDEを使っています。
質問ですが
http://support.codegear.com/article/36002
こちらのページでどれを参照するば良いのでしょうか。
現在自分のパソコンに入っているBDEのバージョンは最新バージョンであるBDE5.2ですが・・・


DEKO  2008-04-04 02:35:14  No: 30360

SQL Server 6.5以前ではvarcharは255文字までなので、
http://support.microsoft.com/kb/290413/ja
BDE5.2よりも以前のバージョンではどうやっても255文字までしか取得できません。

BDE5.2でも同様となると、DB-Libraryのv7.0でもその制限が引き継がれているのかもしれません。
# DB-LibraryはMicrosoftの提供ですし、
# BDEは開発が終了しています。

...となると、方法は2つです。

1.ADO Expressで書き直す。
2.ODBCでの接続に変更する。

BDEを使う前提なら後者しか選択の余地はないような気がします。

# "Select convert(text, coloumn1) From testtable"のように
# 型変換を行えば或いは...?

>もしかしてDelphiは近いうちこの業界でなくなるかも知れないですよね。
...ちなみに、これってDelphiのせいですかね?


DEKO  2008-04-04 03:41:33  No: 30361

># 型変換を行えば或いは...?
型キャストならこっちですね。
Select Cast(coloumn1 as text) From testtable


いつか  2008-04-04 04:25:37  No: 30362

DEKOさん

親切なお答え真にありがとうございました。
本当に助かりました。

社内でこれに対して打合せした結果、結局ADO Expressで書き直すことになりました。

色々長い間お世話になりました。


HOta  2008-04-04 20:40:26  No: 30363

SQLServerのバージョンも出ていませんが、結局はSQLServerの仕様が変わったのが原因ですね。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加