10
votes

Comment obtenir le nom de la table d'une colonne de SQLDatreader

J'ai une requête SQL, je reçois à partir d'un fichier de configuration, cette requête contient généralement 3-6 jointures.

J'ai besoin de trouver au moment de l'exécution, en fonction du jeu de résultats représentée par SQLDatreader, pour trouver le nom de la Table pour chaque colonne. P>

Voici quelque chose qui ne fonctionne pas: p>

  • sqldatareader.getname renvoie le nom de la colonne mais pas le nom de la table. Li>
  • sqldatareader.getschematable renvoie une table de données avec des informations sur la colonne - mais tous les noms de table sont NULL. LI>
  • Interrogation Information_schema ne vous aide pas car j'ai besoin de données sur les résultats de la requête en cours (et les noms de colonne ne sont pas uniques - il existe des colonnes avec le même nom dans des tables différentes). LI> ul>

    J'utilise .NET 3.5SP1 / C # / SQL Server 2008 dans une application de console. P>

    EDIT: STRUT> Je sais que cela n'est pas possible pour tous Cas car une "colonne" peut être combinée à partir de plusieurs tables, une fonction ou même une expression constante - je cherche quelque chose qui fonctionne dans le cas simple. p>

    edit 2: forte > Découvrez pourquoi il n'a pas fonctionné - vous pouvez utiliser sqldatareader.getschematable pour obtenir des informations sur la table, mais vous devez définir CommandBehavior sur KeyInfo, vous le faites dans l'appel ExécuterAder: P>

    reader = cmd.ExecuteReader(CommandBehavior.KeyInfo);
    


1 commentaires

Je ne suis pas sûr que vous allez pouvoir le faire en fonction des Resultset. Vous aurez probablement besoin d'analyser le SQL à la place - pourquoi avez-vous besoin de cela?


7 Réponses :


2
votes

Je ne sais pas si cette information est disponible. En particulier, toutes les colonnes d'un ensemble de résultats proviennent d'une table. À partir d'un point de vue relationnel, des tables et des versenets sont la même chose.


0 commentaires

3
votes

Ce Question sans réponse sur Stackoverflow utilise sqldatreader.getschematable pour obtenir la table Nom. Leur problème est qu'il renvoie le nom de la table réel plutôt que l'alias que la table a. Je ne sais pas si cela fonctionne avec votre SQL mais que vous avez compris que je vous ferais savoir au cas où.


0 commentaires

12
votes

Vous pouvez utiliser sqldatareader.getschematable pour obtenir des informations sur la table, mais vous devez définir CommandBehavior sur KeyInfo, vous le faites dans l'appel ExecuterAreader:

reader = cmd.ExecuteReader(CommandBehavior.KeyInfo);


0 commentaires

1
votes

En général, ce n'est pas possible. Considérez la requête suivante:

SELECT col1 FROM table1
UNION ALL
SELECT col1 FROM table2


0 commentaires

1
votes

Vous pouvez le résoudre comme ce qui suit:

DataTable schemaTable = sqlReader.GetSchemaTable();

foreach (DataRow row in schemaTable.Rows)
{
    foreach (DataColumn column in schemaTable.Columns)
    {
        MessageBox.Show (string.Format("{0} = {1}", column.ColumnName, row[column]));
    }
}


0 commentaires

0
votes
SqlCeConnection conn = new SqlCeConnection("Data Source = Database1.sdf");
SqlCeCommand query = conn.CreateCommand();
query.CommandText = "myTableName";
query.CommandType = CommandType.TableDirect;
conn.Open();
SqlCeDataReader myreader = query.ExecuteReader(CommandBehavior.KeyInfo);
DataTable myDataTable= myreader.GetSchemaTable();
//thats the code you asked. in the loop
for (int i = 0; i < myDataTable.Rows.Count; i++)
{
    listView1.Columns.Add(myDataTable.Rows[i][0].ToString());
}

0 commentaires

2
votes
reader = cmd.ExecuteReader();
reader.GetSchemaTable().Rows[0]["BaseTableName"];

0 commentaires