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

C# 关于DataRow的一个问题!!!急

如果字符串数组中的列名在字符串数组中具有匹配的值,则获取DataRow

获取具有名称的 DataTable 列的索引

如何获取DataTable某一列的某个值在那一行

如何在 C# 中将 List<DataRow> 转换为 List<T>?