DataRow在c#中获取join table重复列的值
DataRow get values of duplicate column of join table in c#
我有以下查询
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
一条一条的获取记录。但我的问题是有两个相同的列,即 table 中的 CreatedOn
。在这里,我想要 select CreatedOn
来自 Join
table 的列值和来自第一个 table 的其他列值。我怎样才能select这个值?
更改您的查询并为联接中的列使用别名 table。喜欢:
select table1.*, table2.CreatedOn as CreatedOn2 from `{0}` as table1 inner join `{1}` as table2 on table1.Id = table2.RecordId where table2.recordid= {2}
和selectCreatedOn2
字段,
CreatedOn = row["CreatedOn2"] != DBNull.Value ? Convert.ToDateTime(row["CreatedOn2"].ToString()) : DateTime.MinValue
谢谢。
首先,您以这种方式创建 sql 命令文本的方法很容易出现问题,最糟糕的是 Sql 注入攻击,但是说到并查看您的实际代码最简单引用第二列的方式遵循这些情况下的 ADO.NET 约定。
如果您的 SELECT 查询创建的 table 中有两个或多个同名的列,则会更改冲突列的名称,并在名称后附加一个递增的数字。因此,您的第二个 CreatedOn 列变为 CreateOn1。构建AuditLog实例时可以参考本专栏
records.Add(new AuditLog
{
CreatedOn = row["CreatedOn1"] != DBNull.Value ? Convert.ToDateTime(row["CreatedOn1"].ToString()) : DateTime.MinValue,
});
不过,我认为您需要一种不同的方法。一个可以让你更好地控制你想return从你的查询中得到什么。当您只需要一列时,从基础 tables 返回所有行是一种非常糟糕的做法。可能需要的列列表可以添加到您的格式字符串中。 (这也允许将您选择的别名附加到第二列 CreateOn)
我有以下查询
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
一条一条的获取记录。但我的问题是有两个相同的列,即 table 中的 CreatedOn
。在这里,我想要 select CreatedOn
来自 Join
table 的列值和来自第一个 table 的其他列值。我怎样才能select这个值?
更改您的查询并为联接中的列使用别名 table。喜欢:
select table1.*, table2.CreatedOn as CreatedOn2 from `{0}` as table1 inner join `{1}` as table2 on table1.Id = table2.RecordId where table2.recordid= {2}
和selectCreatedOn2
字段,
CreatedOn = row["CreatedOn2"] != DBNull.Value ? Convert.ToDateTime(row["CreatedOn2"].ToString()) : DateTime.MinValue
谢谢。
首先,您以这种方式创建 sql 命令文本的方法很容易出现问题,最糟糕的是 Sql 注入攻击,但是说到并查看您的实际代码最简单引用第二列的方式遵循这些情况下的 ADO.NET 约定。
如果您的 SELECT 查询创建的 table 中有两个或多个同名的列,则会更改冲突列的名称,并在名称后附加一个递增的数字。因此,您的第二个 CreatedOn 列变为 CreateOn1。构建AuditLog实例时可以参考本专栏
records.Add(new AuditLog
{
CreatedOn = row["CreatedOn1"] != DBNull.Value ? Convert.ToDateTime(row["CreatedOn1"].ToString()) : DateTime.MinValue,
});
不过,我认为您需要一种不同的方法。一个可以让你更好地控制你想return从你的查询中得到什么。当您只需要一列时,从基础 tables 返回所有行是一种非常糟糕的做法。可能需要的列列表可以添加到您的格式字符串中。 (这也允许将您选择的别名附加到第二列 CreateOn)