2009-06-02 2 views
1
string query = 
    "SELECT * FROM table1, table2 WHERE table1.Id = table2.fId"; 
... 
using(IDataReader dataReader = 
    db.ExecuteReader(CommandType.Text, query)) 
.. 
string value = dataReader["table2.field"]; //dies 

В настоящее время я пишу некоторый код .NET, который включает в себя выполнение запроса объединения, а затем доступ к возвращенным данным с помощью DataReader. Мне интересно, можно ли получить доступ к полям из возвращаемых строк с помощью какой-либо префиксной нотации (см. Пример выше) вместо того, чтобы использовать порядковое положение для доступа к значению в строке (в случае, когда обе таблицы содержат перекрывающееся поле имена)?.NET DataReader и SQL-соединения

ответ

7

Учитывая, что вы знаете имена полей раньше времени, почему бы не выразить их в заявлении select?

string query = "SELECT table2.field as field2, ... FROM table1, table2 " + 
       "WHERE table1.Id = table2.fId"; 

Тогда вы можете просто обратиться к dataReader["field2"].

+0

Потому что * лучше, чем «table2.field как field2, ...» ^^ – 2009-06-02 16:52:02

+4

«Никер» в том смысле, что он вытащит данные, которые вам не нужны, «лучше» в том смысле, что вы выиграли «Не знаете, что нужный столбец не существует, пока вы не попытаетесь ссылаться на него, или« лучше »на то, что инженер-технолог не будет знать, какие данные сбрасываются без проверки схемы? :) Я предпочитаю явные запросы для кода без выброса. –

+0

Выберите * - очень плохая техника, которую вы когда-либо использовали. – HLGEM

0

Результатом выбора является отдельная таблица независимо от источника столбцов. Вы можете видеть, что когда в таблицах есть столбец, он обычно жалуется. :) Если перечисленные выше таблицы имеют уникальные столбцы, вы просто должны иметь ["поле"].

3

Вы никогда не должны отправлять запрос select * на рабочий сервер, поскольку он тратит ресурсы. Когда у вас есть соединение, по крайней мере одно поле повторяется, и совершенно не нужно отправлять отправку обоих. И если вам действительно не нужен каждый столбец, вы не должны возвращать все из них. Кроме того, вы собираетесь сломать код, используя select *, поскольку изменения структуры базы данных. Это действительно плохая идея.

Вы также должны научиться использовать синтаксис соединения ANSII 92. Синтаксис, который вы используете, устарел только на 18 лет и может вызвать множество исходов, поскольку он слишком часто приводит к перекрестному соединению, когда люди забывают одно из условий соединения в предложении where (используя синтаксис объединения ANSII 92, который не пройдет проверка синтаксиса). Он также не всегда дает правильные ответы при использовании синтаксиса левого синтаксиса старого стиля (* =) в SQL Server, поскольку он иногда, но не последовательно будет интерпретировать это как перекрестное соединение (и этот стиль, оставшийся в объединении, устарел и не будет разрешен в следующей версии). Я не знаю, какую базу данных вы используете, но если у вас есть сервер SQL Server, вы должны быть в курсе этого.

0

Есть законные случаи, возможно, вы передали чтение данных или хранимую процедуру, и вы не обязательно в управлении источником - например, в инструментах или утилиты библиотеки.

Хотя в целом я бы рекомендовал не использовать *, и использование псевдонимов вместо

Вы можете получить то, что вы хотите с помощью DataReader.GetSchemaTable и глядя на BaseTableName.

Вам также необходимо вызвать ExecuteReader с помощью ExecuteReader (System.Data.CommandBehavior.KeyInfo).