2008-10-06 34 views
5

給定一個SQLConnection對象,如何獲得單個表的模式?獲取表的模式

我在前幾天嘗試了這個,我似乎可以從運行查詢獲得的DataSet中獲取模式,但是我可以從連接獲得的所有模式信息似乎與有哪些表格可用,而不是表格上的實際細節。

我敢肯定有一個簡單的方法來做到這一點。

+0

見相關:http://stackoverflow.com/ q/4155993 – 2010-11-11 17:06:30

回答

3

我想從查詢訪問模式(通過GetSchemaTable)是唯一的方法。 如果架構是您感興趣的所有模式,您可以運行不返回任何行的查詢(從*表中選擇*)。

您應該使用KeyInfo CommandBehaviour執行源查詢,否則不會返回的所有信息,是保證準確

Command.ExecuteReader(CommandBehavior.KeyInfo) 
6

此代碼將做你想做的(明顯變化表名稱,服務器名稱等):

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服務器 - 查詢目錄視圖。 .. sysobjects,syscolumns等如果SQL 2000或更早版本... sys.objects,sys.columns等,如果SQL 2005或更高。 (雖然上了年紀的觀點仍然可用,建議使用較新的)

完整的參考這裏: http://msdn.microsoft.com/en-us/library/ms189783.aspx

例子:

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

我們可以爲查詢做什麼,而不僅僅是表格?例如。 SELECT * FROM Table1 INNER JOIN Table2 ... – CSharper 2009-09-12 09:30:01