2009-01-19 7 views
6

J'essaie de déterminer à l'exécution ce qu'est le SqlDbType d'une colonne de table de serveur SQL.Comment puis-je obtenir le SqlDbType d'une colonne dans une table en utilisant ADO.NET?

Y at-il une classe qui peut faire cela dans System.Data.SqlClient ou devrais-je faire la cartographie moi-même? Je peux obtenir une représentation de chaîne de retour

SELECT DATA_TYPE, CHARACTER_MAXIMUM_LENGTH 
FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE TABLE_CATALOG = '{0}' AND TABLE_SCHEMA = '{1}' 
    AND TABLE_NAME = '{2}' AND COLUMN_NAME = '{3}' 

EDIT: Je ne peux pas utiliser SMO que je ne contrôle pas la machine exécutant donc je ne peux pas garantir qu'il sera installé. (Désolé de ne pas faire ce RP clair).

EDIT: En réponse à Joel, j'essaye de faire une fonction que je peux appeler qui me renverra un SqlDBType une fois passée une SqlConnection, un nom de table, et un nom de colonne.

Répondre

15

Dans SQL Server, vous pouvez utiliser l'option FMTONLY. Il vous permet d'exécuter une requête sans avoir de données, en retournant simplement les colonnes.

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"]; 

+0

Hé, j'aime ça. – WOPR

+0

C'est vraiment cool, mais est-ce multi-thread sûr? Est-il possible qu'il soit interrompu avec SET FMTONLY ON, et quelqu'un d'autre obtient un jeu d'enregistrements vide? –

+1

Cela ressemble à une bonne solution, mais il y a un avertissement pour ne pas utiliser cette fonctionnalité car il va être supprimé dans les futures versions de SQL Server – Naomi

1

Pour SQL Server, utilisez SMO (SQL Server Management Objects).

http://www.yukonxml.com/articles/smo/

Par exemple, vous pouvez utiliser ce code pour parcourir sur toutes les colonnes d'une table.

Server server = new Server(); 
Database database = new Database("MyDB"); 
Table table = new Table(database, "MyTable"); 

foreach (Column column in table.Columns) 
{ 
     WriteLine(column.Name); 
} 

Voici toutes les propriétés de colonne disponibles pour vous: http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.management.smo.column_members.aspx

+0

Bonne réponse, mais comme je ne sais pas si l'ordinateur d'exécution aura SMO installé, c'est un non-démarreur j'ai peur. – WOPR

2

Si vous finalement allez lire les données, vous pouvez le faire:

SqlCommand comm = new SqlCommand("SELECT * FROM Products", connection); 
using (SqlDataReader reader = comm.ExecuteReader()) 
{ 
    while (reader.Read()) 
    { 
     Type type = reader.GetSqlValue(0).GetType(); 
     // OR Type type = reader.GetSqlValue("name").GetType(); 
     // yields type "System.Data.SqlTypes.SqlInt32" 
    } 
} 
1

question ancienne, mais si tout ce que vous essayez de faire est d'obtenir de la chaîne DATA_TYPE à la SqlDbType ENUM, la requête présentée dans la question initiale combinée à une ligne de code fera l'affaire:

string dataType = "nvarchar"; // result of the query in the original question 
var sqlType = (SqlDbType)Enum.Parse(typeof(SqlDbType), dataType, true); 
1

Vous pouvez utiliser ENUM System.Data.CommandBehavior comme pa ramter pour la méthode SqlCommand.ExecuteReader (System.Data.CommandBehavior.KeyInfo):

SqlCommand cmd = connection.CreateCommand(); 
cmd.CommandText = "select column from table"; 
SqlDataReader reader = cmd.ExecuteReader(System.Data.CommandBehavior.KeyInfo); 
SqlDbType type = (SqlDbType)(int)reader.GetSchemaTable().Rows[0]["ProviderType"]; 

Cet exemple ressemble à l'exemple avec l'aide de sql: SET FMTONLY ON; SET FMTONLY OFF. Mais vous ne devez pas utiliser SET FMTONLY. Et dans ce cas, vous ne recevez pas les données de la table. Vous recevez uniquement des métadonnées.

Questions connexes