もちろん! 以下に、その仕事を行ったコードを示します。 ちょっとした SQL サンプルを作成しましたが、私は SQL の専門家でもありませんので、注意してください。
このコードは、最大サイズ 256 KB の JPG を転送できます。 より大きな画像を転送したい場合は、列の数を増やすだけです。つまり、ImgVarChar8、ImgVarChar9 などを追加します。
私のフォローアップの質問を手伝ってもらえるかもしれませんここ?
乾杯!
-------------- SQL コードの開始 --------------
テーブルの作成 tIMG(
ID INT アイデンティティ主キー、
Img VARBINARY(MAX)
)
行く
INSERT INTO tIMG(Img) SELECT BulkColumn FROM
OPENROWSET(BULK 'C:\Test\test.jpg', SINGLE_BLOB) AS InsertIMG
行く
ビュー vImg AS を作成
SELECT Convert(varchar(max),substring(Img,0,32000),2) ImgVarChar0
,convert(varchar(max),substring(Img,32000,32000),2) ImgVarChar1
,convert(varchar(max),substring(Img,64000,32000),2) ImgVarChar2
,convert(varchar(max),substring(Img,96000,32000),2) ImgVarChar3
,convert(varchar(max),substring(Img,128000,32000),2) ImgVarChar4
,convert(varchar(max),substring(Img,160000,32000),2) ImgVarChar5
,convert(varchar(max),substring(Img,192000,32000),2) ImgVarChar6
,convert(varchar(max),substring(Img,224000,32000),2) ImgVarChar7
[dbo].[tIMG] から
行く
-------------- SQL コードの終了 --------------
-------------- JMP コードの開始 --------------
// データベースから 16 進データ (文字列) を取得する SQL クエリ。
// 文字列はデータ テーブル "JPG_Query" の異なる列に格納されます。
新しい SQL クエリ(
繋がり(
「あなたのつながり」
)、
QueryName( "JPG_Query" ),
Select( Column( "ImgVarChar0", "t1" ), Column( "ImgVarChar1", "t1" ) ,
列( "ImgVarChar2", "t1" ) 、列( "ImgVarChar3", "t1" )、
列( "ImgVarChar4", "t1" ) 、列( "ImgVarChar5", "t1" )、
列( "ImgVarChar6", "t1" ) ,列( "ImgVarChar7", "t1" ) )、
From( テーブル( "vImg", スキーマ( "dbo" ), エイリアス( "t1" ) ) ),
) << 実行します。
// ループして 16 進文字列から JPG 画像を構築し、画像を表示します (冗長なコードがあるかもしれません...)
スイッチ = 0;
カウント_トライ = 0;
max_try = 200;
16進数コード = "";
While(switch == 0 & count_try < max_try,
count_try++;
試す(
hexcode1 = DataTable("JPG_Query"):Name("ImgVarChar0")[1];
hexcode2 = DataTable("JPG_Query"):Name("ImgVarChar1")[1];
hexcode3 = DataTable("JPG_Query"):Name("ImgVarChar2")[1];
hexcode4 = DataTable("JPG_Query"):Name("ImgVarChar3")[1];
hexcode5 = DataTable("JPG_Query"):Name("ImgVarChar4")[1];
hexcode6 = DataTable("JPG_Query"):Name("ImgVarChar5")[1];
hexcode7 = DataTable("JPG_Query"):Name("ImgVarChar6")[1];
hexcode8 = DataTable("JPG_Query"):Name("ImgVarChar7")[1];
hexcode = hexcode1||hexcode2||hexcode3||hexcode4||hexcode5||hexcode6||hexcode7||hexcode8;
pic = Open(Hex to Blob(hexcode), "jpg");
( Is Missing(hexcode) == 0 & Is Scriptable( Data Table("JPG_Query") ) == 1 の場合、
新しいウィンドウ( "JPG 画像", ピクチャー );
16進数コード = "";
スイッチ = 1;
Close(Data Table("JPG_Query") , NoSave);
);
、
待機(0.01);
(count_try == max_try の場合、
Throw("エラー!");
);
); // 閉じて試してください
); // 途中で閉じます
-------------- JMP コード終了 --------------
申し訳ない理由はありません。 ここでの回答の早さには驚かされます
そして改めて、本当にありがとうございました! これまでのところ、次のことができました。
1. データベースでは、CONVERT 関数を使用して画像を BLOB (varbinary(max)) から 16 進数に変換し、スタイルを "2" に設定しました。これにより、文字列の先頭の "0x" が省略されます。
2. クエリを介して 16 進文字列を jmp に転送し、データ テーブルに保存しました。
3. あなたが言及した関数を使用して画像を表示しました: New Window("Foo", Open(HexToBlob(hex-string)), "jpg")
しかし、ここで実際に 64k の問題に遭遇します。 基本的に、データ テーブルの 1 つのセルには 64k しか格納できないということを理解したので、データベース内の 16 進文字列を複数の列に分割し、インポート後に jmp に連結し直すというアイデアを思いつきました。複数の列に分かれた部分。
これについては近いうちに報告します。
良い週末を!
編集:それはうまくいきます! 最初にバイナリ画像をパーツに分割し、データベース内のパーツを 16 進数に変換し、16 進数のパーツを転送して、最後にそれらを jmp で再度連結することで、JPG を転送できました。 ほんとうに素晴らしい! ありがとう。
こんにちは、クレイグ、
ご回答ありがとうございます。 はい、それは確かに 16 進数でエンコードされたデータです。 実際に、.NET ソフトウェアを使用して JPG をデータベースに読み込み、varbinary(max) タイプの列に保存します。 あなたが言うように、SQLクエリを介して16進数でエンコードされたデータをjmpに転送することは可能だと思います。 これに関して、次の 2 つの質問があります。
1. クエリを介して varbinary(max) 列を jmp の文字列に読み取るにはどうすればよいですか?
2. 文字列のデータを画像に戻すには何をしなければなりませんか?
こういった質問は行き過ぎているかもしれませんが、どんな小さなヒントでも歓迎します。
ありがとう!
編集: 偶然見つけましたこのスレッド、私たちがやりたいことを解決します。 これを参考にすると、まずBLOBデータをデータベース内のhexに転送してからJMPに転送する必要があると思います。