확신하는! 아래에서 해당 작업을 수행한 코드를 찾을 수 있습니다. 우리는 약간의 SQL 예제를 작성하지만 나도 SQL 전문가는 아니므로 조심하세요.
이 코드는 최대 256kB 크기의 JPG를 전송할 수 있습니다. 더 큰 사진을 전송하려면 열 수를 늘리십시오(예: ImgVarChar8, ImgVarChar9 등 추가).
어쩌면 내 후속 질문에 대해 도움을 줄 수 있을 것입니다. 여기 ?
건배!
-------------- SQL 코드 시작 --------------
테이블 생성(
ID INT 신원 기본 키,
이미지 VARBINARY(MAX)
)
가다
INSERT INTO tIMG(Img) SELECT BulkColumn FROM
OPENROWSET(BULK 'C:\Test\test.jpg', SINGLE_BLOB) AS InsertIMG
가다
VIEW vImg AS 생성
SELECT 변환(varchar(최대), 하위 문자열(Img,0,32000),2) ImgVarChar0
,convert(varchar(최대),substring(Img,32000,32000),2) ImgVarChar1
,convert(varchar(최대),substring(Img,64000,32000),2) ImgVarChar2
,convert(varchar(최대),substring(Img,96000,32000),2) ImgVarChar3
,convert(varchar(최대),substring(Img,128000,32000),2) ImgVarChar4
,convert(varchar(최대),substring(Img,160000,32000),2) ImgVarChar5
,convert(varchar(최대),substring(Img,192000,32000),2) ImgVarChar6
,convert(varchar(최대),substring(Img,224000,32000),2) ImgVarChar7
[dbo].[tIMG]에서
가다
-------------- SQL 코드 끝 --------------
-------------- JMP 코드 시작 --------------
// 데이터베이스에서 16진수 데이터(문자열)를 가져오는 SQL 쿼리입니다.
// 문자열은 데이터 테이블 "JPG_Query"의 다른 열에 저장됩니다.
새 SQL 쿼리(
연결(
"당신의 연결"
),
쿼리 이름( "JPG_쿼리" ),
선택( 열( "ImgVarChar0", "t1" ), 열( "ImgVarChar1", "t1" ) ,
열( "ImgVarChar2", "t1" ) ,열( "ImgVarChar3", "t1" ),
열( "ImgVarChar4", "t1" ) ,열( "ImgVarChar5", "t1" ),
열( "ImgVarChar6", "t1" ) ,열( "ImgVarChar7", "t1" ) ),
From( 테이블( "vImg", 스키마( "dbo" ), 별칭( "t1" ) ) ),
) << 실행;
// 16진수 문자열에서 JPG 이미지를 생성하고 그림을 표시하기 위해 반복합니다. (어쩌면 중복된 코드가 있을 수도 있습니다...)
스위치 = 0;
count_try = 0;
max_try = 200;
16진수 = "";
동안(스위치 == 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;
picture = Open(Hex to Blob(hexcode), "jpg");
( 누락(hexcode) == 0 & 스크립팅 가능( Data Table("JPG_Query") ) == 1 인 경우,
새 창( "JPG 이미지", 그림 );
16진수 = "";
스위치 = 1;
Close(데이터 테이블("JPG_Query") , NoSave);
);
,
잠깐(0.01);
(count_try == max_try ,
Throw("오류!");
);
); // 닫기 시도
); // 종료하는 동안
-------------- JMP 코드 끝 --------------
미안해할 이유가 없습니다. 여기에서 얼마나 빠른 답변이 제공되는지에 놀랐습니다.
그리고 다시 한 번 정말 감사드립니다! 지금까지 우리는 다음을 수행할 수 있었습니다:
1. 데이터베이스에서 CONVERT 함수를 사용하고 스타일을 "2"로 설정하여 BLOB(varbinary(max))에서 16진수로 이미지를 변환했습니다. 이렇게 하면 문자열 시작 부분의 "0x"가 제외됩니다.
2. 데이터 테이블에 저장된 쿼리를 통해 16진수 문자열을 jmp로 전송했습니다.
3. 언급한 함수가 포함된 그림을 보여드렸습니다. New Window("Foo", Open(HexToBlob(hex-string)), "jpg")
하지만 이제 실제로 64k 문제가 발생합니다. 기본적으로 데이터 테이블의 단일 셀에 64k만 저장할 수 있다는 것을 알았으므로 데이터베이스의 16진수 문자열을 여러 열로 분할하고 가져온 후 jmp로 다시 연결하는 아이디어를 얻었습니다. 여러 열의 부품.
이에 대해서는 곧 보고하겠습니다.
좋은 주말 되세요!
편집: 작동합니다! 먼저 이진 이미지를 여러 부분으로 분할하고 데이터베이스의 부분을 16진수로 변환한 다음 16진수 부분을 전송하고 마지막으로 jmp에서 다시 연결하여 JPG를 전송할 수 있었습니다. 정말 훌륭해요! 감사합니다.
안녕하세요 크레이그,
귀하의 답변에 감사드립니다. 예, 실제로 16진수로 인코딩된 데이터입니다. 실제로 .NET 소프트웨어를 사용하여 JPG를 데이터베이스로 읽어 varbinary(max) 유형의 열에 저장합니다. 그래서 당신이 말했듯이, SQL 쿼리를 통해 16진수로 인코딩된 데이터를 jmp로 전송하는 것이 가능하다고 생각합니다. 이와 관련하여 두 가지 질문이 있습니다.
1. 쿼리를 통해 varbinary(max) 열을 jmp의 문자 열로 어떻게 읽습니까?
2. 문자 열의 데이터를 다시 그림으로 변환하려면 무엇을 해야 합니까?
나는 그 질문이 너무 지나칠 수 있다는 것을 알고 있지만 작은 힌트라도 감사하겠습니다.
감사해요!
편집 : 우연히 발견했습니다 이 스레드 , 우리가 하고 싶은 일을 다루고 있습니다. 이를 참고하면 먼저 BLOB 데이터를 데이터베이스의 hex로 전송한 후 JMP로 전송해야 할 것 같습니다.