提问人:Oskar Sjöberg 提问时间:7/19/2023 最后编辑:marc_sOskar Sjöberg 更新时间:7/31/2023 访问量:45
如何确定 DataTable 列是否未命名?
How can I determine if a DataTable column is unnamed?
问:
我的子系统正在接收要在表中可视化的 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
如何确定列名是实际的还是由实现生成的,因为查询未指定列名?Column1
SqlDataAdapter
我的第一次尝试是检查,但我意识到这并不可靠。如果查询实际上指定了名称怎么办?此外,我担心“Column”可能会被翻译成 .NET Framework 本地化版本的其他内容。Column(N)
Column1
我还在考虑解析输入SQL以确定列的命名方式,但这很快就会变得困难和/或容易出错。
答:
0赞
Oskar Sjöberg
7/19/2023
#1
有了它,就可以获得实际的列名。这就是用途。问题是该实例无法从 .SqlDataReader
SqlDataAdapter
SqlDataReader
SqlDataAdapter
我的解决方案是重新实现该方法所需的基本功能,以设置实际的列名。SqlDataAdapter.Fill
我不得不使用属性而不是属性,因为实现会自动将属性值更改为,因为似乎要求属性是非空的和唯一的。Caption
ColumnName
DataTable
ColumnName
Column1
ColumnName
最小实现: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>
评论