使用两个(或更多)连接表填充DataTable

时间:2014-03-06 22:48:37

标签: c# mysql dataadapter

我有两个表要加入并用于填充数据表,我遇到列名冲突的问题:

-----------    -----------
| Parent  |    | Child   |
-----------    -----------
| ParentID|    | ChildID |
| Name    |    | ParentID|
| Value   |    | Name    |
-----------    | Value   | 
               -----------

SQL语句(MySQL数据库,如果相关的话)

select p.*, c.* from parent p left join child c on c.ParentID = c.ChildID

我的适配器代码(C#):

var adapter = new MySqlDataAdapter(sql, DBConn);
adapter.Fill(table);

当我去阅读行时,我希望这样:

var parentName = row["p.Name"];
var childName = row["c.Name"];

相反,它产生了这个:

var parentName = row["Name"];
var childName = row["Name1"];

如何让列名使用别名?我觉得我错过了一些明显的东西,因为这似乎应该一直出现。

3 个答案:

答案 0 :(得分:4)

由于name是两个表的常用列名,因此您必须在查询中为其中任何一个提供别名。如果你没有提供一个,它会自动为重复的字段提供一个,在这种情况下附加一个“1”。

此外,c.p.只是查询的内部别名,但它们不是返回列名称的一部分。

在您的SQL查询中添加别名(至少其中一个)

SELECT p.name as parent_name, c.name as child_name, ….

在您的C#代码中使用正确的列

var parentName = row["parent_name"];
var childName = row["child_name"];

答案 1 :(得分:1)

无论何时处理w / sql字符串,写出所有字段名称而不是使用*总是一个很好的约定

在这种情况下,您的问题是您的查询中有name两次,因此它会自动填充1以消除歧义。

请改为尝试:

select
    p.ParentId,
    p.Name as parent_name,
    p.Value as parent_value
    c.ChildId,
    c.Name as child_name,
    c.Value as child_value
from parent p left join child c on p.ParentID = c.ChildID

您的c#代码也需要反映这一点。

var parentName = row["parent_name"];
var childName = row["child_name"];

答案 2 :(得分:0)

如果你想在输出中使用唯一的列名,查询中的别名是为mysql知道你的意思

Select p.Name as ParentName, c.Name as ChildName .... etc

我当然不会依赖于Name1驱动程序,将您的查询更改为select c.*, p.*,事情会变得精神错乱。