當然! 您將在下面找到完成這項工作的程式碼。 我們建立了一個小 SQL 範例,但我也不是 SQL 專家,所以要小心
此程式碼能夠傳輸最大大小為 256 kB 的 JPG。 如果要傳輸較大的圖片,只需增加列數即可,即添加ImgVarChar8、ImgVarChar9等。
也許你可以幫我解決我的後續問題這裡?
乾杯!
-------------- SQL 程式碼開始 --------------
創建表 tIMG(
ID INT 身分主鍵,
Img VARBINARY(最大)
)
去
INSERT INTO tIMG(Img) SELECT BulkColumn FROM
OPENROWSET(BULK 'C:\Test\test.jpg', SINGLE_BLOB) AS InsertIMG
去
建立視圖 vimg AS
SELECT 轉換(varchar(max),子字串(Img,0,32000),2) ImgVarChar0
,轉換(varchar(max),子字串(Img,32000,32000),2) ImgVarChar1
,轉換(varchar(max),子字串(Img,64000,32000),2) ImgVarChar2
,轉換(varchar(最大),子字串(Img,96000,32000),2) ImgVarChar3
,轉換(varchar(最大),子字串(Img,128000,32000),2) ImgVarChar4
,轉換(varchar(最大),子字串(Img,160000,32000),2) ImgVarChar5
,轉換(varchar(max),子字串(Img,192000,32000),2) ImgVarChar6
,轉換(varchar(max),子字串(Img,224000,32000),2) ImgVarChar7
來自 [dbo].[tIMG]
去
-------------- SQL 程式碼結束 --------------
-------------- JMP 代碼開始 --------------
// SQL 查詢從資料庫取得十六進位資料(字串)。
// 字串儲存在資料表「JPG_Query」的不同欄位中。
新的 SQL 查詢(
聯繫(
“你的聯絡方式”
),
查詢名稱(“JPG_Query”),
選擇(列(“ImgVarChar0”,“t1”),列(“ImgVarChar1”,“t1”),
列(“ImgVarChar2”,“t1”),列(“ImgVarChar3”,“t1”),
列(“ImgVarChar4”,“t1”),列(“ImgVarChar5”,“t1”),
列(“ImgVarChar6”,“t1”),列(“ImgVarChar7”,“t1”)),
From( 表( "vImg", Schema( "dbo" ), Alias( "t1" ) ) ),
) << 運行;
// 循環從十六進位字串建立 JPG 圖像並顯示圖片(也許有一些冗餘程式碼...)
開關=0;
嘗試計數=0;
最大嘗試次數=200;
十六進位代碼=“”;
while(switch == 0 & count_try < max_try,
計數嘗試++;
嘗試(
hexcode1 = DataTable("JPG_Query"):名稱("ImgVarChar0")[1];
hexcode2 = DataTable("JPG_Query"):名稱("ImgVarChar1")[1];
hexcode3 = DataTable("JPG_Query"):名稱("ImgVarChar2")[1];
hexcode4 = DataTable("JPG_Query"):名稱("ImgVarChar3")[1];
hexcode5 = DataTable("JPG_Query"):名稱("ImgVarChar4")[1];
hexcode6 = DataTable("JPG_Query"):名稱("ImgVarChar5")[1];
hexcode7 = DataTable("JPG_Query"):名稱("ImgVarChar6")[1];
hexcode8 = DataTable("JPG_Query"):名稱("ImgVarChar7")[1];
十六進位代碼= 十六進位代碼1||十六進位代碼2||十六進位代碼3||十六進位代碼4||十六進位代碼5||十六進位代碼6||十六進位代碼7||十六進位代碼8;
圖片 = Open(Hex 轉 Blob(hexcode), "jpg");
If ( 缺失(十六進位代碼) == 0 & 可編寫腳本(資料表(「JPG_Query」)) == 1 ,
新視窗("JPG圖片", 圖片);
十六進位代碼=“”;
開關=1;
關閉(資料表(“JPG_Query”),不儲存);
);
,
等待(0.01);
如果 (count_try == max_try ,
拋出(“錯誤!”);
);
); // 關閉嘗試
); // 關閉時
-------------- JMP 代碼結束 --------------
沒有理由感到抱歉。 我對這裡給出的答案如此之快感到驚訝
再次非常感謝! 到目前為止,我們能夠執行以下操作:
1. 在資料庫中,我們使用 CONVERT 函數將圖像從 BLOB (varbinary(max)) 轉換為十六進制,並將樣式設為「2」 - 這會省略字串開頭的「0x」。
2. 我們透過查詢將十六進位字串傳輸到 jmp,並將其保存在資料表中。
3.我們用你提到的函數展示了圖片:New Window("Foo", Open(HexToBlob(hex-string)), "jpg")
但現在我們確實遇到了 64k 問題。 由於我們發現,這基本上意味著我們只能將64k 儲存在資料表的單一儲存格中,因此我們想到將資料庫中的十六進位字串拆分為多個列,並在匯入後將其連接回jmp 中分為幾列。
我很快就會報告此事。
祝你周末愉快!
編輯:它有效! 我們能夠透過先將二進位影像分割成多個部分,將資料庫中的部分轉換為十六進制,傳輸十六進位部分,最後在 jmp 中再次連接它們來傳輸 JPG。 非常好! 謝謝。
嗨克雷格,
謝謝你的回答。 是的,它確實是十六進制編碼的資料。 我們實際上使用 .NET 軟體將 JPG 讀入資料庫,並將其保存在 varbinary(max) 類型的欄位中。 正如你所說,我猜想可以透過 SQL 查詢將十六進位編碼的資料傳輸到 jmp。 對此,我們有兩個疑問:
1. 如何透過查詢將 varbinary(max) 列讀入 jmp 中的字元列?
2. 如何將字元列中的資料轉換回圖片?
我知道這些問題可能太過分了,但任何一點提示都是值得讚賞的。
謝謝!
編輯:我偶然發現這個線程,它解決了我們想要做的事情。 參考這個,我想有必要先將BLOB資料傳輸到資料庫中的十六進制,然後將其傳輸到JMP。