.NET DataReader и SQL объединяются - PullRequest
1 голос
/ 02 июня 2009
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. Мне интересно, возможно ли получить доступ к полям из возвращенных строк, используя некую префиксную нотацию (см. Пример выше) вместо необходимости использовать порядковый номер для доступа к значению в строке (в случае, когда обе таблицы содержат перекрывающиеся поля имена)?

Ответы [ 5 ]

7 голосов
/ 02 июня 2009

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

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

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

3 голосов
/ 02 июня 2009

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

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

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

Использование * вместо списка полей является антишаблоном number 1 sql, определенным избирателями переполнения стека.

Каковы наиболее распространенные анти-паттерны SQL?

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

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

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

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

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

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

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

...