Работа с вычисляемыми столбцами (C#)
При создании таблицы базы данных Microsoft SQL Server позволяет определить вычисляемый столбец, значение которого вычисляется из выражения, которое обычно ссылается на другие значения в той же записи базы данных. Такие значения доступны только для чтения в базе данных, что требует особых соображений при работе с TableAdapters. В этом руководстве мы узнаем, как выполнить задачи, связанные с вычисляемыми столбцами.
Введение
Microsoft SQL Server позволяет вычисляемым столбцам, которые являются столбцами, значения которых вычисляются из выражения, которое обычно ссылается на значения из других столбцов в той же таблице. Например, модель данных отслеживания времени может иметь таблицу ServiceLog
с именами столбцов, включая ServicePerformed
, Rate
EmployeeID
иDuration
, среди прочего. Хотя сумма из-за каждого элемента службы (коэффициент умножается на длительность) может быть вычисляться с помощью веб-страницы или другого программного интерфейса, возможно, удобно включить столбец в ServiceLog
таблицу с именем AmountDue
, которая сообщила об этой информации. Этот столбец может быть создан как обычный столбец, но он должен быть обновлен в любой момент, Duration
когда Rate
значения столбцов изменились. Лучше всего сделать AmountDue
столбец вычисляемого столбца с помощью выражения Rate * Duration
. Это приведет к тому, что SQL Server автоматически вычисляет AmountDue
значение столбца всякий раз, когда он был указан в запросе.
Так как вычисляемое значение столбца определяется выражением, такие столбцы доступны только для чтения и поэтому не могут иметь значения, назначенные им в INSERT
или UPDATE
инструкциях. Однако если вычисляемые столбцы являются частью основного запроса tableAdapter, использующего инструкции AD-hoc SQL, они автоматически включаются в автоматически созданные INSERT
и UPDATE
инструкции. Следовательно, необходимо обновить запросы INSERT
InsertCommand
UpdateCommand
и UPDATE
свойства TableAdapter, чтобы удалить ссылки на все вычисляемые столбцы.
Одна из задач использования вычисляемых столбцов с tableAdapter, использующими нерегламентированные инструкции SQL, заключается в том, что таблицаAdapter и INSERT
UPDATE
запросы автоматически создаются при завершении мастера настройки TableAdapter. Таким образом, вычисляемые столбцы вручную удаляются из INSERT
UPDATE
и запросы будут вновь появляться, если мастер повторно выполняется. Хотя TableAdapters, использующие хранимые процедуры, не страдают от этой хрупкости, у них есть собственные причуды, которые мы рассмотрим на шаге 3.
В этом руководстве мы добавим вычисляемый столбец в Suppliers
таблицу в базе данных Northwind, а затем создадим соответствующий TableAdapter для работы с этой таблицей и вычисляемого столбца. Мы будем использовать хранимые процедуры tableAdapter вместо нерегламентированных инструкций SQL, чтобы наши настройки не были потеряны при использовании мастера настройки TableAdapter.
Давайте приступим!
Шаг 1. Добавление вычисляемого столбца в таблицуSuppliers
База данных Northwind не имеет вычисляемых столбцов, поэтому нам потребуется добавить себя. В этом руководстве мы добавим вычисляемый столбец в Suppliers
таблицу FullContactName
, которая возвращает имя контакта, название и компанию, в которую они работают в следующем формате: ContactName
(ContactTitle
, CompanyName
). Этот вычисляемый столбец может использоваться в отчетах при отображении сведений о поставщиках.
Начните с открытия Suppliers
определения таблицы, щелкнув Suppliers
правой кнопкой мыши таблицу в обозревателе серверов и выбрав "Открыть определение таблицы" в контекстном меню. При этом будут отображаться столбцы таблицы и их свойства, такие как их тип данных, их разрешение NULL
и т. д. Чтобы добавить вычисляемый столбец, начните с ввода имени столбца в определение таблицы. Затем введите свое выражение в текстовое поле (Формула) в разделе "Спецификация вычисляемого столбца" в столбце окно свойств (см. рис. 1). Назовите вычисляемый столбец FullContactName
и используйте следующее выражение:
ContactName + ' (' + CASE WHEN ContactTitle IS NOT NULL THEN
ContactTitle + ', ' ELSE '' END + CompanyName + ')'
Обратите внимание, что строки можно объединить в SQL с помощью +
оператора. Оператор CASE
можно использовать как условный в традиционном языке программирования. В приведенном выше выражении CASE
оператор можно прочитать следующим образом: если ContactTitle
значение не NULL
ContactTitle
сцеплено с запятой, в противном случае ничего не выводится. Дополнительные сведения о полезности инструкции CASE
см. в инструкциях SQLCASE
.
Примечание.
Вместо использования инструкции CASE
здесь мы могли бы также использовать ISNULL(ContactTitle, '')
. ISNULL(checkExpression, replacementValue)
возвращает checkExpression, если значение не равно NULL, в противном случае возвращается значение замены. ISNULL
Хотя в этом экземпляре или CASE
будет работать, существуют более сложные сценарии, в которых гибкость инструкции CASE
не может быть сопоставленаISNULL
.
После добавления этого вычисляемого столбца экран должен выглядеть как снимок экрана на рис. 1.
Рис. 1. Добавление вычисляемого столбца с именем FullContactName
в Suppliers
таблицу (щелкните, чтобы просмотреть изображение полного размера)
После именования вычисляемого столбца и ввода его выражения сохраните изменения в таблице, нажав значок "Сохранить" на панели инструментов, нажав клавиши CTRL+S или перейдя в меню "Файл" и выбрав "Сохранить Suppliers
".
Сохранение таблицы должно обновить обозреватель серверов, включая только что добавленный столбец в списке Suppliers
столбцов таблицы. Кроме того, выражение, введенное в текстовое поле "Формула", автоматически настраивается на эквивалентное выражение, которое удаляет ненужные пробелы, окружает имена столбцов скобками ([]
) и включает скобки для более явного отображения порядка операций:
(((([ContactName]+' (')+case when [ContactTitle] IS NOT NULL
then [ContactTitle]+', ' else '' end)+[CompanyName])+')')
Дополнительные сведения о вычисляемых столбцах в Microsoft SQL Server см. в технической документации. Также ознакомьтесь с инструкцией. Указание вычисляемых столбцов для пошагового руководства по созданию вычисляемых столбцов.
Примечание.
По умолчанию вычисляемые столбцы физически не хранятся в таблице, но пересчитываются каждый раз, когда они ссылаются в запросе. Установив флажок "Сохраниться", вы можете указать SQL Server физически хранить вычисляемый столбец в таблице. Это позволяет создавать индекс в вычисляемом столбце, что может повысить производительность запросов, использующих значение вычисляемого столбца в их WHERE
предложениях. Дополнительные сведения см. в статье "Создание индексов в вычисляемых столбцах ".
Шаг 2. Просмотр значений вычисляемого столбца
Прежде чем начать работу с уровнем доступа к данным, давайте минуту FullContactName
рассмотрим значения. В обозревателе серверов щелкните правой кнопкой мыши Suppliers
имя таблицы и выберите "Создать запрос" в контекстном меню. Откроется окно запроса, которое предложит нам выбрать, какие таблицы следует включить в запрос. Добавьте таблицу Suppliers
и нажмите кнопку "Закрыть". Затем проверьте CompanyName
столбцы и ContactName
ContactTitle
FullContactName
столбцы из таблицы "Поставщики". Наконец, щелкните значок красной восклицательного знака на панели инструментов, чтобы выполнить запрос и просмотреть результаты.
Как показано на рисунке 2, результаты включают в себя FullContactName
, в котором перечислены CompanyName
ContactName
столбцы и ContactTitle
столбцы с использованием формата ldquo;ContactName
(ContactTitle
, CompanyName
) .
Рис. 2. Использует FullContactName
формат ContactName
(ContactTitle
, CompanyName
) (щелкните, чтобы просмотреть изображение полного размера)
Шаг 3. ДобавлениеSuppliersTableAdapter
уровня доступа к данным
Для работы с сведениями о поставщике в нашем приложении необходимо сначала создать TableAdapter и DataTable в нашем DAL. В идеале это будет сделано с помощью одних и того же простого шага, рассмотренного в предыдущих руководствах. Однако работа с вычисляемых столбцов представляет несколько морщин, которые заслуживают обсуждения.
Если вы используете TableAdapter, использующего инструкции AD-hoc SQL, можно просто включить вычисляемый столбец в основной запрос TableAdapter с помощью мастера настройки TableAdapter. Однако это приведет к автоматическому созданию INSERT
и UPDATE
операторам, включающим вычисляемый столбец. При попытке выполнить один из этих методов невозможно изменить сообщение ColumnName столбца, SqlException
так как это вычисляемый столбец или результат оператора UNION будет вызван. INSERT
Хотя инструкцию и UPDATE
инструкцию можно вручную настроить с помощью таблиц InsertCommand
UpdateCommand
и свойств TableAdapter, эти настройки будут потеряны при повторном запуске мастера настройки TableAdapter.
Из-за хрупкости TableAdapters, использующей нерегламентированные инструкции SQL, рекомендуется использовать хранимые процедуры при работе с вычисляющими столбцами. Если вы используете существующие хранимые процедуры, просто настройте TableAdapter, как описано в руководстве по использованию существующих хранимых процедур для typed DataSet s TableAdapters . Если у вас есть мастер TableAdapter, создайте для вас хранимые процедуры, однако важно сначала опустить вычисляемые столбцы из основного запроса. Если вы включили вычисляемый столбец в основной запрос, мастер конфигурации TableAdapter сообщит вам, что он не может создать соответствующие хранимые процедуры. Короче говоря, сначала необходимо настроить TableAdapter с помощью вычисляемого основного запроса без столбца, а затем вручную обновить соответствующую хранимую процедуру и tableAdapter, SelectCommand
чтобы включить вычисляемый столбец. Этот подход аналогичен тому, который используется в руководстве по обновлению tableAdapter для использованияJOIN
.
В этом руководстве мы добавим новый TableAdapter и автоматически создадим хранимые процедуры для нас. Следовательно, сначала необходимо опустить FullContactName
вычисляемый столбец из основного запроса.
Начните с открытия NorthwindWithSprocs
набора данных в папке ~/App_Code/DAL
. Щелкните правой кнопкой мыши конструктор и в контекстном меню выберите новый tableAdapter. Откроется мастер настройки TableAdapter. Укажите базу данных для запроса данных из (NORTHWNDConnectionString
из Web.config
) и нажмите кнопку "Далее". Так как мы еще не создали хранимые процедуры для запроса или изменения Suppliers
таблицы, выберите параметр "Создать новые хранимые процедуры", чтобы мастер создал их для нас и нажмите кнопку "Далее".
Рис. 3. Выберите параметр "Создать новые хранимые процедуры" (щелкните, чтобы просмотреть изображение полного размера)
Последующий шаг предложит нам выполнить основной запрос. Введите следующий запрос, который возвращает SupplierID
CompanyName
ContactName
столбцы и ContactTitle
столбцы для каждого поставщика. Обратите внимание, что этот запрос намеренно пропускает вычисляемый столбец (FullContactName
); мы обновим соответствующую хранимую процедуру, чтобы включить этот столбец в шаге 4.
SELECT SupplierID, CompanyName, ContactName, ContactTitle
FROM Suppliers
После ввода основного запроса и нажатия кнопки Далее мастер позволяет нам назвать четыре хранимые процедуры, которые он создаст. Назовите эти хранимые процедурыSuppliers_Select
, Suppliers_Insert
иSuppliers_Update
Suppliers_Delete
, как показано на рисунке 4.
Рис. 4. Настройка имен автоматически созданных хранимых процедур (щелкните, чтобы просмотреть изображение полного размера)
Следующий шаг мастера позволяет назвать методы TableAdapter и указать шаблоны, используемые для доступа к данным и обновления данных. Оставьте все три флажка флажком, но переименуйте метод GetSuppliers
в GetData
. Чтобы завершить работу мастера, нажмите кнопку Готово .
Рис. 5. Переименование GetData
метода GetSuppliers
в (щелкните, чтобы просмотреть изображение полного размера)
После нажатия кнопки "Готово" мастер создаст четыре хранимых процедуры и добавит TableAdapter и соответствующую таблицу DataTable в типизированный набор данных.
Шаг 4. Включение вычисляемого столбца в основной запрос TableAdapter
Теперь необходимо обновить таблицу TableAdapter и DataTable, созданную на шаге 3, чтобы включить FullContactName
вычисляемый столбец. Данное действие состоит из следующих шагов:
Suppliers_Select
Обновление хранимой процедуры для возврата вычисляемогоFullContactName
столбца и- Обновление DataTable для включения соответствующего
FullContactName
столбца.
Начните с перехода к обозревателе серверов и детализации в папке хранимых процедур. Suppliers_Select
Откройте хранимую процедуру и обновите SELECT
запрос, чтобы включить FullContactName
вычисляемый столбец:
SELECT SupplierID, CompanyName, ContactName, ContactTitle, FullContactName
FROM Suppliers
Сохраните изменения в хранимой процедуре, щелкнув значок "Сохранить" на панели инструментов, нажав клавиши CTRL+S или выбрав пункт "Сохранить Suppliers_Select
" в меню "Файл".
Затем вернитесь к конструктору наборов данных, щелкните правой кнопкой мыши SuppliersTableAdapter
и выберите "Настроить" в контекстном меню. Обратите внимание, что Suppliers_Select
столбец теперь включает FullContactName
столбец в коллекцию столбцов данных.
Рис. 6. Запустите мастер настройки TableAdapter, чтобы обновить столбцы DataTable (щелкните, чтобы просмотреть изображение полного размера)
Чтобы завершить работу мастера, нажмите кнопку Готово . Это автоматически добавит соответствующий столбец в .SuppliersDataTable
Мастер TableAdapter достаточно умный, чтобы определить, что FullContactName
столбец является вычисляемым столбцом и поэтому доступен только для чтения. Следовательно, он задает для свойства столбца ReadOnly
значение true
. Чтобы проверить это, выберите столбец из и SuppliersDataTable
перейдите к окно свойств (см. рисунок 7). Обратите внимание, что FullContactName
столбцы DataType
и MaxLength
свойства также задаются соответствующим образом.
Рис. 7. FullContactName
Столбец помечен как доступный только для чтения (щелкните, чтобы просмотреть изображение полного размера)
Шаг 5. ДобавлениеGetSupplierBySupplierID
метода в TableAdapter
В этом руководстве мы создадим страницу ASP.NET, отображающую поставщиков в обновляемой сетке. В предыдущих руководствах мы обновили одну запись из уровня бизнес-логики, извлекая определенную запись из DAL в виде строго типизированной таблицы DataTable, обновляя ее свойства, а затем отправляя обновленные данные DataTable обратно в DAL, чтобы распространить изменения в базу данных. Чтобы выполнить этот первый шаг - получение записи, обновляемой GetSupplierBySupplierID(supplierID)
из DAL, необходимо сначала добавить метод в DAL.
Щелкните правой кнопкой мыши SuppliersTableAdapter
элемент в конструкторе набора данных и выберите параметр "Добавить запрос" в контекстном меню. Как мы сделали на шаге 3, позвольте мастеру создать новую хранимую процедуру для нас, выбрав параметр "Создать новую хранимую процедуру" (см. рисунок 3 для снимка экрана этого шага мастера). Так как этот метод вернет запись с несколькими столбцами, укажите, что мы хотим использовать SQL-запрос, который возвращает строки и нажмите кнопку "Далее".
Рис. 8. Выберите параметр SELECT, возвращающий строки (щелкните, чтобы просмотреть изображение полного размера)
Последующий шаг запрашивает запрос, используемый для этого метода. Введите следующее, которое возвращает те же поля данных, что и основной запрос, но для конкретного поставщика.
SELECT SupplierID, CompanyName, ContactName, ContactTitle, FullContactName
FROM Suppliers
WHERE SupplierID = @SupplierID
На следующем экране появится запрос на имя хранимой процедуры, которая будет создана автоматически. Назовите эту хранимую процедуру Suppliers_SelectBySupplierID
и нажмите кнопку "Далее".
Рис. 9. Назовите хранимую процедуру Suppliers_SelectBySupplierID
(щелкните, чтобы просмотреть изображение полного размера)
Наконец, мастер предложит нам использовать шаблоны доступа к данным и имена методов для TableAdapter. Оставьте флажки флажки флажком, но переименуйте их в иGetSupplierBySupplierID
, соответственно, переименуйте FillBy
GetDataBy
методыFillBySupplierID
.
Рис. 10. Назовите методы FillBySupplierID
TableAdapter и GetSupplierBySupplierID
(щелкните, чтобы просмотреть изображение полного размера)
Чтобы завершить работу мастера, нажмите кнопку Готово .
Шаг 6. Создание уровня бизнес-логики
Прежде чем создать страницу ASP.NET, использующую вычисляемый столбец, созданный на шаге 1, сначала необходимо добавить соответствующие методы в BLL. Страница ASP.NET, которую мы создадим на шаге 7, позволит пользователям просматривать и редактировать поставщиков. Поэтому нам нужен наш BLL для предоставления, как минимум, метода для получения всех поставщиков и другого для обновления конкретного поставщика.
Создайте файл класса с именем SuppliersBLLWithSprocs
в папке ~/App_Code/BLL
и добавьте следующий код:
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using NorthwindWithSprocsTableAdapters;
[System.ComponentModel.DataObject]
public class SuppliersBLLWithSprocs
{
private SuppliersTableAdapter _suppliersAdapter = null;
protected SuppliersTableAdapter Adapter
{
get
{
if (_suppliersAdapter == null)
_suppliersAdapter = new SuppliersTableAdapter();
return _suppliersAdapter;
}
}
[System.ComponentModel.DataObjectMethodAttribute
(System.ComponentModel.DataObjectMethodType.Select, true)]
public NorthwindWithSprocs.SuppliersDataTable GetSuppliers()
{
return Adapter.GetSuppliers();
}
[System.ComponentModel.DataObjectMethodAttribute
(System.ComponentModel.DataObjectMethodType.Update, true)]
public bool UpdateSupplier(string companyName, string contactName,
string contactTitle, int supplierID)
{
NorthwindWithSprocs.SuppliersDataTable suppliers =
Adapter.GetSupplierBySupplierID(supplierID);
if (suppliers.Count == 0)
// no matching record found, return false
return false;
NorthwindWithSprocs.SuppliersRow supplier = suppliers[0];
supplier.CompanyName = companyName;
if (contactName == null)
supplier.SetContactNameNull();
else
supplier.ContactName = contactName;
if (contactTitle == null)
supplier.SetContactTitleNull();
else
supplier.ContactTitle = contactTitle;
// Update the product record
int rowsAffected = Adapter.Update(supplier);
// Return true if precisely one row was updated, otherwise false
return rowsAffected == 1;
}
}
Как и другие классы BLL, имеет protected
Adapter
свойство, SuppliersBLLWithSprocs
которое возвращает экземпляр SuppliersTableAdapter
класса вместе с двумя public
методами: GetSuppliers
и UpdateSupplier
. Метод GetSuppliers
вызывает и возвращает SuppliersDataTable
возвращаемый соответствующим GetSupplier
методом в уровне доступа к данным. Метод UpdateSupplier
получает сведения о конкретном поставщике, обновляемом с помощью вызова метода DAL.GetSupplierBySupplierID(supplierID)
Затем он обновляет CategoryName
ContactName
и свойства и ContactTitle
фиксирует эти изменения в базе данных путем вызова метода уровня Update
доступа к данным, передавая измененный SuppliersRow
объект.
Примечание.
SupplierID
CompanyName
Кроме того, все столбцы в таблице "Поставщики" разрешают NULL
значения. Таким образом, если переданные или параметры необходимо задать соответствующее ContactName
значение и ContactTitle
свойства NULL
базы данных, используя SetContactNameNull
методы и SetContactTitleNull
методы соответственно.null
contactTitle
contactName
Шаг 7. Работа с вычисляемого столбца на уровне презентации
С помощью вычисляемого столбца, добавленного в Suppliers
таблицу, и DAL и BLL обновлены соответствующим образом, мы готовы создать страницу ASP.NET, которая работает с вычисляемым столбцом FullContactName
. Начните с открытия ComputedColumns.aspx
страницы в AdvancedDAL
папке и перетащите GridView из панели элементов в конструктор. Задайте для свойства Suppliers
GridView ID
значение и из смарт-тега привязать его к новому объекту ObjectDataSource с именем SuppliersDataSource
. Настройте ObjectDataSource для использования класса, добавленного SuppliersBLLWithSprocs
на шаге 6, и нажмите кнопку "Далее".
Рис. 11. Настройка ObjectDataSource для использования SuppliersBLLWithSprocs
класса (щелкните, чтобы просмотреть изображение полного размера)
В классе определены SuppliersBLLWithSprocs
только два метода: GetSuppliers
и UpdateSupplier
. Убедитесь, что эти два метода указаны на вкладках SELECT и UPDATE соответственно, и нажмите кнопку "Готово", чтобы завершить настройку ObjectDataSource.
После завершения мастера настройки источника данных Visual Studio добавит BoundField для каждого возвращаемого поля данных. SupplierID
Удалите BoundField и измените HeaderText
свойства CompanyName
объекта , ContactName
ContactTitle
и FullContactName
BoundFields на компанию, имя контакта, название и полное имя контакта соответственно. В смарт-теге установите флажок "Включить редактирование", чтобы включить встроенные возможности редактирования GridView.
Помимо добавления BoundFields в GridView, завершение мастера источника данных также приводит к тому, что Visual Studio присвоит свойству ObjectDataSource OldValuesParameterFormatString
значение original_{0}. Вернуть этот параметр обратно в значение {0} по умолчанию.
После внесения этих изменений в GridView и ObjectDataSource их декларативная разметка должна выглядеть следующим образом:
<asp:GridView ID="Suppliers" runat="server" AutoGenerateColumns="False"
DataKeyNames="SupplierID" DataSourceID="SuppliersDataSource">
<Columns>
<asp:CommandField ShowEditButton="True" />
<asp:BoundField DataField="CompanyName"
HeaderText="Company"
SortExpression="CompanyName" />
<asp:BoundField DataField="ContactName"
HeaderText="Contact Name"
SortExpression="ContactName" />
<asp:BoundField DataField="ContactTitle"
HeaderText="Title"
SortExpression="ContactTitle" />
<asp:BoundField DataField="FullContactName"
HeaderText="Full Contact Name"
SortExpression="FullContactName"
ReadOnly="True" />
</Columns>
</asp:GridView>
<asp:ObjectDataSource ID="SuppliersDataSource" runat="server"
SelectMethod="GetSuppliers" TypeName="SuppliersBLLWithSprocs"
UpdateMethod="UpdateSupplier">
<UpdateParameters>
<asp:Parameter Name="companyName" Type="String" />
<asp:Parameter Name="contactName" Type="String" />
<asp:Parameter Name="contactTitle" Type="String" />
<asp:Parameter Name="supplierID" Type="Int32" />
</UpdateParameters>
</asp:ObjectDataSource>
Затем посетите эту страницу через браузер. Как показано на рисунке 12, каждый поставщик указан в сетке, которая включает FullContactName
столбец, значение которого является просто объединением других трех столбцов, отформатированных как ContactName
(ContactTitle
, CompanyName
) .
Рис. 12. Каждый поставщик указан в сетке (щелкните, чтобы просмотреть изображение полного размера)
Нажатие кнопки "Изменить" для конкретного поставщика приводит к обратной отправке и отображает строку в интерфейсе редактирования (см. рис. 13). Первые три столбца отображаются в интерфейсе редактирования по умолчанию — элемент управления TextBox, свойство которого Text
задано значением поля данных. Однако столбец FullContactName
остается текстом. Когда в GridView были добавлены в GridView при завершении мастера настройки источника данных, свойство BoundField ReadOnly
было заданоtrue
, FullContactName
так как соответствующий FullContactName
столбец в SuppliersDataTable
свойстве имеет значение ReadOnly
true
. Как отмечалось на шаге 4, свойство s ReadOnly
было заданоtrue
, FullContactName
так как TableAdapter обнаружил, что столбец был вычисляемый столбец.
Рис. 13. Столбец FullContactName
не редактируется (щелкните, чтобы просмотреть изображение полного размера)
Перейдите вперед и обновите значение одного или нескольких редактируемых столбцов и нажмите кнопку "Обновить". Обратите внимание, как FullContactName
значение s автоматически обновляется, чтобы отразить изменение.
Примечание.
GridView в настоящее время использует BoundFields для редактируемых полей, что приводит к интерфейсу редактирования по умолчанию. CompanyName
Так как поле является обязательным, оно должно быть преобразовано в TemplateField, включающее ОбязательныйFieldValidator. Я оставлю это в качестве упражнения для интересного читателя. Ознакомьтесь с руководством по добавлению элементов управления проверки в руководство по редактированию и вставке интерфейсов, чтобы пошаговые инструкции по преобразованию BoundField в TemplateField и добавлению элементов управления проверки.
Итоги
При определении схемы таблицы Microsoft SQL Server позволяет включать вычисляемые столбцы. Это столбцы, значения которых вычисляются из выражения, которое обычно ссылается на значения из других столбцов в той же записи. Так как значения вычисляемых столбцов основаны на выражении, они доступны только для чтения и не могут быть назначены значение в операторе INSERT
или UPDATE
инструкции. Это приводит к проблемам при использовании вычисляемого столбца в основном запросе TableAdapter, который пытается автоматически создавать соответствующие INSERT
UPDATE
операторы и DELETE
инструкции.
В этом руководстве мы рассмотрели методы обхода проблем, связанных с вычисляемыми столбцами. В частности, мы использовали хранимые процедуры в tableAdapter для преодоления хрупкости, присущей TableAdapters, использующей нерегламентированные инструкции SQL. При создании новых хранимых процедур мастер TableAdapter важно, чтобы основной запрос изначально опустил вычисляемые столбцы, так как их присутствие предотвращает создание хранимых процедур изменения данных. После первоначальной настройки TableAdapter ее SelectCommand
хранимая процедура может быть перенастроена, чтобы включить все вычисляемые столбцы.
Счастливое программирование!
Об авторе
Скотт Митчелл, автор семи книг ASP/ASP.NET и основатель 4GuysFromRolla.com, работает с технологиями Microsoft Web с 1998 года. Скотт работает независимым консультантом, тренером и писателем. Его последняя книга Сэмс Учит себя ASP.NET 2.0 в 24 часах. Он может быть достигнут в mitchell@4GuysFromRolla.com. или через его блог, который можно найти на http://ScottOnWriting.NET.
Особое спасибо
Эта серия учебников была проверена многими полезными рецензентами. Ведущие рецензенты для этого руководства были Хилтон Geisenow и Тереса Мерфи. Хотите просмотреть мои предстоящие статьи MSDN? Если да, упадите меня линию в mitchell@4GuysFromRolla.com.