我是一名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#中读取多个表的查询的建议?
答案 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)
我也得到了我的一位朋友的回答,我在这里发帖,因为这是我将采取的方法,但上述答案最能回答我的问题。
“理想情况下,您不应该在数据库架构中拥有重复的列名。因此,如果您可以将架构重命名为没有冲突的名称。该规则适用于这种情况,一旦您完成了连接,它就是只是一个新的记录集,通常表名都与它一起使用。“