2008-10-06 27 views
5

Cho một đối tượng SQLConnection làm thế nào bạn có thể nhận được một lược đồ cho một bảng đơn? Tôi đã cố gắng này vào ngày khác và tôi dường như có thể lấy giản đồ từ một DataSet mà tôi nhận được từ việc chạy truy vấn, nhưng tất cả thông tin lược đồ tôi có thể nhận được từ kết nối dường như có liên quan đến những bảng nào có sẵn và không phải là chi tiết thực tế trên các bảng.Lấy giản đồ cho một bảng

Tôi chắc chắn có một cách đơn giản để thực hiện việc này.

+0

Xem liên quan: http://stackoverflow.com/ q/4155993 –

Trả lời

3

Tôi nghĩ rằng việc truy cập giản đồ từ truy vấn (thông qua GetSchemaTable) là cách duy nhất để thực hiện điều đó. Bạn có thể chạy truy vấn không trả về hàng nào (chọn * từ bảng nơi 1 = 2) nếu lược đồ là tất cả những gì bạn quan tâm.

Bạn nên sử dụng KeyInfo CommandBehaviour để thực thi truy vấn nguồn, nếu không thì không tất cả các thông tin trả về là đảm bảo được chính xác

Command.ExecuteReader(CommandBehavior.KeyInfo) 
6

mã này sẽ làm những gì bạn muốn (rõ ràng là thay đổi tên bảng, tên máy chủ vv):

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 - truy vấn khung nhìn danh mục. .. sysobjects, syscolumns vv nếu SQL 2000 hoặc sớm hơn ... sys.objects, sys.columns vv nếu SQL 2005 hoặc cao hơn. (Mặc dù các quan điểm cũ vẫn có sẵn đó là khuyến khích sử dụng những cái mới hơn)

Toàn bộ tài liệu tham khảo ở đây: http://msdn.microsoft.com/en-us/library/ms189783.aspx

Ví dụ:

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

Chúng ta có thể làm gì cho các truy vấn, không chỉ các bảng? ví dụ. CHỌN * TỪ Table1 INNER JOIN Table2 ... – CSharper

Các vấn đề liên quan