2010-06-09 8 views

Odpowiedz

46

Jest to tak proste, jak to:

DataTable t = _conn.GetSchema("Tables"); 

gdzie _conn jest obiektem SqlConnection który został już podłączony do poprawnej bazy danych.

+0

Zaletą tej metody w porównaniu z metodami opartymi na zapytaniach jest uzyskanie metadanych dotyczących tabel w tabeli DataTable, co nie jest proste przy użyciu zapytań. (Ale właśnie zdałem sobie sprawę, że potrzebujesz tylko imion :)) – apoorv020

6

wykonać polecenie SQL dla:

SELECT name FROM sysobjects WHERE xtype = 'U' 
4

Zobacz How to get a list of SQL Server databases na jeden sposób:

System.Data.SqlClient.SqlConnection SqlCon = new System.Data.SqlClient.SqlConnection("server=192.168.0.1;uid=sa;pwd=1234"); 
SqlCon.Open(); 

System.Data.SqlClient.SqlCommand SqlCom = new System.Data.SqlClient.SqlCommand(); 
SqlCom.Connection = SqlCon; 
SqlCom.CommandType = CommandType.StoredProcedure; 
SqlCom.CommandText = "sp_databases"; 

System.Data.SqlClient.SqlDataReader SqlDR; 
SqlDR = SqlCom.ExecuteReader(); 

while(SqlDR.Read()) 
{ 
MessageBox.Show(SqlDR.GetString(0)); 
} 
+0

Nie trzeba nawet przechowywanej proc :) – slugster

+3

To baz danych, a nie tabele zapytał prawo ? –

4

Jeśli chcesz uzyskać wszystkie nazwy tabel z bazy danych, możesz zrobić coś takiego;

string[] GetAllTables(SqlConnection connection) 
{ 
    List<string> result = new List<string>(); 
    SqlCommand cmd = new SqlCommand("SELECT name FROM sys.Tables", connection); 
    System.Data.SqlClient.SqlDataReader reader = cmd.ExecuteReader(); 
    while(reader.Read()) 
    result.Add(reader["name"].ToString()); 
    return result.ToArray(); 
} 

Get wszystkich baz danych przy użyciu innej odpowiedzi i utworzenie połączenia do siebie i korzystać z funkcji „GetAllTables”, aby uzyskać wszystkie nazwy tabel z tego db.

+0

Twój kod działa. Tęskniłeś, aby otworzyć i zamknąć połączenie. –

26

Tylko inne rozwiązanie:

public IList<string> ListTables() 
    { 
     List<string> tables = new List<string>(); 
     DataTable dt = _connection.GetSchema("Tables"); 
     foreach (DataRow row in dt.Rows) 
     { 
      string tablename = (string)row[2]; 
      tables.Add(tablename); 
     } 
     return tables; 
    } 
+6

czy widzisz odpowiedź na pytanie? –

+2

'(ciąg) wiersz [2];' pomógł mi. dzięki. –

3

Innym sposobem, ale warto wspomnieć: API zawarte w Microsoft.SqlServer.Smo.dll czyni go bardzo do dostępu do bazy danych:

private IEnumerable<string> getAllTables() 
{ 
    var sqlConnection = new System.Data.SqlClient.SqlConnection(connectionString); 
    var serverConnection = new Microsoft.SqlServer.Management.Common.ServerConnection(sqlConnection); 
    var server = new Microsoft.SqlServer.Management.Smo.Server(serverConnection); 
    var database = server.Databases[databaseName]; 
    foreach (Microsoft.SqlServer.Management.Smo.Table table in database.Tables) 
    { 
    yield return table.Name; 
    } 
} 

Najfajniejsze jest to, że obiekt Microsoft.SqlServer.Management.Smo.Table umożliwia wykonywanie różnych operacji, takich jak zmiana schematu, wykonywanie skryptów itp.

2

Moja wersja odpowiedzi yonexbat

public System.Collections.Generic.Dictionary<string, string> GetAllTables(System.Data.SqlClient.SqlConnection _connection) 
{ 
    if (_connection.State == System.Data.ConnectionState.Closed) 
     _connection.Open(); 
    System.Data.DataTable dt = _connection.GetSchema("Tables"); 
    System.Collections.Generic.Dictionary<string, string> tables = new System.Collections.Generic.Dictionary<string, string>(); 
    foreach (System.Data.DataRow row in dt.Rows) 
    { 
     if (row[3].ToString().Equals("BASE TABLE", StringComparison.OrdinalIgnoreCase)) //ignore views 
     { 
      string tableName = row[2].ToString(); 
      string schema = row[1].ToString(); 
      tables.Add(tableName, schema); 
     } 
    } 
    _connection.Close(); 
    return tables; 
} 
+1

Myślę, że powinno to być 'if (wiersz [3] .ToString(). Równe (" BASE TABLE ", StringComparison.OrdinalIgnoreCase))' – tic

+0

dzięki tic poprawiłem to – irfandar

1

Dzięki Slugster na jego odpowiedź. Oto rozszerzone wyjaśnienie, jak wyświetlić listę tabel w bazie danych.

w formie asp.net dodać następujące:

<div> 
    <asp:Button ID="GridViewTableListButton" runat="server" Text="List all Tables on server" 
     onclick="GridViewTableListButton_Click" /> 
    <asp:GridView ID="GridViewTableList" runat="server"> 
    </asp:GridView> 
</div> 

następnie w kod C# za dodać następującą funkcję:

protected void GridViewTableListButton_Click(object sender, EventArgs e) 
{ 
    objConn.Open(); 
    DataTable t = objConn.GetSchema("Tables"); 
    GridViewTableList.DataSource = t; 
    GridViewTableList.DataBind(); 
    objConn.Close(); 
} 

nie zapominając dodać

using System.Data; 

i

SqlConnection objConn = new SqlConnection(); 

u góry strony/wewnątrz klasy nadrzędnej.

Z wewnątrz Page_Load:

objConn.ConnectionString = ConfigurationManager.ConnectionStrings[connString].ConnectionString; 

connString jest plik klasy (tzw connectionClass.cs), które są przechowywane w folderze App_Code

public class connectionClass 
{ 
..... 
    public string connClass() 
    { 
     connString = "LocalSqlServer"; // LOCAL home PC Version 
    } 
} 

wreszcie w internecie.config

<add name="LocalSqlServer" connectionString="Data Source=MyPCsName\SQLEXPRESS;Initial Catalog=databasename;Integrated Security=True" providerName="System.Data.SqlClient"/> 

np

3

Używam tego ExtensionMethod dla SqlConnection:

public static List<string> GetTableNames(this SqlConnection connection) 
{ 
    using(SqlConnection conn = connection) 
    { 
     if(conn.State == ConnectionState.Open) 
     { 
      return conn.GetSchema("Tables").AsEnumerable().Select(s => s[2].ToString()).ToList(); 
     }    
    } 
    //Add some error-handling instead ! 
    return new List<string>();   
} 
Powiązane problemy