当然! 您将在下面找到完成这项工作的代码。 我们构建了一个小 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。