Хотя первым ответом было бы изменить ваш SQL-запрос, указав отдельное имя для каждого из ваших полей, все еще возможно получить имя таблицы, связанной с вашим полем.
В этом примере яя не заполняю DataTable
с помощью DataAdapter
, а скорее использую SqlDataReader
.
Имейте в виду, что это может не сработать, если по какой-либо причине вы не можете получить схему базы данных
При вызове ExecuteReader
на SqlCommand
возникает перегрузка, позволяющая указать CommandBehavior
.В нашем случае, поведение, которое мы хотим, это CommandBehavior.KeyInfo
.
var reader = command.ExecuteReader(CommandBehavior.KeyInfo);
Теперь, на ридере, вы можете вызвать метод GetSchemaTable
.Он возвращает DataTable
, который содержит структуру вашего запроса.
var schema = reader.GetSchemaTable();
Вы можете прочитать об этой таблице в MSDN .
Теперь наша цель - соответствоватьполе и таблица против его порядкового положения в списке столбцов.Три поля из таблицы схемы соответствуют вашим интересам:
- ColumnName
- BaseTableName
- ColumnOrdinal
Затем можно создатьметод расширения, чтобы сделать это чтение:
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"));
}
}
}