c# - tablas - optimizar consultas lentas mysql
Obtener el esquema de una tabla (3)
Dado un objeto SQLConnection, ¿cómo se puede obtener un esquema para una sola tabla?
Lo intenté el otro día y parecía ser capaz de obtener el esquema de un DataSet que había obtenido al ejecutar una consulta, pero toda la información de esquema que podía obtener de la conexión parecía estar relacionada con las tablas disponibles. y no los detalles reales en las tablas.
Estoy seguro de que hay una manera simple de hacer esto.
Creo que acceder al esquema desde la consulta (a través de GetSchemaTable) es la única forma de hacerlo. Puede ejecutar una consulta que no devuelva filas (seleccione * de la tabla donde 1 = 2) si el esquema es todo lo que le interesa.
Debe usar KeyInfo CommandBehaviour para ejecutar la consulta de origen, ya que de lo contrario no se garantiza que toda la información devuelta sea precisa
Command.ExecuteReader(CommandBehavior.KeyInfo)
Este código hará lo que quiera (obviamente, cambie el nombre de la tabla, el nombre del servidor, etc.):
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();
}
}
}
SQL Server: consulta las vistas de catálogo ... sysobjects, syscolumns, etc., si SQL 2000 o anterior ... sys.objects, sys.columns, etc., si es SQL 2005 o superior. (aunque las vistas anteriores todavía están disponibles, es aconsejable usar las más nuevas)
Referencia completa aquí: http://msdn.microsoft.com/en-us/library/ms189783.aspx
Ejemplo:
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''