FireDac 添加下划线 1 以区分具有相同名称的 2 个列名称
Posted
技术标签:
【中文标题】FireDac 添加下划线 1 以区分具有相同名称的 2 个列名称【英文标题】:FireDac adding underscore 1 to differentiate between 2 column names with the same name 【发布时间】:2016-11-01 10:25:13 【问题描述】:我有一个连接 2 个表的选择,因此这些表中存在具有相似名称的列,所以现在在检索结果时 FireDac 在第二个列名称中添加下划线 1 以区分 2
Select * from Table1 inner join Table2 on
Table1.id = Table2.id
当从具有相似名称的字段中获取记录时,我必须这样做......
Dataset.FieldByName('Name').asInteger
Dataset.FieldByName('Name_1').asInteger
我想知道是否有将_1更改为其他内容的设置,我想更改此设置的原因是我们曾经使用只添加了1的Interbase。
【问题讨论】:
【参考方案1】:我不知道这种配置。我能想到的唯一选择是不要使用SELECT *
,而是选择您实际需要的列,并为相同的列名使用别名,例如
SELECT Table1.Name, Table2.Name AS Name1, ... from Table1 inner join Table2 on
Table1.id = Table2.id
或者,如果您需要来自Table1
的所有列并且您必须使用SELECT *
,您可以使用:
SELECT Table1.*, Table2.Name AS Name1, ...
另请参阅:Why is “Select * from table” considered bad practice
【讨论】:
这是我实际上试图避免的,因为我需要很多字段 @Fero68,我确实意识到了这一点。但我没有看到任何其他选择。 AFAIK,您想要的无法完成。【参考方案2】:不要使用select * from
。命名您要获取的列,为它们定义别名并使用它们的表名(或它们的别名)来创建唯一名称。
select t1.Name as Name1, t2.Name as Name2 from Table1 t1 inner join Table2 t2 on t1.Name = t2.Name
您现在可以通过这种方式获取它们的值
Dataset.FieldByName('Name1').asInteger;
【讨论】:
我只是想知道。像“t1.Name”这样的寻址字段是 FireDac 的功能吗? 你确定这可以在 FireDac 中工作吗?这不适用于 ADO,并且具有与 OP 描述的相同的行为。 @kobik。完全正确 - 这就是我第一次检查的内容:) 我实际上是在尽量避免使用别名 @Fero68 为什么?别名可帮助您解决问题。有充分的理由使用它们。否则,您需要在数据库中以不同的方式命名列以上是关于FireDac 添加下划线 1 以区分具有相同名称的 2 个列名称的主要内容,如果未能解决你的问题,请参考以下文章
如何区分具有相同名称的多个进程并杀死所有在 C# 中以我的 USERNAME 运行的进程?