【问题标题】:How to retrieve real column name of aliased column如何检索别名列的真实列名
【发布时间】:2014-01-20 23:14:22
【问题描述】:

我需要从我通过FillSchema() 方法填充的DataTable 中获取真实的列名, 这是我使用的查询(SELECT ID AS [SNO],CATEG_NAME AS [Category] FROM Categories)

        var dt = new DataTable();
        SqlDataAdapter da = new SqlDataAdapter("SELECT ID AS [SNO],CATEG_NAME AS [Category] FROM Categories",conn);
        da.FillSchema(dt, SchemaType.Source);
        dt.FillBySql(sql);

当我检查dt.columns 时,我发现有 2 列具有与查询中提到的相同别名。我该怎么做才能得到真正的专栏names(id, categ_name)

【问题讨论】:

  • 如果你不想使用别名,为什么还要使用它们? SELECT * FROM Categories 很容易获得所有列名。另一种选择是ExecuteReader(CommandBehavior.SchemaOnly))stackoverflow.com/a/12161051/284240 另一个选项是使用数据库中的INFORMATION_SCHEMA.COLUMNS 表。 stackoverflow.com/a/600457/284240
  • 我使用别名为数据网格视图中显示的每个字段制作标题,还需要检索真实的列名以在另一个重要任务中使用它们
  • 请注意,当我使用 ExecuteReader(CommandBehavior.SchemaOnly) 时,它返回的模式表包含有关上述查询中每一列的所有内容,但不幸的是它无法识别别名列并给我 ColumnName = SNO ,, , BaseColumnName = SNO ,,, IsAliased =

标签: c# sql datatable alias


【解决方案1】:

我尝试添加一个名称与别名列名称相同的列,但只是让它为空。 see column

然后我执行这个查询:

SELECT 
    status_action,
    isread, 
    CONCAT( 
        FLOOR(HOUR(TIMEDIFF(work_given, sysdate())) / 24), 
        ' days, ', 
        MOD(HOUR(TIMEDIFF(work_given, sysdate())), 24), 
        ' hours, ', 
        MINUTE(TIMEDIFF(work_given, sysdate())), 
        ' minutes') **as** **workgivendays** 
from progressreport

然后我称之为使用MySqlDataReader 像这样:

MySqlDataReader mdr = cmd.ExecuteReader(); workgivendays = mdr.GetString("workgivendays"); 它有效

【讨论】:

    【解决方案2】:

    我相信最好的办法是在 C# 中更改它们,而不是在 SQL 中为它们起别名。这不是最佳实践,但这种解决方法对我有用。

    在数据绑定数据网格视图上,您​​必须更改底层数据表。此示例会将列的名称从“ID”更改为“SNO”。确保您更改了表格的副本,以使原始表格保持不变。

    var dt = new DataTable();
    SqlDataAdapter da = new SqlDataAdapter("SELECT ID,CATEG_NAME AS [Category] FROM Categories",conn);
    da.FillSchema(dt, SchemaType.Source);
    
    dt.FillBySql(sql);
    DataTable clonedWithColumnsChanged= dt.Copy();
    clonedWithColumnsChanged.Columns["ID"].ColumnName = "SNO";
    dgvReports.DataSource = clonedWithColumnsChanged;
    

    【讨论】:

    • 这个解决方案不能解决我的问题,因为我尝试开发自定义 DataGridView 而我的目标是简化一切,在我的情况下,我需要提取真实的列名来自动生成插入和更新查询基于提取的列名
    • 您可以使用存储过程进行插入和更新。 stackoverflow.com/questions/15142/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-06
    • 2022-01-27
    • 2017-04-14
    • 1970-01-01
    相关资源
    最近更新 更多