2010-06-09 14 views

Respuesta

46

Es tan simple como esto:

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

donde _conn es un objeto SqlConnection que ya se ha conectado a la base de datos correcta.

+0

Una ventaja de este método sobre los métodos basados ​​en consultas es que obtienes metadatos sobre las tablas en una DataTable, que no es simple al usar consultas. (Pero me acabo de dar cuenta de que solo necesitas nombres :)) – apoorv020

6

Ejecutar un comando SQL para:

SELECT name FROM sysobjects WHERE xtype = 'U' 
4

Ver How to get a list of SQL Server databases de una manera:

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

Usted ni siquiera necesita el procedimiento almacenado :) – slugster

+3

Se trata de bases de datos, tablas y no como pedido, a la derecha ? –

4

Si desea obtener todos los nombres de tabla de una base de datos, puede hacer algo como esto;

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(); 
} 

conseguir todas las bases de datos utilizando la otra respuesta y crear una conexión con cada uno y utiliza las "GetAllTables" función para obtener todos los nombres de las tablas de ese db.

+0

Tu código funciona. Sin embargo, fallaste en abrir y cerrar la conexión. –

26

Sólo otra solución:

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

¿Has visto respuesta slugster? –

+2

'(cadena) fila [2];' me ayudó. Gracias. –

3

Otra forma, pero vale la pena mencionar: La API contenida en Microsoft.SqlServer.Smo.dll lo hace muy a la base de datos de acceso:

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; 
    } 
} 

La cosa más fresca es que el objeto Microsoft.SqlServer.Management.Smo.Table le permite realizar todo tipo de operaciones, como cambiar esquema, scripting, etc. ...

2

Mi versión de yonexbat respuesta

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

Creo que debería ser 'if (row [3] .ToString(). Equals (" BASE TABLE ", StringComparison.OrdinalIgnoreCase))' – tic

+0

gracias tic lo he corregido – irfandar

1

Gracias a Slugster por su respuesta. Aquí hay una explicación ampliada de cómo ver una lista de las tablas en una base de datos.

en una forma asp.net añadir lo siguiente:

<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> 

continuación, en C# código detrás de añadir la siguiente función:

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

sin olvidar añadir

using System.Data; 

y

SqlConnection objConn = new SqlConnection(); 

en la parte superior de su página/dentro de su clase principal.

Con dentro de su Page_Load:

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

connString es un archivo de clase (llamada connectionClass.cs) que se almacena en la carpeta App_Code

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

, finalmente, en la web.config

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

por ejemplo

3

estoy usando este ExtensionMethod de 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>();   
} 
Cuestiones relacionadas