Как прочитать результат SELECT * из объединенных таблиц с повторяющимися именами столбцов в .NET - PullRequest
3 голосов
/ 17 июня 2009

Я разработчик PHP / MYSQL, медленно углубляющийся в сферу C # / MSSQL, и у меня возникает проблема в C #, когда речь заходит о чтении запроса MSSQL, объединяющего две таблицы.

Учитывая две таблицы:

TableA:

int:id
VARCHAR(50):name
int:b_id

TableB:

int:id
VARCHAR(50):name

А с учетом запроса

SELECT * FROM TableA,TableB WHERE TableA.b_id = TableB.id;

Теперь в C # я обычно читаю данные запроса следующим образом:

SqlDataReader data_reader= sql_command.ExecuteReader();
data_reader["Field"];

За исключением этого случая, мне нужно отличать столбец имени TableA и столбец имени TableB.

В PHP я бы просто попросил поле «TableA.name» или «TableB.name» соответственно, но когда я попробую что-то вроде

data_reader["TableB.name"];

в C #, мой код ошибки. Теперь я знаю, что это, вероятно, можно решить с помощью поиска Google или поиска на этом сайте, но мне сложно найти подходящий поисковый запрос, чтобы найти ответ.

Так может кто-нибудь указать мне направление записи или подсказать, как прочитать запрос к нескольким таблицам в C #?

Ответы [ 5 ]

5 голосов
/ 17 июня 2009

Результирующий набор видит только возвращенные имена данных / столбцов, но не базовую таблицу. Измените ваш запрос на что-то вроде

SELECT TableA.Name as Name_TA, TableB.Name as Name_TB from ...

Тогда вы можете обратиться к таким полям:

data_reader["Name_TA"];
2 голосов
/ 14 октября 2011

Тем, кто пишет, что использовать «SELECT *» неправильно, я категорически не согласен с вами. Есть много реальных случаев, когда требуется SELECT *. Ваши абсолютные заявления о его «неправильном» использовании могут сбить с толку кого-то из законного решения.

Проблема здесь не в использовании SELECT *, а в ограничении в ADO

Как указывает OP, в PHP вы можете индексировать строку данных с помощью синтаксиса "TABLE.COLUMN", который также является способом, которым необработанный SQL обрабатывает конфликты имен столбцов:

ВЫБРАТЬ table1.ID, table2.ID FROM table1, table;

Почему DataReader не реализован таким образом, я не знаю ...

Тем не менее, решение, которое будет использоваться, может динамически построить ваш оператор SQL: - запросить схему таблиц, из которых вы выбираете - создать предложение SELECT, просматривая имена столбцов в схеме

Таким образом, вы можете построить запрос, подобный следующему, без необходимости знать, какие столбцы в настоящий момент существуют в схеме для таблиц, которые вы выбираете из

ВЫБЕРИТЕ TableA.Name как Name_TA, TableB.Name как Name_TB из ...

1 голос
/ 17 июня 2009

Добро пожаловать в реальный мир. В реальном мире мы не используем «SELECT *». Укажите, какие столбцы вы хотите, из каких таблиц и с каким псевдонимом, если требуется.

0 голосов
/ 17 июня 2009

Я также получил ответ от одного из моих друзей, и я публикую его здесь, потому что это тот подход, который я выберу, однако приведенный выше ответ лучше всего отвечает на мой вопрос.

"В идеале, у вас никогда не должно быть повторяющихся имен столбцов в схеме базы данных. Поэтому, если вы можете переименовать схему, чтобы не иметь конфликтующих имен. Это правило для этой самой ситуации, после того как вы выполнили соединение, просто новый набор записей, и обычно имена таблиц идут вместе с ним. "

0 голосов
/ 17 июня 2009

Вы можете попробовать прочитать значения по индексу (числу), а не по ключу.

name = data_reader[4];

Вам придется поэкспериментировать, чтобы увидеть, как соотносятся числа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...