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>
J'utilise .NET 3.5SP1 / C # / SQL Server 2008 dans une application de console. 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);
7 Réponses :
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. P>
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ù. P>
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);
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
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])); } }
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()); }
reader = cmd.ExecuteReader(); reader.GetSchemaTable().Rows[0]["BaseTableName"];
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?