2010-08-23 7 views
5

Cho một cơ sở dữ liệu, làm cách nào tôi có thể truy xuất danh sách các Bảng cùng với khóa chính của mỗi bảng?Làm cách nào để có danh sách các bảng trong cơ sở dữ liệu SQL Server cùng với khóa chính bằng CHỈ C#?

Cảm ơn.

Chỉnh sửa: Đây là công cụ tạo mã mà tôi đang tạo, tôi cần bằng cách nào đó chạy tập lệnh SQL bằng C#.

+0

bản sao có thể có của [Làm cách nào để có danh sách tất cả các bảng trong cơ sở dữ liệu bằng TSQL?] (Http://stackoverflow.com/questions/175415/how-do-i-get-list-of-all-tables -in-a-database-using-tsql) –

+2

Không trùng lặp. Tôi muốn mã C#, không phải TSQL. Có một sự khác biệt lớn. –

+4

@Sergio: Cách để làm điều đó trong C# sẽ là thực thi một tập lệnh TSQL (ví dụ: SP). – Brian

Trả lời

6

Điều này không sử dụng T-SQL. Nó tự tạo ra nó nhưng sẽ không hiệu quả bằng cách sử dụng chính xác, ngắn gọn T-SQL sẽ nhận được cùng một thông tin.

using Microsoft.SqlServer.Management.Common; 
using Microsoft.SqlServer.Management.Smo; 

public class LoadStuff 
{ 
    string mDatabaseConnectionString = "Something"; 
    ... 
    public void LoadDatabase(string tDatabaseName) 
    { 
     using (var vSqlConnection = new SqlConnection(mDatabaseConnectionString)) 
     { 
      var vConnection = new ServerConnection(vSqlConnection); 
      var vServer = new Server(vConnection); 
      var vDatabase = vServer.Databases[tDatabaseName]; 
      var vTables = vDatabase.Tables; 
     } 
    } 
} 

Mỗi đối tượng trong bộ sưu tập "vTables" sẽ là định nghĩa cho Bảng trong cơ sở dữ liệu đó được gọi là vDatabaseName.

Bảng đó sẽ có một tập hợp các cột và các khóa chính có thể được tìm thấy được lặp qua thuộc tính "Cột" của mỗi bảng. Bất kỳ cột nào trong khóa chính sẽ có thuộc tính "InPrimaryKey" được đánh dấu đúng.

Ngoài ra, bạn phải lấy tất cả thông tin ra khỏi các đối tượng khác nhau TRƯỚC KHI kết thúc khối sử dụng. Tôi đã đi về làm cho các lớp học nhỏ mà chỉ có thông tin tôi cần một khi toàn bộ quá trình đã được thực hiện, nhưng bạn có thể có thể chỉ nhổ ra mã từ việc tạo mã thay thế.

+1

Điều đó phụ thuộc vào ý bạn là "không sử dụng T-SQL". Không có T-SQL trong mã, nhưng có lẽ nó đang chạy nhiều T-SQL hơn các câu trả lời khác nhận được mọi thứ chúng ta cần trong một truy vấn. – stevemegson

+1

SMO sẽ tạo và chạy mã T-SQL bắt buộc cho bạn và nhà phát triển ứng dụng không phải lo lắng về mã thực tế, quản lý thay đổi phiên bản cơ sở dữ liệu, SQL injection, v.v. Khi bạn tung các vòng để trích xuất dữ liệu bạn cần từ điều này, bạn kết thúc với cùng một kết quả ... và nếu các yêu cầu * * là "không có T-SQL trong mã C#", thì đây là những gì bạn cần. –

+0

Vâng tôi đã dùng nó vì anh ta không thể sử dụng T SQL để làm như vậy. Hoặc ở mức tối thiểu, anh ta phải sử dụng càng nhiều càng tốt để làm điều đó. Nó sử dụng t SQL nhưng người sử dụng đoạn mã này chỉ sử dụng mã, không có chuỗi lệnh hay gì cả. – Rangoric

1

Dưới đây là một sự khởi đầu (SQL 2005 trở lên):

SELECT ta.name TableName, ind.name IndexName 
from sys.tables ta 
    left outer join sys.indexes ind 
    on ind.object_id = ta.object_id 
    and ind.is_primary_key = 1 

Bàn mà không cần khóa chính có IndexName thiết lập để Null.

Nhưng điều này chỉ liệt kê tên của khóa chính. Bạn có cần danh sách (các) cột trong khóa không?

- ADDED ----------------

Đây là một phần của tiện ích mà tôi từng viết. Điều này sẽ liệt kê tất cả các bảng, và các cột theo thứ tự của tất cả các khóa chính hiện có:

SELECT ta.name TableName, ind.name IndexName, indcol.key_ordinal IndexColumnOrder, col.name ColumnName 
from sys.tables ta 
    left outer join sys.indexes ind 
    on ind.object_id = ta.object_id 
    and ind.is_primary_key = 1 
    left outer join sys.index_columns indcol 
    on indcol.object_id = ta.object_id 
    and indcol.index_id = ind.index_id 
    left outer join sys.columns col 
    on col.object_id = ta.object_id 
    and col.column_id = indcol.column_id 
order by 
    ta.Name 
    ,indcol.key_ordinal 

Hacking rằng, sau đây sẽ liệt kê tất cả (và duy nhất) bảng với khóa chính chỉ có một cột:

SELECT ta.name TableName, max(col.name) ColumnName 
from sys.tables ta 
    inner join sys.indexes ind 
    on ind.object_id = ta.object_id 
    and ind.is_primary_key = 1 
    inner join sys.index_columns indcol 
    on indcol.object_id = ta.object_id 
    and indcol.index_id = ind.index_id 
    inner join sys.columns col 
    on col.object_id = ta.object_id 
    and col.column_id = indcol.column_id 
group by ta.name 
having count(*) = 1 
order by ta.Name 

Để chuyển đổi thành C# (không phải sở trường của tôi), bạn có thể thực hiện thủ tục này hoặc chỉ cần tạo và gửi truy vấn từ bên trong mã của bạn.

+0

Hãy tưởng tượng bảng Person có các cột ID là khóa chính. Tôi cần tên chính xác của cột đó. Tôi cũng cần phải bằng cách nào đó gọi điều này bên trong mã C#. Tôi có thể làm cái này như thế nào? –

+0

Bạn có thể tham khảo các cột PK theo vị trí thứ tự (0,1) thay vì tên (ID, loại) không? – Beth

3

Dưới đây là một câu trả lời:

select 
    t.Table_Name, 
    tc.Constraint_Name, 
    ccu.Column_Name 
from 
    information_schema.tables t 
    left join information_schema.table_constraints tc 
     on tc.Table_Catalog = t.Table_Catalog 
     and tc.Table_Name = t.Table_Name 
     and tc.Constraint_Type = 'PRIMARY KEY' 
    left join information_schema.constraint_column_usage ccu 
     on ccu.Table_Catalog = tc.Table_Catalog 
     and ccu.Table_Name = tc.Table_Name 
     and ccu.Constraint_Schema = tc.Constraint_Schema 
     and ccu.Constraint_Name = tc.Constraint_Name 
order by 
    t.Table_Name, 
    tc.Constraint_Name, 
    ccu.Column_Name 

chí này bảng danh sách, ràng buộc khoá chính của họ, và các cột trong những trở ngại. Lưu ý rằng nếu khóa chính có nhiều cột, sẽ có nhiều mục nhập cho cột đó. Cũng lưu ý rằng truy vấn này cũng trả về lượt xem.

+0

Tôi cần C#, không phải TSQL. –

+0

Người dùng không chạy lệnh TSQL; mã C# của bạn là. Phản đối của bạn khi tạo kết nối SQL và sử dụng điều này làm lệnh SQL trong C# là gì? Đây không phải là khả năng tiêm SQL ở đây. –

0

Bạn sử dụng các đối tượng SqlCommand để thực hiện t-sql chống lại một cơ sở dữ liệu ..

dự liệu đây có nhiều ví dụ trong C# và các ngôn ngữ khác: http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.aspx

Hoặc bạn có nghĩa là trực tiếp bằng cách sử dụng CLR xây dựng vào máy chủ SQL?

+0

Tôi không thể có người dùng cuối chạy lệnh TSQL, tôi cần sử dụng C# thuần túy. –

+0

Bạn có hiểu mối quan hệ giữa máy chủ SQL và khung dotnet không? SQLCommand là cơ bản - chỉ là về TẤT CẢ các tương tác giữa bất kỳ ứng dụng dotnet/framwork và máy chủ SQL xảy ra thông qua đối tượng đó ... Hãy giải thích cách bạn tưởng tượng một ứng dụng tương tác với một cơ sở dữ liệu !!!!!! Tôi đã quyết định không mua 'sản phẩm' của bạn – Adrian

+0

Rất có thể. Thực hiện một tùy chỉnh thu thập điều không phải là doable, tuy nhiên có một MS tạo ra thư viện mà được thông tin cơ sở dữ liệu đã có. Bạn có thể nhận được bất kỳ thông tin phi dữ liệu nào bạn muốn về một cơ sở dữ liệu mà không cần viết bất kỳ T-SQL nào. – Rangoric