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

本文关键字:获取 查询 数据 | 更新日期: 2023-09-27 18:06:20

我有一个视图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

ALIAS1, Field2, Field3, Field4, ALIAS5

我想用c#和SQL来做这个

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

您要做的第一件事是确保没有返回数据:

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"]);
  }
}

您还可以查看SQL Catalog SYS Views

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

我发现最简单的方法是:

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));
    }
}

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

这里有一个很好的示例:

using System.Data;
using System.Data.OleDb;
OleDbConnection cn = new OleDbConnection();
OleDbCommand cmd = new OleDbCommand();
DataTable schemaTable; 
OleDbDataReader myReader; 
//Open a connection to the SQL Server Northwind database.
cn.ConnectionString = "Provider=SQLOLEDB;Data Source=server;User ID=login;
                       Password=password;Initial Catalog=Northwind";
cn.Open();
//Retrieve records from the Employees table into a DataReader.
cmd.Connection = cn;
cmd.CommandText = "SELECT * FROM Employees";
myReader = cmd.ExecuteReader(CommandBehavior.KeyInfo); 
//Retrieve column schema into a DataTable.
schemaTable = myReader.GetSchemaTable();
//For each field in the table...
foreach (DataRow myField in schemaTable.Rows){
    //For each property of the field...
    foreach (DataColumn myProperty in schemaTable.Columns) {
    //Display the field name and value.
    Console.WriteLine(myProperty.ColumnName + " = " + myField[myProperty].ToString());
    }
    Console.WriteLine();
    //Pause.
    Console.ReadLine();
}
//Always close the DataReader and connection.
myReader.Close();
cn.Close();

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

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"];
}

我使用以下方法获得所有列名。

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中的Rows包含关于表列的信息,我想要一个列名。

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(">>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<");
                    }
}
https://support.microsoft.com/en-us/kb/310107

查询在mysql中

SELECT * FROM vwGetData LIMIT 0

状态"置疑"
SELECT TOP 0 * FROM vwGetData
在oracle

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