web-dev-qa-db-fra.com

Obtenir le nom de colonne de SQL Server

J'essaie d'obtenir les noms de colonne d'une table que j'ai stockée dans SQL Server 2008 R2.

J'ai littéralement tout essayé mais je n'arrive pas à trouver comment faire cela.

En ce moment c'est mon code en C #

public string[] getColumnsName()
{
        List<string> listacolumnas=new List<string>();

        using (SqlConnection connection = new SqlConnection(Connection))
        using (SqlCommand command = connection.CreateCommand())
        {
            command.CommandText = "SELECT TOP 0 * FROM Usuarios";
            connection.Open();

            using (var reader = command.ExecuteReader(CommandBehavior.KeyInfo))
            {
                reader.Read();

                var table = reader.GetSchemaTable();

                foreach (DataColumn column in table.Columns)
                {
                    listacolumnas.Add(column.ColumnName);
                }
            }
        }
        return listacolumnas.ToArray();
    }

Mais cela me retourne ce qui suit

<string>ColumnName</string>
<string>ColumnOrdinal</string>
<string>ColumnSize</string>
<string>NumericPrecision</string>
<string>NumericScale</string>
<string>IsUnique</string>
<string>IsKey</string>
<string>BaseServerName</string>
<string>BaseCatalogName</string>
<string>BaseColumnName</string>
<string>BaseSchemaName</string>
<string>BaseTableName</string>
<string>DataType</string>
<string>AllowDBNull</string>
<string>ProviderType</string>
<string>IsAliased</string>
<string>IsExpression</string>
<string>IsIdentity</string>
<string>IsAutoIncrement</string>
<string>IsRowVersion</string>
<string>IsHidden</string>
<string>IsLong</string>
<string>IsReadOnly</string>
<string>ProviderSpecificDataType</string>
<string>DataTypeName</string>
<string>XmlSchemaCollectionDatabase</string>
<string>XmlSchemaCollectionOwningSchema</string>
<string>XmlSchemaCollectionName</string>
<string>UdtAssemblyQualifiedName</string>
<string>NonVersionedProviderType</string>
<string>IsColumnSet</string>

Des idées?

Il affiche les balises <string> car c’est ainsi que mon service Web envoie les données.

Vous pouvez utiliser la requête ci-dessous pour obtenir les noms de colonne de votre table. La requête ci-dessous obtient toutes les colonnes d'une table utilisateur portant un nom donné:

select c.name from sys.columns c
inner join sys.tables t 
on t.object_id = c.object_id
and t.name = 'Usuarios' and t.type = 'U'

Dans votre code, cela ressemblera à ça:

public string[] getColumnsName()
{
    List<string> listacolumnas=new List<string>();
    using (SqlConnection connection = new SqlConnection(Connection))
        using (SqlCommand command = connection.CreateCommand())
        {
            command.CommandText = "select c.name from sys.columns c inner join sys.tables t on t.object_id = c.object_id and t.name = 'Usuarios' and t.type = 'U'";
            connection.Open();
            using (var reader = command.ExecuteReader())
            {
                while (reader.Read())
                {
                    listacolumnas.Add(reader.GetString(0));
                }
            }
        }
    return listacolumnas.ToArray();
}
19
Szymon

J'utilise généralement la méthode GetSchema pour récupérer des informations spécifiques à la colonne. Cet extrait renvoie les noms des colonnes dans une chaîne List:

        using (SqlConnection conn = new SqlConnection("<ConnectionString>"))
        {
            string[] restrictions = new string[4] { null, null, "<TableName>", null };
            conn.Open();
            var columnList = conn.GetSchema("Columns", restrictions).AsEnumerable().Select(s => s.Field<String>("Column_Name")).ToList();
        }
17
Mark Kram
SELECT COLUMN_NAME
FROM   
INFORMATION_SCHEMA.COLUMNS 
WHERE   
TABLE_NAME = 'YourTable' 
6
AnotherDeveloper
public string[] getColumnsName()
    {
        List<string> listacolumnas=new List<string>();
        using (SqlConnection connection = new SqlConnection(Connection))
        using (SqlCommand command = connection.CreateCommand())
        {
            command.CommandText = "select column_name from information_schema.columns where table_name = 'Usuarios'";
            connection.Open(;
            using (var reader = command.ExecuteReader(CommandBehavior.KeyInfo))
            {
                reader.Read();

                var table = reader.GetSchemaTable();
                foreach (DataColumn column in table.Columns)
                {
                    listacolumnas.Add(column.ColumnName);

                }
            }
        }
        return listacolumnas.ToArray();
    }
3
M.Ali
sp_columns - http://technet.Microsoft.com/en-us/library/ms176077.aspx

Il existe de nombreuses procédures stockées intégrées pour ce type de choses. 

1
jcwrequests

Le message original était proche du but, juste quelques petits changements et vous l’avez eu. Voici ma solution.

   public List<string> GetColumns(string tableName)
    {
        List<string> colList = new List<string>();
        DataTable dataTable = new DataTable();


        string cmdString = String.Format("SELECT TOP 0 * FROM {0}", tableName);

        if (ConnectionManager != null)
        {
            try
            {
                using (SqlDataAdapter dataContent = new SqlDataAdapter(cmdString, ConnectionManager.ConnectionToSQL))
                {
                    dataContent.Fill(dataTable);

                    foreach (DataColumn col in dataTable.Columns)
                    {
                       colList.Add(col.ColumnName);
                    }
                }                   
            }
            catch (Exception ex)
            {
                InternalError = ex.Message;
            }
        }


        return colList;
    }
1
Sierra

Actuellement, il y a deux façons de penser à cela:

  • En SQL pur SQL Server, vous pouvez utiliser les vues définies dans INFORMATION_SCHEMA.COLUMNS. Dans ce cas, vous devrez sélectionner la ligne de votre table, en la faisant correspondre à la colonne TABLE_NAME.
  • Puisque vous utilisez C #, il est probablement plus facile d’obtenir les noms de l’instance SqlDataReader renvoyée par ExecuteReader. La classe fournit une propriété FieldCount, pour le nombre de colonnes, et une méthode GetName(int), prenant le numéro de colonne comme argument et renvoyant le nom de la colonne.
0
user2880576