DataRow在c#中获取连接表的重复列的值

时间:2015-02-16 12:31:38

标签: c# mysql datatable

我有以下查询

string query = string.Format("select * from `{0}` inner join `{1}` on `{0}`.Id = `{1}`.RecordId where recordid= {2}", tableName, GetAuditTableName(tableName), context.RecordId);

我按照以下方式执行此查询:

MySqlCommand cmd = new MySqlCommand(query, conn);
conn.Open();
DataTable dtRecords = new DataTable();
using (MySqlDataReader reader = cmd.ExecuteReader())
{
   dtRecords.Load(reader);
}
conn.Close();
List<AuditLog> records = new List<AuditLog>();
foreach (DataRow row in dtRecords.Rows)
{
records.Add(new AuditLog
{
    CreatedOn = row["CreatedOn"] != DBNull.Value ? Convert.ToDateTime(row["CreatedOn"].ToString()) : DateTime.MinValue,
});
}

所以我在这里使用DataRow逐个获取记录。但我的问题是两个表中都有两个相同的列,即CreatedOn。在这里,我想从CreatedOn表中选择Join列值,并从第一个表中选择其他列值。如何选择此值?

2 个答案:

答案 0 :(得分:1)

更改查询并使用连接表中列的别名。像:

select table1.*, table2.CreatedOn as CreatedOn2 from `{0}` as table1 inner join `{1}` as table2 on table1.Id = table2.RecordId where table2.recordid= {2}

然后选择CreatedOn2字段

CreatedOn = row["CreatedOn2"] != DBNull.Value ? Convert.ToDateTime(row["CreatedOn2"].ToString()) : DateTime.MinValue

谢谢。

答案 1 :(得分:0)

首先,以这种方式创建sql命令文本的方法容易出现问题,最糟糕的是Sql Injection攻击,但是说并查看实际代码,引用第二列的最简单方法是遵循ADO这些案例的.NET约定。

如果SELECT查询创建的表中有两个或多个具有相同名称的列,则会更改冲突列的名称,并将渐进编号附加到名称。因此,您的第二个CreatedOn列变为CreateOn1。在构建AuditLog实例时,可以参考此列。

records.Add(new AuditLog
{
    CreatedOn = row["CreatedOn1"] != DBNull.Value ? Convert.ToDateTime(row["CreatedOn1"].ToString()) : DateTime.MinValue,
});

不过,我认为你需要一种不同的方法。允许您从查询中更好地控制要返回的内容的一个。当您只需要一列时,从基础表返回所有行是一种非常糟糕的做法。可能会将所需列的列表添加到您的格式字符串中。 (这也允许将您选择的ALIAS附加到第二列CreateOn)

相关问题