虽然第一个答案是更改您的 SQL 查询以为每个字段指定一个不同的名称,但仍然可以检索与您的字段关联的表名。
在此示例中,我没有使用DataAdapter 填充DataTable,而是使用SqlDataReader。
请注意,如果您因任何原因无法检索数据库架构,这可能会失败
在SqlCommand 上调用ExecuteReader 时,有一个允许您指定CommandBehavior 的重载。在我们的例子中,我们想要的行为是CommandBehavior.KeyInfo。
var reader = command.ExecuteReader(CommandBehavior.KeyInfo);
现在,在阅读器上,您可以调用GetSchemaTable 方法。它返回一个包含查询结构的DataTable。
var schema = reader.GetSchemaTable();
你可以read about that table on MSDN。
我们现在的目标是将字段和表格与其在列列表中的序号位置相匹配。架构表中的三个字段与您的兴趣相关:
然后您可以创建一个扩展方法来执行该读取:
public static T Field<T>(this SqlDataReader reader, DataTable schema, string table, string field)
{
// Search for the ordinal that match the table and field name
var row = schema.AsEnumerable().FirstOrDefault(r => r.Field<string>("BaseTableName") == table && r.Field<string>("ColumnName") == field);
var ordinal = row.Field<int>("ColumnOrdinal");
return (T)reader.GetValue(ordinal);
}
然后您可以调用该扩展方法
using (SqlConnection connection = new SqlConnection("your connection string"))
{
connection.Open();
using (SqlCommand command = new SqlCommand("SELECT * FROM Users INNER JOIN BloodBankUser ON Users.UserID = BloodBankUser.UserID;", connection))
using (var reader = command.ExecuteReader(CommandBehavior.KeyInfo))
{
var schema = reader.GetSchemaTable();
while (reader.Read())
{
Console.WriteLine(reader.Field<string>(schema, "Users", "Address"));
}
}
}