2016-12-08 4 views
0

내 통제 범위를 벗어나는 이유 때문에 SQLite 데이터베이스를로드하고 이진 데이터를 검색하는 .NET 2.0 어셈블리를 만들고 있습니다. 특히, PDF 문서.System.Data.SQLite.SQLIteDataReader.GetBlob을 사용하여 BLOB 필드를 검색하는 중 오류가 발생했습니다.

System.Data.SQLite.SQLiteDataReader.GetBlob 설명서에 (Ⅰ INT, 읽기 전용 부울)을 말한다 (강조 광산)

가 System.Data.SQLite.SQLiteBlob 오브젝트로서 열을 취득. 쿼리가 "rowid"열 또는 해당 별칭 중 하나를 포함하지 않는 경우 - 또는 - System.Data.SQLiteDataReader가 System.Data로 만들어지지 않은 경우이 쿼리는 ROWID없이 작성된 테이블에 대해서는 작동하지 않습니다. CommandBehavior.KeyInfo 플래그입니다.

using (SQLiteCommand getBooklet = new SQLiteCommand($"SELECT \"rowid\", File_Name FROM Booklets WHERE Id = {int.Parse(key)}", dbConnection)) 

내가 지금처럼 내 SQLiteDataReader을 인스턴스화 한 : 다음과 같이 나는 getBlob 나 (INT I, 부울 읽기 전용) 함수를 호출

using (SQLiteDataReader currentCustomerReader = getBooklet.ExecuteReader(System.Data.CommandBehavior.KeyInfo & System.Data.CommandBehavior.SequentialAccess)) 

:

여기

내 SQLiteCommand입니다

currentCustomerPdf = currentCustomerReader.GetBlob(1, true); 

이것과 함께 eted :

System.InvalidOperationException: No RowId is available 
    at System.Data.SQLite.SQLiteBlob.Create(SQLiteDataReader dataReader, Int32 i, Boolean readOnly) 
    at System.Data.SQLite.SQLiteDataReader.GetBlob(Int32 i, Boolean readOnly) 
... 

내가 잘못하고 있니? 단계가 빠졌습니까? 버그를 신고해야합니까? 최신 버전에서 해결 된 .NET 2.0의 문제점입니까?

+0

정말 BLOB에 임의 액세스해야합니까? 그냥 바이트 배열로 읽을 수 없습니까? –

+0

지금 어떻게하는지 연구 중입니다. 왜 이런 일이 일어나고 있는지 잘 모르겠다. 정말 알고 싶다. Blob 객체의 코드는 더 간단하고 더 적은 줄을 필요로한다. – sonicbhoc

+0

'SQLiteBlob' 객체는 분명히 [점진적 BLOB I/O] (http://www.sqlite.org/c3ref/blob_open.html)를 사용합니다. 하지만이 경우에는 왜 작동하지 않는지 나는 알지 못합니다. –

답변

1

이 코드를 작동 시키려면 System.Data.CommandBehavior.SequentialAccess 플래그를 제거하고 적어도 rowid 및 blob 필드를 선택하십시오.

+1

rowid가 필요하지 않습니다. 'CommandBehavior.KeyInfo' (순차 액세스가 아닌 올바른)를 사용하여 리더를 만드는 것으로 충분합니다. –

0

keyinfo가 작동하지만 executereader 메소드의 큰 메모리 소비 (blob 크기와 동일) 때문에 큰 blob 객체의 blob I/O 증가분을 해결하지 못합니다. 거대한 메모리 사용을 피하는 한 가지 방법은 별도의 쿼리에서 ROWID를 가져 와서 sqliteblob.create 메서드를 오버로드하고 ROWID를 직접 전달하는 것입니다. 따라서 sqliteblob.create 메소드를 오버로드 할 수 있다면 기본적으로 keyinfo가 모두 필요하지는 않습니다.

관련 문제