Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
При создании таблицы базы данных Microsoft SQL Server позволяет определить вычисляемый столбец, значение которого вычисляется из выражения, которое обычно ссылается на другие значения в той же записи базы данных. Такие значения доступны только для чтения в базе данных, что требует особых соображений при работе с TableAdapters. В этом руководстве мы узнаем, как выполнить задачи, связанные с вычисляемыми столбцами.
Введение
Microsoft SQL Server позволяет использовать вычисляемые столбцы, значения которых вычисляются из выражения, которое обычно ссылается на значения других столбцов в той же таблице. Например, модель данных отслеживания времени может иметь таблицу ServiceLog с именами столбцов, включая ServicePerformed, EmployeeIDRateиDuration, среди прочего. Хотя сумма к оплате за каждый элемент услуги (тариф умножается на длительность) может вычисляться с помощью веб-страницы или другого программного средства, возможно, удобно включить столбец в ServiceLog таблицу с именем AmountDue, который отображает эту информацию. Этот столбец может быть создан как обычный столбец, но его нужно будет обновлять каждый раз, когда значения столбцов Rate или Duration изменяются. Лучше всего преобразовать AmountDue столбец в вычисляемый с использованием выражения Rate * Duration. Это приведет к тому, что SQL Server автоматически вычисляет AmountDue значение столбца всякий раз, когда он был указан в запросе.
Так как вычисляемое значение столбца определяется выражением, такие столбцы доступны только для чтения и поэтому не могут иметь значения, назначенные им в INSERT или UPDATE инструкциях. Однако если вычисляемые столбцы являются частью основного запроса tableAdapter, использующего инструкции AD-hoc SQL, они автоматически включаются в автоматически созданные INSERT и UPDATE инструкции. Следовательно, необходимо обновить свойства TableAdapter INSERT и UPDATE и запросы InsertCommand и UpdateCommand, чтобы удалить ссылки на любые вычисляемые столбцы.
Одной из проблем использования вычисляемых столбцов с TableAdapter, который использует нерегламентированные инструкции SQL, заключается в том, что запросы TableAdapter 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 см. в разделе SQL CASE Statements.
Примечание.
Вместо использования инструкции 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 столбцы в формате ContactName (ContactTitle, CompanyName).
Рис. 2. Использует FullContactName формат ContactName (ContactTitle, CompanyName) (щелкните, чтобы просмотреть изображение полного размера)
Шаг 3. Добавление SuppliersTableAdapter в уровень доступа к данным
Для работы с сведениями о поставщике в нашем приложении необходимо сначала создать TableAdapter и DataTable в нашем DAL. В идеале это будет сделано с помощью одних и того же простого шага, рассмотренного в предыдущих руководствах. Однако работа с вычисляемыми столбцами включает несколько сложностей, которые заслуживают обсуждения.
Если вы используете TableAdapter, использующего инструкции AD-hoc SQL, можно просто включить вычисляемый столбец в основной запрос TableAdapter с помощью мастера настройки TableAdapter. Однако это приведет к автоматическому созданию операторов INSERT и UPDATE, включающих вычисляемый столбец. При попытке выполнить один из этих методов будет выброшено исключение с сообщением SqlException: "Невозможно изменить столбец ColumnName, так как он является вычисляемым столбцом или результатом оператора UNION".
INSERT Хотя инструкцию UPDATE можно вручную настроить с помощью свойств InsertCommandUpdateCommand TableAdapter, эти настройки будут потеряны каждый раз, когда мастер настройки TableAdapter запускается заново.
Из-за хрупкости TableAdapters, использующих нерегламентированные инструкции SQL, рекомендуется использовать хранимые процедуры при работе с вычисляемыми столбцами. Если вы используете существующие хранимые процедуры, просто настройте TableAdapter, как это описано в руководстве По использованию существующих хранимых процедур для TableAdapters.Typed DataSet's. Если мастер TableAdapter создает для вас хранимые процедуры, важно изначально исключить вычисляемые столбцы из основного запроса. Если вы включите вычисляемый столбец в основной запрос, мастер конфигурации TableAdapter по завершении сообщит вам, что не может создать соответствующие хранимые процедуры. Короче говоря, сначала необходимо настроить TableAdapter с помощью основного запроса без вычисляемых столбцов, а затем вручную обновить соответствующую хранимую процедуру и TableAdapter SelectCommand, чтобы включить вычисляемый столбец. Этот подход аналогичен тому, который используется в
В этом руководстве мы добавим новый 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_UpdateSuppliers_Delete, как показано на рисунке 4.
Рис. 4. Настройка имен автоматически созданных хранимых процедур (щелкните, чтобы просмотреть изображение полного размера)
Следующий шаг мастера позволяет назвать методы TableAdapter и указать шаблоны, используемые для доступа к данным и обновления данных. Оставьте все три флажка установленными, но переименуйте метод GetData в GetSuppliers. Чтобы завершить работу мастера, нажмите Готово.
Рис. 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, чтобы распространить изменения в базу данных. Чтобы выполнить этот первый шаг - извлечение из DAL записи, которая обновляется, необходимо сначала добавить метод в DAL.
Щелкните правой кнопкой мыши SuppliersTableAdapter в конструкторе DataSet и выберите параметр "Добавить запрос" в контекстном меню. Как мы сделали на шаге 3, позвольте мастеру создать новую хранимую процедуру для нас, выбрав параметр "Создать новую хранимую процедуру" (см. рисунок 3 для снимка экрана этого шага мастера). Так как этот метод вернет запись с несколькими столбцами, укажите, что мы хотим использовать SQL-запрос, который возвращает строки и нажмите кнопку "Далее".
Рис. 8. Выберите параметр SELECT, возвращающий строки (щелкните, чтобы просмотреть изображение полного размера)
Следующий шаг просит указать запрос, который будет использоваться для этого метода. Введите следующее, которое возвращает те же поля данных, что и основной запрос, но для конкретного поставщика.
SELECT SupplierID, CompanyName, ContactName, ContactTitle, FullContactName
FROM Suppliers
WHERE SupplierID = @SupplierID
На следующем экране появится запрос на имя хранимой процедуры, которая будет создана автоматически. Назовите эту хранимую процедуру Suppliers_SelectBySupplierID и нажмите кнопку "Далее".
Рис. 9. Назовите хранимую процедуру Suppliers_SelectBySupplierID (щелкните, чтобы просмотреть изображение полного размера)
Наконец, мастер запросит у нас шаблоны доступа к данным и имена методов для использования в TableAdapter. Оставьте оба флажка отмеченными, но переименуйте методы FillBy и GetDataBy в 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
SuppliersBLLWithSprocs как и другие классы BLL, имеет ProtectedAdapter свойство, которое возвращает экземпляр класса SuppliersTableAdapter вместе с двумя методами: Public, GetSuppliers и UpdateSupplier. Метод GetSuppliers вызывает соответствующий метод GetSupplier на уровне доступа к данным и возвращает SuppliersDataTable, который был получен. Метод UpdateSupplier получает сведения о конкретном поставщике, обновляемом посредством вызова метода GetSupplierBySupplierID(supplierID) DAL. Затем он обновляет свойства CategoryName, ContactName и ContactTitle, и фиксирует эти изменения в базе данных путем вызова метода Update уровня доступа к данным, передавая измененный объект SuppliersRow.
Примечание.
За исключением SupplierID и CompanyName, все столбцы в таблице "Поставщики" допускают значения NULL. Таким образом, если переданные параметры contactName или contactTitle равны Nothing, мы должны установить соответствующие свойства ContactName и ContactTitle в значение базы данных NULL с использованием методов SetContactNameNull и SetContactTitleNull соответственно.
Шаг 7: Работа с вычисляемым столбцом на уровне представления
С помощью вычисляемого столбца, добавленного в таблицу Suppliers, и когда DAL и BLL обновлены соответствующим образом, мы готовы создать страницу ASP.NET, использующую столбец FullContactName. Начните с открытия ComputedColumns.aspx страницы в AdvancedDAL папке и перетащите GridView из Панели инструментов в Редактор. Установите для свойства ID элемента GridView значение Suppliers, затем из его смарт-тега выполните привязку к новому объекту ObjectDataSource с именем SuppliersDataSource. Настройте ObjectDataSource для использования класса SuppliersBLLWithSprocs, который мы добавили на шаге 6, и нажмите "Далее".
Рис. 11. Настройка ObjectDataSource для использования SuppliersBLLWithSprocs класса (щелкните, чтобы просмотреть изображение полного размера)
В классе определены только два метода: SuppliersBLLWithSprocs и 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 после завершения мастера настройки источника данных, свойство BoundField FullContactName было установлено в True, поскольку соответствующий столбец FullContactName в SuppliersDataTable имеет свое свойство ReadOnly установлено в True. Как отмечалось на шаге 4, свойство s FullContactName было установлено на True, так как TableAdapter обнаружил, что столбец является вычисляемым столбцом.
Рис. 13. Столбец FullContactName не редактируется (щелкните, чтобы просмотреть изображение полного размера)
Перейдите вперед и обновите значение одного или нескольких редактируемых столбцов и нажмите кнопку "Обновить". Обратите внимание, как FullContactName значение s автоматически обновляется, чтобы отразить изменение.
Примечание.
GridView в настоящее время использует BoundFields для редактируемых полей, что приводит к интерфейсу редактирования по умолчанию.
CompanyName Так как поле является обязательным, оно должно быть преобразовано в TemplateField, включающий RequiredFieldValidator. Я оставляю это в качестве упражнения для заинтересованного читателя.
Обратитесь к руководству по добавлению элементов управления проверки в интерфейсы редактирования и вставки, чтобы найти пошаговые инструкции по преобразованию BoundField в TemplateField и добавлению элементов управления проверки.
Итоги
При определении схемы таблицы Microsoft SQL Server позволяет включать вычисляемые столбцы. Это столбцы, значения которых вычисляются из выражения, которое обычно ссылается на значения из других столбцов в той же записи. Так как значения вычисляемых столбцов основаны на выражении, они доступны только для чтения и не могут им быть присвоено значение в операторе INSERT или UPDATE. Это приводит к проблемам при использовании вычисляемого столбца в основном запросе TableAdapter, который пытается автоматически создавать соответствующие INSERT, UPDATE операторы и DELETE инструкции.
В этом руководстве мы рассмотрели методы обхода проблем, связанных с вычисляемыми столбцами. В частности, мы использовали хранимые процедуры в TableAdapter для преодоления хрупкости, присущей TableAdapter, использующим нерегламентированные инструкции SQL. При создании новых хранимых процедур мастер TableAdapter важно, чтобы основной запрос изначально опустил вычисляемые столбцы, так как их присутствие предотвращает создание хранимых процедур изменения данных. После первоначальной настройки TableAdapter ее SelectCommand хранимая процедура может быть перенастроена, чтобы включить все вычисляемые столбцы.
Счастливое программирование!
Об авторе
Скотт Митчелл, автор семи книг ASP/ASP.NET и основатель 4GuysFromRolla.com, работает с технологиями Microsoft Web с 1998 года. Скотт работает независимым консультантом, тренером и писателем. Его последняя книга
Особое спасибо кому
Эта серия учебников была проверена многими полезными рецензентами. Основные рецензенты для этого руководства были Хилтон Гейзеноу и Тереза Мерфи. Хотите просмотреть мои предстоящие статьи MSDN? Если да, напишите мне на mitchell@4GuysFromRolla.com.