DataRow在c#中获取连接表的重复列的值
Posted
技术标签:
【中文标题】DataRow在c#中获取连接表的重复列的值【英文标题】:DataRow get values of duplicate column of join table in c# 【发布时间】:2015-04-16 23:15:50 【问题描述】:我有以下查询
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
。在这里,我想从Join
表中选择CreatedOn
列值,并从第一个表中选择其他列值。如何选择此值?
【问题讨论】:
为第二个表中的 CreatedOn 列设置另一个别名。或按列索引访问 dataRow 值(例如 row[0]) 有什么方法可以选择像row["table2.CreatedOn"]
这样的值
【参考方案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
谢谢。
【讨论】:
感谢您的回复。我不想添加table2.CreatedOn as CreatedOn2
。因为我有很多专栏可供选择。所以我不想选择其中的每一个。这就是为什么我使用*
有什么方法可以让我选择诸如 row["table2.CreatedOn"] 之类的值
虽然您想从两个表中选择所有列,但您可以像这样选择它们,table1.*, table2.*, table2.CreatedOn as CreatedOn2
。【参考方案2】:
首先,您以这种方式创建 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,
);
不过,我认为您需要一种不同的方法。一种可以让您更好地控制要从查询中返回的内容的方法。当您只需要一列时,从基础表中返回所有行是一种非常糟糕的做法。可能需要的列列表可以添加到您的格式字符串中。 (这也允许将您选择的别名附加到第二列 CreateOn)
【讨论】:
以上是关于DataRow在c#中获取连接表的重复列的值的主要内容,如果未能解决你的问题,请参考以下文章
dataset datatable datacolums datarow