문제

주변의 스트림 인터페이스를 사용하여 Blob의 이진 데이터를 읽고 싶습니다.

그러나 나는 Blob이 완전히 클라이언트 쪽을로드하고 메모리 또는 파일에 저장되기를 원하지 않습니다.

나는 Blob을 사용하는 코드가 찾고 읽고 읽을 수 있기를 원하며, Seek/Read를 지원하는 데 필요한 많은 데이터만이 와이어로 가져 오는 것입니다.

인 척하다 Blob은 250MB Photoshop 이미지입니다. Thumbnailer 코드는 이미지의 첫 8 바이트를 읽는 방법을 알고, PSD 파일을 인식하고, 3K 썸네일이 포함 된 오프셋을 찾아서 읽습니다.

따라서 250MB의 메모리를 할당하거나 임시 파일을 만들려고하지 않고 250MB가 와이어를 가져 오기를 기다려야합니다. 가상의 SQLSERVERBLOBSTREAMSERVERCURSOR 클래스는 실제로 요구되는 내용에 대한 데이터 트래픽을 데이터로하는 방법을 알고 있습니다.


연구

방법 : Ado.net 및 Visual Basic .NET에서 청킹을 사용하여 Blob 열로 파일을 읽고 씁니다.덩어리로 읽고 쓸 수 있다는 것에 대해 이야기합니다. 그러나 코드는 내가 참을 수없는 것처럼 읽을 수 없습니다. 나중에 볼게요.

또한 이 남자 새로운 SQL Server 2005 언급 [.write ()] 3 t -sql 구문을 작성하려면 - 작은 덩어리로 데이터를 작성하는 데 사용될 수 있습니다 (모든 서버의 메모리 소비를 피하기 위해). 아마도 [].읽다() 의사-방법

Microsoft에는 기사가 있습니다. SQL Server에 Blob 값을 작성할 때 리소스 보존

도움이 되었습니까?

해결책

최신 버전의 SQL Server를 사용하면 바이너리 데이터 유형의 Substring () 함수와 함께 일반 SQL을 사용할 수 있습니다. 보다 http://msdn.microsoft.com/en-us/library/ms187748.aspx

이미지의 크기를 얻으려면 :

select datalength(blobcolumn) from myimages where imgid = 12345;

처음 8 바이트를 읽으려면 :

select substring(blobcolumn, 1, 8) from myimages where imgid = 12345;

877 바이트를 읽으려면 115000 ~ 115876을 오프셋합니다.

select substring(blobcolumn, 115001, 877) from myimages where imgid = 12345;

기판 함수는 0이 아닌 1- 오프셋을 기반으로합니다.

읽기 부분 사이에서 잠재적으로 변화하는 열에 관심이 있다면 모든 다른 선택을 트랜잭션 내에 넣을 수 있습니다.

이것은 나에 의해 테스트되지 않았지만, MS SQL Server의 이전 버전은 분명히 (현재 더 이상 사용되지 않은) readText 동사 및 TextPtr () 함수를 사용해야합니다. 와 같은:

select textptr(blobcolumn) from myimages where imgid = 12345;

반환 된 포인터 값을 잡고 PTR이라고 말한 후 후속 쿼리에 사용하십시오.

readtext blobcolumn @PTR 115001 887

다른 팁

새로운 SQL Server 2008 Filestream 기능을 사용하는 것을 고려할 수 있습니다. http://msdn.microsoft.com/en-us/library/cc645940.aspx

ado.net을 사용하고 싶을 것입니다 SqlDataReader 객체 SequentialAccess 명령 행동. 이를 통해 버퍼 크기를 정의하고 청크로 데이터를 읽을 수 있습니다.

이 기사를 참조하십시오 : http://msdn.microsoft.com/en-us/library/87z0hy49(vs.71).aspx

byte[] outbyte;
int bufferSize = 8;
SqlDataReader myReader = myCmd.ExecuteReader(CommandBehavior.SequentialAccess);
...
long returnBytes = myReader.GetBytes(1, 0, outbyte, 0, bufferSize);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top