如何确定 DataTable 列是否未命名?

How can I determine if a DataTable column is unnamed?

提问人:Oskar Sjöberg 提问时间:7/19/2023 最后编辑:marc_sOskar Sjöberg 更新时间:7/31/2023 访问量:45

问:

我的子系统正在接收要在表中可视化的 SQL 查询。我之所以使用 DataTable,是因为我无法控制要可视化的 SQL 查询,并且它们可以很容易地显示在 DataGrid 中。

我基本上拥有的是:

var query = "SELECT 1";

var connection = new SqlConnection(connectionString);
var adapter = new SqlDataAdapter(query, connection);
var table = new DataTable();

adapter.Fill(table);

Console.WriteLine(table.Columns[0].ColumnName);

在这种情况下,DataTable 中的列名将被设置为,因为输入查询未指定列的名称。Column1

如何确定列名是实际的还是由实现生成的,因为查询未指定列名?Column1SqlDataAdapter

我的第一次尝试是检查,但我意识到这并不可靠。如果查询实际上指定了名称怎么办?此外,我担心“Column”可能会被翻译成 .NET Framework 本地化版本的其他内容。Column(N)Column1

我还在考虑解析输入SQL以确定列的命名方式,但这很快就会变得困难和/或容易出错。

C# 数据表 SQLClient

评论

0赞 Andrew Morton 7/19/2023
从 SQL Server 获取列名的任何答案是否有任何帮助?
0赞 Oskar Sjöberg 7/19/2023
没有。虽然有多种解决方案可以读取列 namnes,但如果您还希望填充数据表,则需要执行两次查询。我希望找到一种方法,通过一个查询同时完成这两个任务。
1赞 Cetin Basoz 7/19/2023
您可以分析查询。知道这一点的目的是什么?
0赞 Oskar Sjöberg 7/19/2023
我想显示 ColumnN 以外的其他内容,例如 (Unnamed) 如果它是没有名称的列。

答:

0赞 Oskar Sjöberg 7/19/2023 #1

有了它,就可以获得实际的列名。这就是用途。问题是该实例无法从 .SqlDataReaderSqlDataAdapterSqlDataReaderSqlDataAdapter

我的解决方案是重新实现该方法所需的基本功能,以设置实际的列名。SqlDataAdapter.Fill

我不得不使用属性而不是属性,因为实现会自动将属性值更改为,因为似乎要求属性是非空的和唯一的。CaptionColumnNameDataTableColumnNameColumn1ColumnName

最小实现:Fill

var query = "SELECT 1";

var connection = new SqlConnection(connectionString);
connection.Open();

var table = new DataTable();

// Fill
var command = new SqlCommand(query, connection);
var reader = command.ExecuteReader();

var fieldCount = reader.FieldCount;
for (var index = 0; index < fieldCount; index++)
{
    var name = reader.GetName(index);
    var fieldType = reader.GetFieldType(index);

    table.Columns.Add(new DataColumn { ColumnName = name, Caption = name, DataType = fieldType });
}

var valuesBuffer = new object[fieldCount];
while (reader.Read())
{
    reader.GetValues(valuesBuffer);
    table.Rows.Add(valuesBuffer);
}

Console.WriteLine(table.Columns[0].Caption); // Output: <empty string>