Поделиться через


Работа с вычисляемыми столбцами (C#)

Скотт Митчелл

Скачать в формате PDF

При создании таблицы базы данных Microsoft SQL Server позволяет определить вычисляемый столбец, значение которого вычисляется из выражения, которое обычно ссылается на другие значения в той же записи базы данных. Такие значения доступны только для чтения в базе данных, что требует особых соображений при работе с TableAdapters. В этом руководстве мы узнаем, как выполнить задачи, связанные с вычисляемыми столбцами.

Введение

Microsoft SQL Server позволяет вычисляемым столбцам, которые являются столбцами, значения которых вычисляются из выражения, которое обычно ссылается на значения из других столбцов в той же таблице. Например, модель данных отслеживания времени может иметь таблицу ServiceLog с именами столбцов, включая ServicePerformed, RateEmployeeIDи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.

Добавление вычисляемого столбца FullContactName в таблицу поставщиков

Рис. 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столбцы и ContactNameContactTitleFullContactName столбцы из таблицы "Поставщики". Наконец, щелкните значок красной восклицательного знака на панели инструментов, чтобы выполнить запрос и просмотреть результаты.

Как показано на рисунке 2, результаты включают в себя FullContactName, в котором перечислены CompanyNameContactNameстолбцы и ContactTitle столбцы с использованием формата ldquo;ContactName (ContactTitle, CompanyName) .

FullContactName использует format 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. Выберите параметр "Создать новые хранимые процедуры" (щелкните, чтобы просмотреть изображение полного размера)

Последующий шаг предложит нам выполнить основной запрос. Введите следующий запрос, который возвращает SupplierIDCompanyNameContactNameстолбцы и ContactTitle столбцы для каждого поставщика. Обратите внимание, что этот запрос намеренно пропускает вычисляемый столбец (FullContactName); мы обновим соответствующую хранимую процедуру, чтобы включить этот столбец в шаге 4.

SELECT SupplierID, CompanyName, ContactName, ContactTitle
FROM Suppliers

После ввода основного запроса и нажатия кнопки Далее мастер позволяет нам назвать четыре хранимые процедуры, которые он создаст. Назовите эти хранимые процедурыSuppliers_Select, Suppliers_InsertиSuppliers_UpdateSuppliers_Delete, как показано на рисунке 4.

Настройка имен автоматически созданных хранимых процедур

Рис. 4. Настройка имен автоматически созданных хранимых процедур (щелкните, чтобы просмотреть изображение полного размера)

Следующий шаг мастера позволяет назвать методы TableAdapter и указать шаблоны, используемые для доступа к данным и обновления данных. Оставьте все три флажка флажком, но переименуйте метод GetSuppliersв GetData . Чтобы завершить работу мастера, нажмите кнопку Готово .

Переименование метода GetData в GetSuppliers

Рис. 5. Переименование GetData метода GetSuppliers в (щелкните, чтобы просмотреть изображение полного размера)

После нажатия кнопки "Готово" мастер создаст четыре хранимых процедуры и добавит TableAdapter и соответствующую таблицу DataTable в типизированный набор данных.

Шаг 4. Включение вычисляемого столбца в основной запрос TableAdapter

Теперь необходимо обновить таблицу TableAdapter и DataTable, созданную на шаге 3, чтобы включить FullContactName вычисляемый столбец. Данное действие состоит из следующих шагов:

  1. Suppliers_Select Обновление хранимой процедуры для возврата вычисляемого FullContactName столбца и
  2. Обновление DataTable для включения соответствующего FullContactName столбца.

Начните с перехода к обозревателе серверов и детализации в папке хранимых процедур. Suppliers_Select Откройте хранимую процедуру и обновите SELECT запрос, чтобы включить FullContactName вычисляемый столбец:

SELECT SupplierID, CompanyName, ContactName, ContactTitle, FullContactName
FROM Suppliers

Сохраните изменения в хранимой процедуре, щелкнув значок "Сохранить" на панели инструментов, нажав клавиши CTRL+S или выбрав пункт "Сохранить Suppliers_Select " в меню "Файл".

Затем вернитесь к конструктору наборов данных, щелкните правой кнопкой мыши SuppliersTableAdapterи выберите "Настроить" в контекстном меню. Обратите внимание, что Suppliers_Select столбец теперь включает FullContactName столбец в коллекцию столбцов данных.

Запустите мастер настройки TableAdapter, чтобы обновить столбцы DataTable

Рис. 6. Запустите мастер настройки TableAdapter, чтобы обновить столбцы DataTable (щелкните, чтобы просмотреть изображение полного размера)

Чтобы завершить работу мастера, нажмите кнопку Готово . Это автоматически добавит соответствующий столбец в .SuppliersDataTable Мастер TableAdapter достаточно умный, чтобы определить, что FullContactName столбец является вычисляемым столбцом и поэтому доступен только для чтения. Следовательно, он задает для свойства столбца ReadOnly значение true. Чтобы проверить это, выберите столбец из и SuppliersDataTable перейдите к окно свойств (см. рисунок 7). Обратите внимание, что FullContactName столбцы DataType и MaxLength свойства также задаются соответствующим образом.

Столбец FullContactName помечен как доступный только для чтения

Рис. 7. FullContactName Столбец помечен как доступный только для чтения (щелкните, чтобы просмотреть изображение полного размера)

Шаг 5. ДобавлениеGetSupplierBySupplierIDметода в TableAdapter

В этом руководстве мы создадим страницу ASP.NET, отображающую поставщиков в обновляемой сетке. В предыдущих руководствах мы обновили одну запись из уровня бизнес-логики, извлекая определенную запись из DAL в виде строго типизированной таблицы DataTable, обновляя ее свойства, а затем отправляя обновленные данные DataTable обратно в DAL, чтобы распространить изменения в базу данных. Чтобы выполнить этот первый шаг - получение записи, обновляемой GetSupplierBySupplierID(supplierID) из DAL, необходимо сначала добавить метод в DAL.

Щелкните правой кнопкой мыши SuppliersTableAdapter элемент в конструкторе набора данных и выберите параметр "Добавить запрос" в контекстном меню. Как мы сделали на шаге 3, позвольте мастеру создать новую хранимую процедуру для нас, выбрав параметр "Создать новую хранимую процедуру" (см. рисунок 3 для снимка экрана этого шага мастера). Так как этот метод вернет запись с несколькими столбцами, укажите, что мы хотим использовать SQL-запрос, который возвращает строки и нажмите кнопку "Далее".

Выберите параметр SELECT, возвращающий строки

Рис. 8. Выберите параметр SELECT, возвращающий строки (щелкните, чтобы просмотреть изображение полного размера)

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

SELECT SupplierID, CompanyName, ContactName, ContactTitle, FullContactName
FROM Suppliers
WHERE SupplierID = @SupplierID

На следующем экране появится запрос на имя хранимой процедуры, которая будет создана автоматически. Назовите эту хранимую процедуру Suppliers_SelectBySupplierID и нажмите кнопку "Далее".

Назовите хранимую процедуру Suppliers_SelectBySupplierID

Рис. 9. Назовите хранимую процедуру Suppliers_SelectBySupplierID (щелкните, чтобы просмотреть изображение полного размера)

Наконец, мастер предложит нам использовать шаблоны доступа к данным и имена методов для TableAdapter. Оставьте флажки флажки флажком, но переименуйте их в иGetSupplierBySupplierID, соответственно, переименуйте FillBy GetDataBy методыFillBySupplierID.

Назовите методы TableAdapter FillBySupplierID и GetSupplierBySupplierID

Рис. 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) Затем он обновляет CategoryNameContactNameи свойства и 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, и нажмите кнопку "Далее".

Настройка ObjectDataSource для использования класса SuppliersBLLWithSprocs

Рис. 11. Настройка ObjectDataSource для использования SuppliersBLLWithSprocs класса (щелкните, чтобы просмотреть изображение полного размера)

В классе определены SuppliersBLLWithSprocs только два метода: GetSuppliers и UpdateSupplier. Убедитесь, что эти два метода указаны на вкладках SELECT и UPDATE соответственно, и нажмите кнопку "Готово", чтобы завершить настройку ObjectDataSource.

После завершения мастера настройки источника данных Visual Studio добавит BoundField для каждого возвращаемого поля данных. SupplierID Удалите BoundField и измените HeaderText свойства CompanyNameобъекта , ContactNameContactTitleи 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 обнаружил, что столбец был вычисляемый столбец.

Столбец FullContactName не редактируется

Рис. 13. Столбец FullContactName не редактируется (щелкните, чтобы просмотреть изображение полного размера)

Перейдите вперед и обновите значение одного или нескольких редактируемых столбцов и нажмите кнопку "Обновить". Обратите внимание, как FullContactName значение s автоматически обновляется, чтобы отразить изменение.

Примечание.

GridView в настоящее время использует BoundFields для редактируемых полей, что приводит к интерфейсу редактирования по умолчанию. CompanyName Так как поле является обязательным, оно должно быть преобразовано в TemplateField, включающее ОбязательныйFieldValidator. Я оставлю это в качестве упражнения для интересного читателя. Ознакомьтесь с руководством по добавлению элементов управления проверки в руководство по редактированию и вставке интерфейсов, чтобы пошаговые инструкции по преобразованию BoundField в TemplateField и добавлению элементов управления проверки.

Итоги

При определении схемы таблицы Microsoft SQL Server позволяет включать вычисляемые столбцы. Это столбцы, значения которых вычисляются из выражения, которое обычно ссылается на значения из других столбцов в той же записи. Так как значения вычисляемых столбцов основаны на выражении, они доступны только для чтения и не могут быть назначены значение в операторе INSERT или UPDATE инструкции. Это приводит к проблемам при использовании вычисляемого столбца в основном запросе TableAdapter, который пытается автоматически создавать соответствующие INSERTUPDATEоператоры и 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.