2008-10-06 9 views
5

Étant donné un objet SQLConnection, comment pouvez-vous obtenir un schéma pour une seule table? Je l'essayais l'autre jour et je semblais pouvoir obtenir le schéma d'un DataSet que j'avais obtenu à partir d'une requête, mais toutes les informations de schéma que je pouvais obtenir de la connexion semblaient être liées à quelles tables étaient disponibles et non les détails réels sur les tables.Obtention du schéma pour une table

Je suis sûr qu'il existe un moyen simple de le faire.

+0

Voir les documents connexes: http://stackoverflow.com/ q/4155993 –

Répondre

3

Je pense que l'accès au schéma à partir de la requête (via GetSchemaTable) est la seule façon de le faire. Vous pouvez exécuter une requête qui ne renvoie aucune ligne (sélectionnez * depuis la table où 1 = 2) si le schéma vous intéresse.

Vous devez utiliser KeyInfo CommandBehaviour pour exécuter la requête source, sinon toutes les informations retournées est garantie pour être précis

Command.ExecuteReader(CommandBehavior.KeyInfo) 
6

Ce code fera ce que vous voulez (évidemment changer le nom de la table, le nom du serveur, etc.):

using System; 
using System.Collections.Generic; 
using System.Text; 

using System.Data; 
using System.Data.SqlClient; 
using System.Data.SqlTypes; 

namespace ConsoleApp 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string query = "SELECT * FROM t where 1=0"; 
      string connectionString = "initial catalog=test;data source=localhost;Trusted_Connection=Yes"; 

      DataTable tblSchema; 

      using (SqlConnection cnn = new SqlConnection(connectionString)) 
      { 
       using (SqlCommand cmd = cnn.CreateCommand()) 
       { 
        cmd.CommandText = query; 
        cmd.CommandType = CommandType.Text; 
        cnn.Open(); 
        using (SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.KeyInfo)) 
        { 
         tblSchema = rdr.GetSchemaTable(); 
        } 
        cnn.Close(); 
       } 
      } 
      int numColumns = tblSchema.Columns.Count; 
      foreach (DataRow dr in tblSchema.Rows) 
      { 
       Console.WriteLine("{0}: {1}", dr["ColumnName"], dr["DataType"]); 
      } 

      Console.ReadLine(); 
     } 
    } 
} 
0

SQL server - interroger les vues du catalogue. .. sysobjects, syscolumns etc si SQL 2000 ou plus tôt ... sys.objects, sys.columns etc si SQL 2005 ou supérieur. (Bien que les vues anciennes sont encore disponibles, il est conseillé d'utiliser les plus récentes)

Référence complète ici: http://msdn.microsoft.com/en-us/library/ms189783.aspx

Exemple:

select so.name, sc.* 
from sys.objects as so 
inner join sys.columns as sc on sc.object_id = so.object_id 
where so.name='some_table' 
+0

Que pouvons-nous faire pour les requêtes, pas seulement les tables? par exemple. SELECT * FROM Table1 INNER JOIN Table2 ... – CSharper