2008-10-06 12 views
5

Biorąc pod uwagę obiekt SQLConnection, w jaki sposób można uzyskać schemat dla pojedynczej tabeli?Uzyskiwanie schematu tabeli

Próbowałem tego drugiego dnia i wydawało mi się, że mogę pobrać schemat z zestawu danych, który otrzymałem od zapytania, ale wszystkie informacje o schemacie, które mogłem uzyskać z połączenia, wydawały się być powiązane z jakie tabele były dostępne, a nie rzeczywiste szczegóły w tabelach.

Jestem pewien, że jest prosty sposób na zrobienie tego.

+0

Zobacz podobne: http://stackoverflow.com/ q/4155993 –

Odpowiedz

3

Myślę, że dostęp do schematu z kwerendy (za pośrednictwem GetSchemaTable) jest jedynym sposobem, aby to zrobić. Możesz uruchomić zapytanie, które nie zwraca żadnych wierszy (wybierz * z tabeli, gdzie 1 = 2), jeśli schemat jest wszystkim, czym jesteś zainteresowany.

Należy użyć KeyInfo CommandBehavour, aby wykonać zapytanie źródłowe, ponieważ w przeciwnym razie nie wszystkie informacje zwracane jest gwarancją dokładne

Command.ExecuteReader(CommandBehavior.KeyInfo) 
6

Kod ten będzie robić to, co chcesz (oczywiście zmienić nazwę tabeli, nazwa serwera 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 - kwerendy widoki wykazu. ... sysobjects, syscolumns itp. jeśli SQL 2000 lub wcześniejszych ... sys.objects, sys.columns itp jeśli SQL 2005 lub nowszy. (Choć starsze poglądy są nadal dostępne wskazane jest, aby korzystać z nowszych)

Kompletna odniesienie tutaj: http://msdn.microsoft.com/en-us/library/ms189783.aspx

Przykład:

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

Co możemy zrobić dla zapytań, a nie tylko tabel? na przykład. SELECT * FROM Table1 INNER JOIN Table2 ... – CSharper

Powiązane problemy