2010-04-12 3 views
2

이것은 약간의 문제로 보일 수 있지만 그걸로 고민 중입니다.필드가 이미지 필드인지 확인하는 방법

SQLDataReader.GetFieldType을 사용하여 특정 필드가 이미지 필드인지 확인하려고합니다. 내가 System.Byte[]를 얻을 그러나이 그것을 확인하는 올바른 방법입니다

reader.GetFieldType(0).ToString; 

을 : 내가 할 경우, 결과 세트의 첫 번째 필드는 이미지 필드 가정 수 있습니다? 나는 정말로 싫어한다 :

if (reader.GetFieldType(0).ToString="System.Byte[]") 

더 좋은 방법이 있습니까?

감사합니다,

AJ

+0

일부 의견 작성자는 혼란 스럽습니다. ** 이미지 ** 데이터 **가 아닌 '이미지'** 데이터 유형 **을 탐지하는지 확인하십시오. – egrunin

답변

5

당신은 항상 조금을 단축 할 수있다 :

if(reader.GetFieldType(0) == typeof(byte[])); 

불행하게도 .NET의 CLR 유형 SQL Server의 이미지 필드에서 직접 매핑이 없습니다 ... 당신이 바이트 배열을 얻는 이유입니다.

당신은 반환되는 바이트 배열은 이미지가 실제로 있는지 확인하기 위해 검사를 더 추가 할 수 있습니다 (바이트 배열은 image, binary, varbinary을 위해 사용되며, rowversion 열뿐만 아니라).

당신은, 형태 맵을 확인할 수 있습니다

MSDN - Mapping CLR Parameter Data

+1

하드 코딩 된 형식 이름을 피하려면 typeof (byte [])를 사용하는 경우 +1하십시오. –

1

그것은 대신 형 이름 자체보고의 Type.IsAssignableFrom 방법을 사용하는 것이 바람직합니다.

Type fieldType = reader.GetFieldType(0); 
bool isImageField = typeof(byte[]).IsAssignableFrom(fieldType); 

이렇게하면 컴파일시 안전을 측정 할 수 있습니다.

참고 : - 바이너리 데이터의 형태 image/binary/varbinary 필드에 저장 될 수있다, 그래서 진정으로 이미지 인 경우 유일한 방법은 볼이 실제로 필드 이미지이 포함되는 것은 아닙니다 값을 읽고 하나로서로드하려고 시도하십시오. 그러나이 필드를 사용하여 필드가 이진 필드인지 확인할 수 있습니다.

0

이미지 헤더가 있는지 확인하려면 첫 번째 바이트를 확인해야 할 수 있습니다. 그렇지 않으면 예를 들어 오디오 파일을 처리 할 수 ​​있습니다. 따라서 바이트 배열이 반드시 이미지를 나타내는 것은 아닙니다.

1

다른 방법이 SqlDataReader.GetSchemaTable 방법을 사용할 수 있습니다. 그러면 결과 집합의 스키마가 포함 된 데이터 테이블이 반환되고 db -에서 실제 데이터 형식을 사용할 수있게됩니다. 반환 된 스키마 테이블의 DataTypeName 열은 varchar와 같은 실제 SQL Server 데이터 형식이되고 ProviderSpecificDataType 열은 System.Data.SqlType이됩니다.

예를 들어.

DataTable dataSchema = reader.GetSchemaTable(); 
// dataSchema.Rows[0]["DataTypeName"] would return the sql server 
// data type name for the first column in the resultset. 
관련 문제