2010-04-12 5 views
2

Cela peut sembler une question facile pour certains, mais je suis aux prises avec cela.Comment vérifier si un champ est un champ Image

J'essaie d'utiliser SQLDataReader.GetFieldType pour vérifier si un certain champ est un champ Image. Permet de supposer le premier champ de l'ensemble de résultats est un champ d'image, si je fais:

reader.GetFieldType(0).ToString; 

Je reçois System.Byte[] Mais est-ce la bonne façon de vérifier cela? Je n'aime vraiment pas:

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

Y a-t-il un meilleur moyen?

Merci,

AJ

+0

Certains des commentaires ci-dessous sont confus. Veuillez confirmer qu'il s'agit de la détection du type de données 'Image' ** **, pas de l'image ** **. – egrunin

Répondre

5

vous pouvez toujours raccourcissent un peu:

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

Malheureusement, il n'y a pas de correspondance directe à partir d'un champ d'image dans SQL Server à un type CLR .NET ... qui est la raison pour laquelle vous obtenez un tableau d'octets.

Vous pouvez ajouter une vérification plus pour vous assurer que le tableau d'octets étant retourné est en fait une image (tableaux d'octets sont utilisés pour image, binary, varbinary et rowversion colonnes aussi bien).

Vous pouvez vérifier les correspondances de type à:

MSDN - Mapping CLR Parameter Data

+1

+1 pour l'utilisation de typeof (octet []) pour éviter le nom de type codé en dur. –

1

Il est préférable d'utiliser la méthode Type.IsAssignableFrom au lieu de regarder le nom du type lui-même.

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

Cela vous donne une certaine mesure de la sécurité au moment de la compilation.

Note: Cela ne garantit pas en fait que le champ contiendra images - toute forme de données binaires peuvent être stockées dans des champs image/binary/varbinary, la seule façon de voir si elle est vraiment une image est pour lire la valeur et essayez de le charger comme un seul. Mais vous pouvez l'utiliser pour vérifier si le champ est un champ binaire.

0

Vous devrez peut-être vérifier les premiers octets pour voir s'ils créent un en-tête d'image. Sinon, vous pourriez traiter un fichier audio, par exemple. Un tableau d'octets ne représente donc pas nécessairement une image.

1

Une autre façon pourrait être d'utiliser la méthode SqlDataReader.GetSchemaTable. Cela renverra une datatable contenant le schéma du jeu de résultats et rendra disponible le type de données réel à partir de la base de données - par ex. la colonne DataTypeName de la table de schéma renvoyée sera le type de données SQL Server réel comme varchar et la colonne ProviderSpecificDataType sera un System.Data.SqlType

par exemple.

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