如何从.NET中具有重复列名的连接表中读取SELECT *的结果

时间:2009-06-17 18:51:46

标签: c# join

我是一名PHP / MYSQL开发人员,慢慢进入C#/ MSSQL领域,在阅读连接两个表的MSSQL查询时,我遇到了C#问题。

鉴于两个表:

表A:

int:id
VARCHAR(50):name
int:b_id

表B:

int:id
VARCHAR(50):name

并提供查询

SELECT * FROM TableA,TableB WHERE TableA.b_id = TableB.id;

现在在C#中,我通常以下列方式读取查询数据:

SqlDataReader data_reader= sql_command.ExecuteReader();
data_reader["Field"];

除非在这种情况下,我需要区别于TableA的名称列和TableB的名称列。

在PHP中,我只会相应地询问字段“TableA.name”或“TableB.name”,但是当我尝试类似

data_reader["TableB.name"];
在C#中,我的代码错误了。现在我知道这可以通过谷歌搜索或在这个网站上搜索来解决,但我最难找到适当的搜索词找到答案。

那么有人可以指点我的写作方向,或者给我一个关于如何在C#中读取多个表的查询的建议?

6 个答案:

答案 0 :(得分:5)

结果集只能看到返回的数据/列名,而不是基础表。将您的查询更改为

SELECT TableA.Name as Name_TA, TableB.Name as Name_TB from ...

然后你可以参考这样的字段:

data_reader["Name_TA"];

答案 1 :(得分:2)

对于那些发布使用“SELECT *”是错误的人,我强烈反对你。有许多现实世界的情况需要SELECT *。你对其“错误”使用的绝对陈述可能会使某人误解为合法的解决方案。

这里的问题不在于使用SELECT *,而是在ADO中有约束

正如OP指出的那样,在PHP中,您可以通过“TABLE.COLUMN”语法索引数据行,这也是原始SQL处理列名冲突的方式:

  

SELECT table1.ID,table2.ID FROM table1,table;

为什么DataReader没有以这种方式实现我不知道......

也就是说,要使用的解决方案可以通过以下方式动态构建SQL语句: - 查询您正在选择的表的架构 - 通过遍历模式中的列名来构建SELECT子句

通过这种方式,您可以构建如下所示的查询,而无需知道您从中选择的表的架构中当前存在哪些列

  

将TableA.Name选为Name_TA,将TableB.Name选为Name_TB from ...

答案 2 :(得分:1)

欢迎来到现实世界。在现实世界中,我们不使用“SELECT *”。如果需要,指定所需的列,来自哪些表以及使用哪些别名。

答案 3 :(得分:0)

您可以尝试按索引(数字)而不是按键读取值。

name = data_reader[4];

您必须尝试查看数字的对应方式。

答案 4 :(得分:0)

虽然最好使用列列表来删除重复的列,但如果出于任何原因你想要*****,那么就使用

rdr.item("duplicate_column_name")

这将返回第一列值,因为内部联接将在两个相同的列中具有相同的值,因此这将完成任务。

答案 5 :(得分:-1)

我也得到了我的一位朋友的回答,我在这里发帖,因为这是我将采取的方法,但上述答案最能回答我的问题。

“理想情况下,您不应该在数据库架构中拥有重复的列名。因此,如果您可以将架构重命名为没有冲突的名称。该规则适用于这种情况,一旦您完成了连接,它就是只是一个新的记录集,通常表名都与它一起使用。“