C# 从没有数据的查询中获取列名

C# 从没有数据的查询中获取列名,c#,sql,sql-server,sql-server-2008,tsql,C#,Sql,Sql Server,Sql Server 2008,Tsql,我有一个视图vwGetData,它从两个表t1、t2获取数据,并有字段: t1.Field1 [ALIAS1], t1.Field2, t2.Field3, t2.Field4, t2.Field5 [ALIAS5] 我将提供以下输入 Select * from vwGetData 我想在C/SQL中得到下面的输出 ALIAS1 Field2 Field3 Field4 ALIAS5 或 我想用C和SQL来实现这一点。有一个: SELECT COLUMN_NAME FROM INFO

我有一个视图vwGetData,它从两个表t1、t2获取数据,并有字段:

t1.Field1 [ALIAS1], t1.Field2, t2.Field3, t2.Field4, t2.Field5 [ALIAS5]
我将提供以下输入

Select * from vwGetData
我想在C/SQL中得到下面的输出

ALIAS1
Field2
Field3
Field4
ALIAS5

我想用C和SQL来实现这一点。

有一个:

SELECT COLUMN_NAME
FROM   
INFORMATION_SCHEMA.COLUMNS 
WHERE   
TABLE_NAME = 'vwGetData' 
ORDER BY 
ORDINAL_POSITION ASC; 

您要做的第一件事是确保不返回任何数据:

SELECT TOP 0 [vwGetData].* FROM [vwGetData] WHERE 1 = 2;
现在假设您知道如何设置DataReader,您将执行以下操作:

using(var reader = command.ExecuteReader())
{
  // This will return false - we don't care, we just want to make sure the schema table is there.
  reader.Read();

  var tableSchema = reader.GetSchemaTable();

  // Each row in the table schema describes a column
  foreach (DataRow row in tableSchema.Rows)
  {
    Console.WriteLine(row["ColumnName"]);
  }
}

您还可以查看。

您还可以将数据加载到数据表中,如下所示:

DataTable dtTable = new DataTable();

using (SqlCommand command = new SqlCommand("SELECT * FROM Table", conn))
{
    SqlDataReader reader = command.ExecuteReader();
    dtTable.Load(reader);
}
var column = dtTable.Rows[0]["YourColumn"];
foreach (var c in dtTable.AsEnumerable())
{
    var column = c["YourColumn"];
}
并检索第一行中的列,如下所示:

DataTable dtTable = new DataTable();

using (SqlCommand command = new SqlCommand("SELECT * FROM Table", conn))
{
    SqlDataReader reader = command.ExecuteReader();
    dtTable.Load(reader);
}
var column = dtTable.Rows[0]["YourColumn"];
foreach (var c in dtTable.AsEnumerable())
{
    var column = c["YourColumn"];
}
或循环遍历所有行并引用列,如下所示:

DataTable dtTable = new DataTable();

using (SqlCommand command = new SqlCommand("SELECT * FROM Table", conn))
{
    SqlDataReader reader = command.ExecuteReader();
    dtTable.Load(reader);
}
var column = dtTable.Rows[0]["YourColumn"];
foreach (var c in dtTable.AsEnumerable())
{
    var column = c["YourColumn"];
}

我找到的最简单的方法就是这个

using (SqlCommand command = new SqlCommand("SELECT * FROM vwGetData", conn))
{
    SqlDataReader reader = command.ExecuteReader();
    while (reader.Read())
    {
        for (int i = 0; i < reader.FieldCount; i++)
            Console.Writeline(reader.GetName(i));
    }
}

这将为您的每一行结果打印列名。

我将使用以下方法获取所有列名

private static List<string> GetColumnNamesFromTableSchema(IDataReader reader)
    {
        var schemaTable = reader.GetSchemaTable();
        var columnNames = new List<string>();
        if (schemaTable != null)
            columnNames.AddRange(from DataRow row in schemaTable.Rows select row["ColumnName"].ToString());
        return columnNames;
    }
控制台应用程序版本

GetSchemaTable返回的DataTable中的行包含有关表列的信息,我只需要一个列名称

using (SqlConnection connection = new SqlConnection("Connection String"))
                {
                    SqlCommand command = new SqlCommand("select top 10 * from myschema.MyTable", connection);
                    connection.Open();
                    SqlDataReader reader = command.ExecuteReaderAsync().Result;  
                    DataTable schemaTable = reader.GetSchemaTable();
                    foreach (DataRow row in schemaTable.Rows)
                    {
                        //Console.WriteLine(row["ColumnName"]);
                        foreach (DataColumn column in schemaTable.Columns)
                        {    
                            Console.WriteLine(string.Format("{0} = {1}", column.ColumnName, row[column.ColumnName]));                                   

                        }
                        Console.WriteLine(">>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<");
                    }
}
质疑 在mysql中

在sqlserver中

SELECT TOP 0 * FROM vwGetData
在甲骨文中

SELECT * FROM vwGetData WHERE ROWNUM <=0
然后从c执行查询 例如“oracle”

OracleDataAdapter adapter = new OracleDataAdapter(query, connection);
System.Data.DataTable result = new System.Data.DataTable();
adapter.Fill(result);

List<string> columns = new List<string>();
foreach(DataColumn item in result.Columns)
{
    columns.Add(item.ColumnName);
}
return columns;

您可以获得所有列列表

1.在sql查询编辑器中,只写表名


2.选择表名并按Alt+F1

这两个表之间的关系如何?可能只需添加其中的1=0并检查返回的列?发布到目前为止您编写的代码?问题是什么?他们真的可以在示例代码中处理资源!这是否会从员工处获取所有数据SELECT*,然后返回列信息?这就是我需要的TOP 0做到的:您也可以使用SELECT TOP 0[vwGetData].*FROM[vwGetData],其中1=2;使用关闭行返回功能怎么样?对于这种情况,此功能内置于SQL中。示例:将FMTONLY设置为SELECT*从vwGetData SET FMTONLY OFFinstead,其中1=2,您可以使用command.ExecuteReaderCommandBehavior.SchemaOnly。我是C的初学者。如何在C代码块中使用此查询?可能是我的SQL Server 2008版本,但其他建议的解决方案都不起作用,甚至不是公认的答案。只有这一个做到了,只是说,在几乎所有其他解决方案都失败的情况下,我的工作对我来说很有魅力——所以非常感谢!你能详细说明一下吗?这是怎么回事