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


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

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

Загрузить 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 . Следовательно, необходимо обновить запросы и свойства TableAdapterINSERT, а также InsertCommand свойства и UpdateCommand , чтобы удалить ссылки на все вычисляемые столбцы.UPDATE

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

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

Приступим к работе!

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

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

Начните с открытия Suppliers определения таблицы, щелкнув правой кнопкой мыши таблицу Suppliers в Обозреватель Server и выбрав в контекстном меню пункт Открыть определение таблицы. Будут отображены столбцы таблицы и их свойства, такие как тип данных, разрешены 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, в противном случае возвращает значение 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 см. в технической документации. Кроме того, проверка пошаговое руководство по созданию вычисляемых столбцов в разделе Практическое руководство. Указание вычисляемых столбцов.

Примечание

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

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

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

Как показано на рисунке 2, результаты включают FullContactName, в котором перечислены CompanyNameстолбцы , ContactNameи ContactTitle в формате 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 Столбец ColumnName , так как это вычисляемый столбец или результат оператора UNION. Хотя инструкцию INSERT и UPDATE можно вручную настроить с помощью свойств и UpdateCommand TableAdapterInsertCommand, эти настройки будут потеряны при каждом повторном запуске мастера настройки TableAdapter.

Из-за хрупкости TableAdapters, использующих нерегламентированные инструкции SQL, рекомендуется использовать хранимые процедуры при работе с вычисляемых столбцов. Если вы используете существующие хранимые процедуры, просто настройте TableAdapter, как описано в руководстве Использование существующих хранимых процедур для typed DataSet s TableAdapters . Если у вас есть мастер TableAdapter, создайте хранимые процедуры, важно сначала исключить вычисляемые столбцы из запроса main. Если вы включите вычисляемый столбец в запрос main, мастер настройки TableAdapter сообщит вам по завершении, что он не может создать соответствующие хранимые процедуры. Короче говоря, сначала необходимо настроить TableAdapter с помощью вычисляемого запроса main, а затем вручную обновить соответствующую хранимую процедуру и tableAdapter, SelectCommand чтобы включить вычисляемый столбец. Этот подход аналогичен тому, который использовалсяв руководствеПо обновлению tableAdapter для использованияJOIN.

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

Начните с NorthwindWithSprocs открытия DataSet в папке ~/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. Переименование метода GetSuppliers в GetData (щелкните для просмотра полноразмерного изображения)

После нажатия кнопки Готово мастер создаст четыре хранимые процедуры и добавит 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 и добавьте следующий код:

Imports NorthwindWithSprocsTableAdapters
<System.ComponentModel.DataObject()> _
Public Class SuppliersBLLWithSprocs
    Private _suppliersAdapter As SuppliersTableAdapter = Nothing
    Protected ReadOnly Property Adapter() As SuppliersTableAdapter
        Get
            If _suppliersAdapter Is Nothing Then
                _suppliersAdapter = New SuppliersTableAdapter()
            End If
            Return _suppliersAdapter
        End Get
    End Property
    <System.ComponentModel.DataObjectMethodAttribute _
        (System.ComponentModel.DataObjectMethodType.Select, True)> _
    Public Function GetSuppliers() As NorthwindWithSprocs.SuppliersDataTable
        Return Adapter.GetSuppliers()
    End Function
    <System.ComponentModel.DataObjectMethodAttribute _
        (System.ComponentModel.DataObjectMethodType.Update, True)> _
    Public Function UpdateSupplier(companyName As String, contactName As String, _
        contactTitle As String, supplierID As Integer) As Boolean
        Dim suppliers As NorthwindWithSprocs.SuppliersDataTable = _
            Adapter.GetSupplierBySupplierID(supplierID)
        If suppliers.Count = 0 Then
            ' no matching record found, return false
            Return False
        End If
        Dim supplier As NorthwindWithSprocs.SuppliersRow = suppliers(0)
        supplier.CompanyName = companyName
        If contactName Is Nothing Then 
            supplier.SetContactNameNull() 
        Else 
            supplier.ContactName = contactName
        End If
        If contactTitle Is Nothing Then 
            supplier.SetContactTitleNull() 
        Else 
            supplier.ContactTitle = contactTitle
        End If
        ' Update the product record
        Dim rowsAffected As Integer = Adapter.Update(supplier)
        ' Return true if precisely one row was updated, otherwise false
        Return rowsAffected = 1
    End Function
End Class

Как и другие классы 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 , Nothing необходимо задать для соответствующих 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.