我从配置文件中获得了一个SQL查询,此查询通常包含3-6个连接。
我需要在运行时根据SqlDataReader表示的结果集找到每个列的表名。
以下是一些不起作用的事情:
我在控制台应用程序中使用.net 3.5SP1 / C#/ SQL Server 2008。
编辑:我知道这对所有情况都不可能,因为“列”可以从多个表,一个函数甚至一个常量表达式中组合 - 我正在寻找可以工作的东西简单的案例。
编辑2:找出它无法正常工作的原因 - 您可以使用SqlDataReader.GetSchemaTable获取表信息,但必须将CommandBehavior设置为KeyInfo,您可以在ExecuteReader调用中执行此操作: / p>
reader = cmd.ExecuteReader(CommandBehavior.KeyInfo);
答案 0 :(得分:10)
您可以使用SqlDataReader.GetSchemaTable获取表信息,但您必须将CommandBehavior设置为KeyInfo,您可以在ExecuteReader调用中执行此操作:
reader = cmd.ExecuteReader(CommandBehavior.KeyInfo);
答案 1 :(得分:2)
我不知道这些信息是否可用。特别是,并非结果集的所有列都来自表。从关系的角度来看,表和结果集是相同的。
答案 2 :(得分:2)
stackoverflow上的unanswered question使用SqlDataReader.GetSchemaTable来获取表名。他们的问题是它返回实际的表名而不是表所具有的别名。不确定这是否适用于你的sql,但我想我会告诉你以防万一。
答案 3 :(得分:1)
一般来说,这是不可能的。请考虑以下查询:
SELECT col1 FROM table1
UNION ALL
SELECT col1 FROM table2
很明显,col1来自多个表。
答案 4 :(得分:1)
你可以像下面这样解决它:
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]));
}
}
答案 5 :(得分:0)
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());
}
答案 6 :(得分:0)
reader = cmd.ExecuteReader();
reader.GetSchemaTable().Rows[0]["BaseTableName"];