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


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

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

Загрузить PDF-файл

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

Введение

Microsoft SQL Server позволяет использовать вычисляемые столбцы, которые являются столбцами, значения которых вычисляются из выражения, которое обычно ссылается на значения из других столбцов в той же таблице. Например, модель данных отслеживания времени может содержать таблицу ServiceLog со столбцами, включая ServicePerformed, EmployeeID, Rateи Duration. Хотя сумма к оплате за каждый элемент службы (ставка, умноженная на длительность) может быть рассчитана с помощью веб-страницы или другого программного интерфейса, может быть удобно включить столбец в таблицу ServiceLog с именем AmountDue , в которой представлены эти сведения. Этот столбец можно создать как обычный столбец, но его необходимо обновлять при каждом изменении значений Rate столбца или Duration . Лучший подход — сделать AmountDue столбец вычисляемого с помощью выражения Rate * Duration. Это приведет к тому, что SQL Server автоматически вычисляет AmountDue значение столбца при каждом указании ссылки на него в запросе.

Так как значение вычисляемого столбца определяется выражением, такие столбцы доступны только для чтения и поэтому не могут иметь значения, назначенные им в INSERT операторах или UPDATE . Однако если вычисляемые столбцы являются частью запроса main для TableAdapter, использующего нерегламентированные INSERT инструкции SQL, они автоматически включаются в автоматически создаваемые инструкции и UPDATE . Следовательно, запросы и UPDATE свойства TableAdapter INSERT и InsertCommand и UpdateCommand должны быть обновлены, чтобы удалить ссылки на все вычисляемые столбцы.

Одна из проблем использования вычисляемых столбцов с TableAdapter, использующим нерегламентированные инструкции SQL, заключается в том, что запросы и TableAdapter INSERTUPDATE автоматически создаются после завершения работы мастера настройки TableAdapter. Таким образом, вычисляемые столбцы, вручную удаленные из INSERT запросов и UPDATE , появятся снова при повторном запуске мастера. Хотя адаптеры Таблиц, использующие хранимые процедуры, не страдают от этой хрупкости, у них есть свои собственные причуды, которые мы рассмотрим на шаге 3.

В этом руководстве мы добавим вычисляемый столбец в таблицу Suppliers в базе данных Northwind, а затем создадим соответствующий объект TableAdapter для работы с этой таблицей и ее вычисляемого столбца. В tableAdapter будут использоваться хранимые процедуры вместо нерегламентированных инструкций SQL, чтобы не потерять настройки при использовании мастера настройки TableAdapter.

Приступим!

Шаг 1. Добавление вычисляемого столбца в таблицуSuppliers

В базе данных Northwind нет вычисляемых столбцов, поэтому нам потребуется добавить их самостоятельно. В этом руководстве мы добавим вычисляемый столбец в Suppliers таблицу с именем FullContactName , который возвращает имя контакта, название и компанию, в которую они работают, в следующем формате: ContactName (ContactTitle, CompanyName). Этот вычисляемый столбец может использоваться в отчетах при отображении сведений о поставщиках.

Начните с открытия Suppliers определения таблицы, щелкнув правой кнопкой мыши таблицу Suppliers в Обозреватель сервера и выбрав в контекстном меню пункт Открыть определение таблицы. Будут отображены столбцы таблицы и их свойства, такие как тип данных, разрешено NULL ли для них s и т. д. Чтобы добавить вычисляемый столбец, начните с ввода имени столбца в определении таблицы. Затем введите его выражение в текстовое поле (Формула) в разделе Спецификация вычисляемого столбца в окно свойств столбца (см. рис. 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, в противном случае возвращает replacementValue. Хотя в этом экземпляре работает или ISNULLCASE , существуют более сложные сценарии, в которых гибкость 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 см. в технической документации. Кроме того, проверка пошаговое руководство по созданию вычисляемых столбцов в разделе Практическое руководство. Указание вычисляемых столбцов.

Примечание

По умолчанию вычисляемые столбцы физически не хранятся в таблице, а пересчитываются каждый раз, когда на них ссылаются в запросе. Установив флажок Is Persisted , вы можете указать SQL Server физически сохранить вычисляемый столбец в таблице. Это позволяет создать индекс в вычисляемом столбце, что может повысить производительность запросов, использующих значение вычисляемого столбца в своих WHERE предложениях. Дополнительные сведения см. в разделе Создание индексов для вычисляемых столбцов .

Шаг 2. Просмотр значений вычисляемых столбцов

Прежде чем приступить к работе над уровнем доступа к данным, давайте уйдем минуту, чтобы просмотреть FullContactName значения. В Обозреватель сервера щелкните правой кнопкой мыши Suppliers имя таблицы и выберите в контекстном меню пункт Создать запрос. Откроется окно Запрос, в которое будет предложено выбрать таблицы для включения в запрос. Добавьте таблицу Suppliers и нажмите кнопку Закрыть. Затем проверка столбцы CompanyName, ContactName, ContactTitleи FullContactName из таблицы Поставщики. Наконец, щелкните красный восклицательный знак на панели инструментов, чтобы выполнить запрос и просмотреть результаты.

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

FullContactName использует формат ContactName (ContactTitle, CompanyName)

Рис. 2. Использует FullContactName формат ContactName (ContactTitle, CompanyName) (щелкните для просмотра полноразмерного изображения)

Шаг 3. Добавление вSuppliersTableAdapterуровень доступа к данным

Для работы со сведениями о поставщике в нашем приложении необходимо сначала создать TableAdapter и DataTable в DAL. В идеале это можно сделать с помощью простых действий, описанных в предыдущих руководствах. Однако работа с вычисляемых столбцов представляет несколько морщин, которые заслуживают обсуждения.

Если вы используете TableAdapter, использующий нерегламентированные инструкции SQL, можно просто включить вычисляемый столбец в запрос main TableAdapter с помощью мастера настройки TableAdapter. Однако при этом будут автоматически создаваться INSERT инструкции и UPDATE , которые включают вычисляемый столбец. При попытке выполнить один из этих методов вызовет исключение с сообщением SqlException Столбец Имя _столбца, так как это либо вычисляемый столбец, либо результат оператора UNION. Хотя инструкцию INSERT и UPDATE можно вручную настроить с помощью свойств и TableAdapter InsertCommandUpdateCommand , эти настройки будут потеряны при каждом повторном запуске мастера настройки TableAdapter.

Из-за хрупкости TableAdapters, которые используют нерегламентированные инструкции SQL, рекомендуется использовать хранимые процедуры при работе с вычисляемых столбцов. Если вы используете существующие хранимые процедуры, просто настройте TableAdapter, как описано в руководстве Using Existing Stored Procedures for the Typed DataSet s TableAdapters . Если мастер TableAdapter создает хранимые процедуры автоматически, важно сначала исключить все вычисляемые столбцы из запроса main. При включении вычисляемого столбца в запрос main мастер настройки TableAdapter сообщит, что по завершении он не сможет создать соответствующие хранимые процедуры. Короче говоря, сначала необходимо настроить TableAdapter с помощью вычисляемого запроса без столбцов main, а затем вручную обновить соответствующую хранимую процедуру и tableAdapter, SelectCommand чтобы включить вычисляемый столбец. Этот подход аналогичен тому, который используетсяв учебникеОбновление таблицыAdapter to UseJOIN.

В этом руководстве мы добавим новый объект TableAdapter и автоматически создадим хранимые процедуры. Следовательно, необходимо сначала опустить FullContactName вычисляемый столбец в запросе main.

Начните с открытия NorthwindWithSprocs Набора данных в папке ~/App_Code/DAL . Щелкните правой кнопкой мыши Designer и в контекстном меню выберите добавить новый объект TableAdapter. Откроется мастер настройки TableAdapter. Укажите базу данных для запроса данных из (NORTHWNDConnectionString из Web.config) и нажмите кнопку Далее. Так как мы еще не создали хранимые процедуры для запроса или изменения Suppliers таблицы, выберите параметр Создать хранимые процедуры, чтобы мастер создал их для нас и нажмите кнопку Далее.

Выберите параметр Create new stored procedures (Создать хранимые процедуры).

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

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

SELECT SupplierID, CompanyName, ContactName, ContactTitle
FROM Suppliers

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

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

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

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

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

Рис. 5. Переименование метода в GetDataGetSuppliers (щелкните для просмотра полноразмерного изображения)

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

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

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

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

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

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

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

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

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

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

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

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

Рис. 7. Столбец FullContactName помечен как Read-Only (щелкните для просмотра полноразмерного изображения)

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

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

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

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

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

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

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

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

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

Рис. 9. Имя хранимой процедуры Suppliers_SelectBySupplierID (щелкните для просмотра полноразмерного изображения)

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

Назовите методы 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, имеет protectedAdapter свойство , SuppliersBLLWithSprocs которое возвращает экземпляр класса вместе с двумя public методамиSuppliersTableAdapter: GetSuppliers и UpdateSupplier. Метод GetSuppliers вызывает и возвращает объект , SuppliersDataTable возвращаемый соответствующим GetSupplier методом в уровне доступа к данным. Метод UpdateSupplier извлекает сведения о конкретном поставщике, обновляемом с помощью вызова метода DAL s GetSupplierBySupplierID(supplierID) . Затем он обновляет CategoryNameсвойства , ContactNameи ContactTitle и фиксирует эти изменения в базе данных путем вызова метода уровня Update доступа к данным, передавая измененный SuppliersRow объект .

Примечание

SupplierID За исключением и CompanyName, все столбцы в таблице Поставщики разрешают NULL значения. Таким образом, если переданы contactName параметры или contactTitle , null необходимо задать для соответствующих ContactName свойств NULL и ContactTitle значение базы данных с помощью SetContactNameNull методов и SetContactTitleNull соответственно.

Шаг 7. Работа с вычисляемого столбца из уровня представления

После добавления вычисляемого столбца в таблицу Suppliers и соответствующего обновления DAL и BLL мы готовы создать ASP.NET страницу, которая работает с FullContactName вычисляемым столбцом. Начните с открытия ComputedColumns.aspx страницы в папке AdvancedDAL и перетащите GridView из панели элементов на Designer. Присвойте ID свойству GridView значение Suppliers и привяжите его из смарт-тега к новому объекту ObjectDataSource с именем SuppliersDataSource. Настройте ObjectDataSource для использования класса, SuppliersBLLWithSprocs добавленного на шаге 6, и нажмите кнопку Далее.

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

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

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

После завершения работы мастера настройки источника данных Visual Studio добавит BoundField для каждого возвращаемого поля данных. SupplierID Удалите BoundField и измените HeaderText свойства CompanyNameполей , ContactName, ContactTitleи FullContactName BoundFields на Company, Contact Name, Title и Full Contact Name соответственно. В смарт-теге проверка флажок Включить редактирование, чтобы включить встроенные возможности редактирования 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 столбец остается текстом. При добавлении BoundFields в GridView по завершении работы мастера настройки источника данных свойству FullContactName BoundField было ReadOnly присвоено значение true , так как для соответствующего FullContactName столбца в свойстве SuppliersDataTable задано ReadOnly значение true. Как отмечалось на шаге 4, свойству FullContactName s ReadOnly присвоено значение true , так как TableAdapter обнаружил, что столбец является вычисляемого столбца.

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

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

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

Примечание

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

Сводка

При определении схемы для таблицы microsoft SQL Server допускает включение вычисляемых столбцов. Это столбцы, значения которых вычисляются из выражения, которое обычно ссылается на значения из других столбцов в той же записи. Так как значения для вычисляемых столбцов основаны на выражении, они доступны только для чтения и не могут быть присвоены значения в операторе INSERT или UPDATE . Это создает проблемы при использовании вычисляемого столбца в запросе main TableAdapter, который пытается автоматически создать соответствующие INSERTинструкции , UPDATEи DELETE .

В этом руководстве мы рассмотрели методы обхода проблем, связанных с вычисляемыми столбцами. В частности, мы использовали хранимые процедуры в tableAdapter, чтобы преодолеть хрупкость, присущую TableAdapters, которые используют нерегламентированные инструкции SQL. Когда мастер TableAdapter создает новые хранимые процедуры, важно, чтобы запрос main изначально пропускал все вычисляемые столбцы, так как их наличие не позволяет создавать хранимые процедуры изменения данных. После первоначальной настройки TableAdapter его SelectCommand хранимую процедуру можно перенастроить, чтобы включить все вычисляемые столбцы.

Счастливого программирования!

Об авторе

Скотт Митчелл( Scott Mitchell), автор семи книг ASP/ASP.NET и основатель 4GuysFromRolla.com, работает с веб-технологиями Майкрософт с 1998 года. Скотт работает независимым консультантом, тренером и писателем. Его последняя книга Sams Teach Yourself ASP.NET 2.0 в 24 часах. Он может быть доступен в mitchell@4GuysFromRolla.com. или через его блог, который можно найти по адресу http://ScottOnWriting.NET.

Особая благодарность

Эта серия учебников была рассмотрена многими полезными рецензентами. Ведущим рецензентом этого руководства были Хилтон Geisenow и Тереса Мерфи. Хотите просмотреть предстоящие статьи MSDN? Если да, опустите мне строку на mitchell@4GuysFromRolla.com.