2012-06-13 2 views
1

Je dois obtenir le type de données d'une colonne en utilisant le nom de la colonne. Je code en C#. La situation est que j'ai une vue qui convertit certaines dates en varchar afin que je puisse mieux les afficher (sans temps pour être exact). Cependant, cela signifie que le type de données pour les colonnes est maintenant incorrect. Ce que je voudrais faire est de rechercher une colonne à partir d'un schéma DataTable en utilisant le nom de la colonne, puis obtenir le type de données de cette colonne. Je rassemblerais le type de données réel de la table principale plutôt que la vue dans ce cas. Des idées?Obtenir le type de données à partir du nom de la colonne

Répondre

4

La DataTable.Columns propriété est un DataColumnCollection, qui peut être indexed by column name pour obtenir un DataColumn, qui possède une propriété DataType.

+0

Cela fonctionnera-t-il sur un DataTable rassemblé à l'aide de GetSchemaTable() sur un objet SqlDataReader? – steventnorris

+0

GetSchemaTable renvoie un DataTable, donc cela devrait fonctionner. – kol

+0

Eh bien, il semble que la table de schéma ne contient pas les noms de colonnes de la table sql. Chaque ligne représente une colonne de la table sql et les colonnes sont les propriétés (comme le nom de colonne et le type de données), cette méthode ne semble donc pas fonctionner. – steventnorris

0

Je ne vois pas comment cela est possible sans inférer le type à partir des valeurs. Si vous avez les résultats de la vue et le nom de la colonne dans le code, les informations sur la table que la vue utilise est perdue à ce point.

Vous pouvez, bien sûr, obtenir les informations sur la table si vous connaissez son nom; qui peut être effectuée soit en utilisant une requête simple comme ça:

SELECT TOP 0 * FROM <<tableName>> 

ou en utilisant DMVs:

SELECT * FROM sys.columns WHERE object_id = OBJECT_ID('<<tableName>>') 

Dans le premier cas, vous utilisez GetSchemaTable sur le IDataReader et itérer sur les lignes pour trouver votre colonne de nom; Dans le second cas, vous pouvez parcourir le résultat et trouver votre colonne de cette façon.

+0

je peux obtenir la fin du schéma de la table, j'ai juste besoin de connaître le type de données d'une colonne dans ce tableau par nom de colonne. Dites par exemple que j'ai un tableau avec les colonnes Nom, Date de naissance, Âge. Je veux connaître le type de données de la colonne nommée Birthdate. Mais tout ce que j'ai est le schéma de la table et le nom de la colonne. – steventnorris

+0

Dans quel format avez-vous le schéma de la table? –

+0

Il s'agit d'un objet DataTable C# obtenu à l'aide de GetSchemaTable() sur un objet SqlDataReader. – steventnorris

0

Si vous utilisez SQL Server, vous pouvez utiliser SET FMTONLY. Il renvoie uniquement les métadonnées au client. Il peut être utilisé pour tester le format de la réponse sans réellement lancer la requête.

SqlCommand cmd = connection.CreateCommand(); 
cmd.CommandText = "SET FMTONLY ON; select column from table; SET FMTONLY OFF"; 
SqlDataReader reader = cmd.ExecuteReader(); 
SqlDbType type = (SqlDbType)(int)reader.GetSchemaTable().Rows[0]["ProviderType"]; 

Courtoisie: StackOverflow

1

INFORMATION_SCHEMA.COLUMNS tableau donne des informations plus claires pour ce que vous avez besoin de sys.columns de table. Vous pouvez essayer ce qui suit:

SELECT data_type, character_maximum_length 
FROM information_schema.columns 
WHERE table_name = 'tableName' AND column_name = 'columnName' 
Questions connexes