- Добавление новых источников данных Add new data sources
- Источник данных для базы данных или файла базы данных Data source for a database or a database file
- Dataset Dataset
- Классы сущностей Entity classes
- Источник данных для службы Data source for a service
- Источник данных для объекта Data source for an object
- Источник данных для списка SharePoint Data source for a SharePoint list
- Элемент управления данными SqlDataSource
- Жизненный цикл страницы с привязкой данных
- SqlDataSource
- Извлечение записей
- Параметризованные команды
- Хранимые процедуры
- Дополнительные сведения о типах параметров
- Обработка ошибок
- Обновление записей
- Строгая проверка параллелизма
- Удаление записей
- Вставка записей
- Недостатки SqlDataSource
Добавление новых источников данных Add new data sources
Класс в модели Entity Framework, связанный с некоторым типом базы данных. A class in an Entity Framework model that is associated with some kind of database.
Набор данных, связанный с некоторым типом базы данных. A dataset that is associated with some kind of database.
Класс, представляющий сетевую службу, такую как служба данных Windows Communication Foundation (WCF) или служба RESTFUL. A class that represents a network service such as a Windows Communication Foundation (WCF) data service or a REST service.
Класс, представляющий службу SharePoint. A class that represents a SharePoint service.
Класс или коллекция в решении. A class or collection in your solution.
Если вы не используете функции привязки данных, наборы данных, Entity Framework, LINQ to SQL, WCF или SharePoint, понятие «Data Source» не применяется. If you’re not using data-binding features, datasets, Entity Framework, LINQ to SQL, WCF, or SharePoint, the concept of a «data source» does not apply. Просто подключитесь непосредственно к базе данных с помощью объектов SQLCommand и напрямую взаимодействует с базой данных. Just connect directly to the database by using the SQLCommand objects and communicate directly with the database.
Создание и изменение источников данных осуществляется с помощью мастера настройки источника данных в Windows Forms или Windows Presentation Foundation приложении. You create and edit data sources by using the Data Source Configuration Wizard in a Windows Forms or Windows Presentation Foundation application. Для Entity Framework сначала создайте классы сущностей, а затем запустите мастер, выбрав проект > Добавить новый источник данных (подробно см. Далее в этой статье). For Entity Framework, first create your entity classes, and then start the wizard by selecting Project > Add New Data Source (described in more detail later in this article).
Чтобы открыть окно » Источники данных «, убедитесь, что проект открыт, а затем нажмите клавиши SHIFT + ALT + D или кнопку Просмотр > других > источников данных Windows. To open the Data Sources window, make sure your project is open, and then press Shift+Alt+D or choose View > Other Windows > Data Sources.
Источник данных можно перетащить из окна Источники данных в область конструктора или на элемент управления формы. You can drag a data source from the Data Sources window onto a form design surface or control. Это приводит к формированию стандартного кода, отображающего данные из хранилища данных. This causes boilerplate code to be generated that displays the data from the data store.
На следующем рисунке показан набор данных, который был удален в форму Windows Forms. The following illustration shows a dataset that has been dropped onto a Windows form. Если нажать клавишу F5 в приложении, данные из базовой базы данных отобразятся в элементах управления формы. If you select F5 on the application, the data from the underlying database appears in the form’s controls.
Источник данных для базы данных или файла базы данных Data source for a database or a database file
Можно создать набор данных или модель Entity Framework для использования в качестве источника данных для базы данных или файла базы данных. You can create a dataset or an Entity Framework model to use as a data source for a database or database file.
Dataset Dataset
Классы сущностей Entity classes
Чтобы создать модель Entity Framework в качестве источника данных, выполните следующие действия. To create an Entity Framework model as a data source:
Выберите метод, по которому требуется создать модель. Choose the method you want to generate the model by.
Источник данных для службы Data source for a service
При создании источника данных из службы Visual Studio добавляет в проект ссылку на службу. When you create a data source from a service, Visual Studio adds a service reference to your project. Visual Studio также создает прокси-объекты, которые соответствуют объектам, возвращаемым службой. Visual Studio also creates proxy objects that correspond to the objects that the service returns. Например, служба, возвращающая набор данных, представлена в проекте как набор данных. Служба, которая возвращает конкретный тип, представлена в проекте как возвращаемый тип. For example, a service that returns a dataset is represented in your project as a dataset; a service that returns a specific type is represented in your project as the type returned.
Источник данных можно создать из следующих типов служб: You can create a data source from the following types of services:
Веб-службы Web services
Источник данных для объекта Data source for an object
На странице Выбор объектов данных разверните узлы в представлении в виде дерева, чтобы выбрать объекты, к которым необходимо выполнить привязку. On the Select the Data Objects page, expand the nodes in the tree view to locate the objects that you want to bind to. Представление в виде дерева содержит узлы проекта, а также сборки и другие проекты, на которые ссылается проект. The tree view contains nodes for your project and for assemblies and other projects that are referenced by your project.
Возможно, потребуется построить проект, содержащий объекты, прежде чем они появятся в представлении в виде дерева. You may need to build the project that contains your objects before the objects appear in the tree view.
Для поддержки привязки данных при перетаскивании объекты, реализующие ITypedList интерфейс или, IListSource должны иметь конструктор по умолчанию. To support drag-and-drop data binding, objects that implement the ITypedList or IListSource interface must have a default constructor. В противном случае Visual Studio не сможет создать экземпляр объекта источника данных и выведет сообщение об ошибке при перетаскивании элемента в область конструктора. Otherwise, Visual Studio cannot instantiate the data-source object, and it displays an error when you drag the item to the design surface.
Источник данных для списка SharePoint Data source for a SharePoint list
Источник
Элемент управления данными SqlDataSource
В предыдущих статьях было показано, как непосредственно подключиться к базе данных, выполнить запрос, пройти в цикле по записям результирующего набора и отобразить их на странице. Также вы уже видели, что существует более простой выбор: привязка позволяет написать логику доступа к данным, а затем отобразить результаты на странице без необходимости построения цикла или манипулирования элементами управления. Теперь самое время представить еще одно удобство — элементы управления источниками данных. Благодаря им, можно вообще избежать необходимости написания кода доступа к данным.
Как вы вскоре убедитесь, часто существует пропасть между тем, что вы можете делать, и тем, что должны делать. В более профессиональных, масштабных приложениях вам по-прежнему придется писать и тонко настраивать код доступа к данным для достижения оптимальной производительности, агрегирования данных, обработки ошибок, протоколирования и т.д. Но даже если вы делаете все это, то все равно можете использовать элементы управления источниками данных. Просто не рассчитывайте, что удастся избежать написания кода!
Все элементы управления источниками данных можно найти на вкладке Data (Данные) панели инструментов в Visual Studio. Когда вы перетаскиваете элемент управления источником данных на свою веб-страницу, в Visual Studio он отображается в виде прямоугольника серого цвета. Однако после запуска веб-приложения и обращения к странице этот прямоугольник в браузере не отображается.
Жизненный цикл страницы с привязкой данных
Элементы управления источниками данных могут решать две основных задачи:
извлекать данные из источника и применять к связанным элементам управления;
обновлять источник данных, когда в связанных элементах управления выполняется редактирование.
Для того чтобы понять, как работают элементы управления данными, следует знать, как они вписываются в жизненный цикл страницы. Это понимание важно, когда вы попадаете в ситуации, требующие работы с моделью привязки данных или ее расширения.
Например, может понадобиться добавить данные или набор выбранных элементов в элемент управления после того, как он был привязан к источнику данных. В зависимости от сценария, может существовать возможность реагирования на события элементов управления источниками данных, но события не всегда генерируются в точке, где должна быть применена логика.
Задачи привязки данных возникают в перечисленном ниже порядке:
Создается объект страницы.
Начинается жизненный цикл страницы, инициируются события Page.Init и Page.Load.
Происходят все остальные события элементов управления.
Элементы управления источниками данных выполняют любые обновления. Если обновляется строка, генерируются события Updating и Updated. Если строка вставляется — то события Inserting и Inserted. Если строка удаляется — Deleting и Deleted.
Генерируется событие Page.PreRender.
Элементы управления источниками данных выполняют необходимые запросы и вставляют полученные данные в связанные элементы управления. Здесь генерируются события Selecting и Selected.
Страница отображается и освобождается.
SqlDataSource
Элементы управления источниками данных появляются в разметочной части веб-страницы подобно обычным элементам управления, например:
SqlDataSource представляет подключение к базе данных, использующее поставщика ADO.NET. Однако здесь есть ловушка. SqlDataSource требует обобщенного способа создания объектов Connection, Command и DataReader, которые ему потребуются. Единственный способ сделать это — через фабрику поставщика данных, как описано в статье «Код, не зависимый от поставщика». Фабрика отвечает за создание специфичных для поставщика данных объектов, в которых нуждается SqlDataSource для доступа к источнику данных.
Они зарегистрированы в файле machine.config, в результате чего их можно использовать с SqlDataSource. Источник данных выбирается установкой имени поставщика. Следующий шаг предполагает применение требуемой строки соединения — без нее установка соединения невозможна. Хотя можно жестко закодировать строку соединения в дескрипторе SqlDataSource, всегда лучше помещать ее в раздел файла web.config, чтобы обеспечить большую гибкость и гарантировать, что вы не измените строку подключения по неосторожности, что снизит эффективность пула соединений. Например, если вы создадите следующую строку соединения:
После того, как установлены имя поставщика и строка подключения, следующий шаг состоит в добавлении логики запроса, которую SqlDataSource использует, когда подключится к базе данных.
Извлечение записей
Каждый созданный элемент управления SqlDataSource можно использовать для выполнения одного запроса. Дополнительно можно также добавить соответствующие команды для удаления, вставки и обновления строк. Например, одного SqlDataSource достаточно для запроса и обновления таблицы Customers в базе данных Northwind. Однако если нужно независимо извлекать или обновлять информацию таблиц Customers и Orders, то понадобятся два элемента управления SqlDataSource.
Логика команд SqlDataSource применяется через четыре свойства: SelectCommand, InsertCommand, UpdateCommand и DeleteCommand; все они принимают строку. Строка может быть SQL-кодом (в этом случае соответствующее свойство SelectCommandType, InsertCommandType, UpdateCommandType или DeleteCommandType должно быть установлено в Text — значение по умолчанию) либо именем хранимой процедуры (в этом случае типом команды является StoredProcedure). Необходимо определить команды только для типов действий, который вы хотите выполнять. Другими словами, если вы применяете источник данных только для чтения набора записей, то придется определить только одно свойство SelectCommand.
Если вы конфигурируете команду в окне свойств Visual Studio, то увидите свойство по имени SelectQuery вместо SelectCommand. На самом деле SelectQuery — это виртуальное свойство, отображаемое для удобства во время проектирования. При редактировании SelectQuery (щелкнув на троеточии рядом с именем свойства) можно пользоваться специальным графическим конструктором для написания текста команды (SelectCommand) и добавления параметров команды (SelectParameters).
Ниже показан полный код SqlDataSource, который определяет команду SELECT для извлечения записей из таблицы Employees:
Логику источника данных можно написать вручную или же воспользоваться визуальным конструктором, который позволит создать соединение, а затем логику команды в графическом построителе запросов. Чтобы вызвать этот инструмент, выберите элемент управления источником данных, а затем пункт Configure Data Source (Конфигурировать источник данных) в смарт-теге.
Создав источник данных, вы можете «пожинать плоды», а именно — получить возможность привязывать элементы управления во время проектирования вместо того, чтобы писать логику в обработчике события Page.Load. Вот как это работает:
Выберите элемент управления источником данных и щелкните на пункте Refresh Schema (Обновить схему) в смарт-теге. Этот шаг инициирует его подключение к базе данных и извлечение информации о столбцах для запроса.
Добавьте на форму ListBox. Установите свойство ListBox.DataSourceID в элемент управления источником данных. Его можно выбрать в раскрывающемся списке со всеми источниками данных формы.
Установите ListBox.DataTextField в столбец, который должен отображаться (например, EmployeeID).
Те же шаги можно использовать для привязки многофункционального элемента управления данными. Добавьте GridView на страницу и установите необходимую информацию о столбцах, поскольку GridView может отображать множество столбцов. Вы немедленно увидите заголовки столбцов запроса на поверхности проектирования страницы.
Запустите страницу. Не беспокойтесь о выполнении команд и вызове DataBind() на странице. ASP.NET решает обе эти задачи автоматически. Вы увидите привязанную к данным страницу, подобную показанной на рисунке ниже.
Вот код страницы, который у меня получился и результат:
Ясно, что огромное преимущество этих элементов управления источниками данных в том, что они позволяют конфигурировать привязку данных во время проектирования, не требуя написания рутинного кода. Более того, результат запроса появляется (в ограниченной степени) в визуальном конструкторе Visual Studio, так что можно получить представление о том, как будет выглядеть форма.
Как упоминалось ранее, можно привязываться к элементу DataReader или к DataView. Поэтому стоит спросить, какой подход использует элемент управления SqlDataSource? На самом деле выбор за вами, в зависимости от установленного значения свойства DataSourceMode — SqlDataSourceMode.DataSet (по умолчанию) или SqlDataSourceMode.DataReader.
Режим DataSet почти всегда лучше, потому что он поддерживает расширенную сортировку, фильтрацию и настройки кэширования, зависящие от DataSet. Все эти средства недоступны в режиме DataReader. Однако DataReader можно применять с исключительно большими экранными таблицами, потому что в этом режиме более эффективно используется память. Дело в том, что DataReader хранит в памяти в каждый момент времени только одну запись — ровно столько, сколько необходимо, чтобы скопировать информацию из записи в привязанный элемент управления. Оба режима поддерживают привязку к множеству элементов управления. Чтобы понять, почему такое возможно, необходимо внимательно изучить, как выполняется извлечение данных.
Если вы профилируете свою базу данных, то обнаружите, что привязка двух элементов управления к одному и тому же источнику данных заставляет запрос выполняться дважды. С другой стороны, если вы привяжете страницу вручную, то сможете привязать один и тот же объект к двум разным элементам управления, что означает необходимость лишь в однократном выполнении запроса. Ясно, что SqlDataSource требует некоторых накладных расходов, но если вы знаете о них, то сможете и проектировать соответствующим образом.
Во-первых, вы должны рассмотреть вопрос кэширования, которое SqlDataSource поддерживает автоматически через свойства EnableCaching, CacheExpirationPolicy и CacheDuration. Во-вторых, учтите, что большую часть времени вы не будете привязывать более одного элемента управления к источнику данных. Причина в том, что многофункциональные элементы управления данными — GridView, DetailsView и FormsView — имеют возможность гибко представлять множество частей данных. Если вы используете эти элементы управления, то придется привязать только один из них, легко соблюдая это ограничение.
Кроме того, важно отметить, что такая привязка данных выполняется в конце обработки веб-страницы, непосредственно перед ее отображением. Это значит, что будет сгенерировано событие Page.Load, за которым последуют любые события элементов управления, за ними — событие Page.PreRender и только затем произойдет собственно привязка данных. Если необходимо написать код, который вступает в действие после завершения привязки данных, можете переопределить метод Page.OnPreRenderComplete(). Этот метод вызывается немедленно после стадии PreRender, но перед сериализацией состояния представления и генерацией действительной HTML-разметки.
Параметризованные команды
В предыдущем примере весь запрос целиком был жестко закодирован. Часто такая возможность отсутствует. Вместо этого необходимо извлечь подмножество данных, такое как все товары определенной категории или все сотрудники из определенного города.
В следующем примере создается форма типа «главная-детальная» с применением параметров. Для этого примера понадобится два источника данных. Первый представляет список городов (где живут сотрудники). Вот определение SqlDataSource и привязка его к раскрывающемуся списку:
В списковом элементе управления включена автоматическая обратная отправка, которая гарантирует, что страница будет отправляться обратно каждый раз, когда изменяется выбранная позиция в списке, предоставляя возможность странице соответствующим образом обновить список сотрудников на основе текущего выбранного города. Другой вариант заключается в создании выделенной кнопки (такой как Select (Выбрать)) рядом со списковым элементом управления для инициализации обратной отправки.
Когда выбирается город, второй источник данных извлекает всех сотрудников из этого города. Ниже показано определение второго источника данных:
Трюк состоит в том, что запрос записан с использованием параметра. Параметры всегда отмечаются символом @, в рассматриваемом случае это @City. Определить можно столько параметров, сколько необходимо, но каждый должен быть отображен на отдельное значение. В этом примере значение параметра @City выбирается из свойства DropDownList1.SelectedValue. Однако легко модифицировать дескриптор ControlParameter, привязав его к другому свойству или элементу управления.
При создании параметризованной команды в дескрипторе SqlDataSource параметры соответствующим образом кодируются для противодействия атаками внедрением SQL. Если теперь запустить страницу, можно будет увидеть список сотрудников из указанного города:
Хранимые процедуры
Рассматриваемый пример можно легко адаптировать для использования хранимых процедур. Например, предположим, что в базе данных имеется следующая хранимая процедура:
Тогда источник данных sourceEmployees можно изменить, как показано ниже:
Дополнительные сведения о типах параметров
Значения параметров не обязательно извлекаются из других элементов управления. Параметр может быть отображен на любой из типов параметров, описанных в таблице ниже:
Источник | Управляющий дескриптор | Описание |
---|---|---|
Свойство элемента управления |