Работа с вычисляемыми столбцами (VB)
При создании таблицы базы данных 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 INSERT
UPDATE
автоматически создаются повторно при завершении работы мастера настройки 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. Хотя в этом экземпляре будет работать или 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, использующий нерегламентированные инструкции 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
таблицы, выберите параметр Создать новые хранимые процедуры, чтобы мастер создал их для нас и нажмите кнопку Далее.
Рис. 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 и указать шаблоны, используемые для доступа к данным и их обновления. Оставьте все три флажка флажком, но переименуйте метод в GetData
GetSuppliers
. Чтобы завершить работу мастера, нажмите кнопку Готово.
Рис. 5. Переименование метода GetSuppliers
в GetData
(щелкните для просмотра полноразмерного изображения)
После нажатия кнопки Готово мастер создаст четыре хранимые процедуры и добавит TableAdapter и соответствующую таблицу DataTable в типизированный набор данных.
Шаг 4. Включение вычисляемого столбца в основной запрос TableAdapter
Теперь нам нужно обновить TableAdapter и DataTable, созданные на шаге FullContactName
3, чтобы включить вычисляемый столбец. Данное действие состоит из следующих шагов:
- Обновление хранимой
Suppliers_Select
процедуры для возврата вычисляемогоFullContactName
столбца; - Обновление DataTable для включения соответствующего
FullContactName
столбца.
Начните с перехода к Обозреватель сервера и детализации в папке Хранимые процедуры. Откройте хранимую Suppliers_Select
процедуру и обновите SELECT
запрос, включив FullContactName
вычисляемый столбец:
SELECT SupplierID, CompanyName, ContactName, ContactTitle, FullContactName
FROM Suppliers
Сохраните изменения в хранимой процедуре, щелкнув значок Сохранить на панели инструментов, нажав клавиши CTRL+S или выбрав команду Сохранить Suppliers_Select
в меню Файл.
Затем вернитесь к Designer DataSet, щелкните правой кнопкой мыши SuppliersTableAdapter
элемент и выберите в контекстном меню пункт Настроить. Обратите внимание, что Suppliers_Select
столбец теперь включает FullContactName
столбец в коллекцию Столбцы данных.
Рис. 6. Запуск мастера настройки TableAdapter для обновления столбцов DataTable (щелкните для просмотра полноразмерного изображения)
Чтобы завершить работу мастера, нажмите кнопку Готово. Это автоматически добавит соответствующий столбец в SuppliersDataTable
. Мастер TableAdapter достаточно умен, чтобы определить, что FullContactName
столбец является вычисляемого столбца и, следовательно, доступен только для чтения. Следовательно, свойство столбца задает ReadOnly
значение true
. Чтобы проверить это, выберите столбец из SuppliersDataTable
и перейдите к окно свойств (см. рис. 7). Обратите внимание, что FullContactName
свойства столбцов DataType
и MaxLength
также задаются соответствующим образом.
Рис. 7. Столбец FullContactName
помечен как Read-Only (щелкните для просмотра полноразмерного изображения)
Шаг 5. ДобавлениеGetSupplierBySupplierID
метода в TableAdapter
Для работы с этим руководством мы создадим страницу ASP.NET, которая отображает поставщиков в обновляемой сетке. В предыдущих руководствах мы обновляли одну запись из уровня бизнес-логики, извлекая определенную запись из DAL в виде строго типизированной таблицы DataTable, обновляя ее свойства, а затем отправляя обновленную таблицы Данных обратно в DAL для распространения изменений в базе данных. Чтобы выполнить этот первый шаг ( получение обновляемой записи из DAL), необходимо сначала добавить GetSupplierBySupplierID(supplierID)
метод в DAL.
Щелкните правой SuppliersTableAdapter
кнопкой мыши в конструкторе наборов данных и выберите в контекстном меню пункт Добавить запрос. Как и в шаге 3, позвольте мастеру создать новую хранимую процедуру для нас, выбрав параметр Создать новую хранимую процедуру (см. снимок экрана этого шага мастера на рисунке 3). Так как этот метод возвращает запись с несколькими столбцами, укажите, что мы хотим использовать SQL-запрос SELECT, который возвращает строки, и нажмите кнопку Далее.
Рис. 8. Выбор параметра SELECT, возвращающего строки (щелкните для просмотра полноразмерного изображения)
На следующем шаге нам будет предложено использовать запрос для этого метода. Введите следующий код, который возвращает те же поля данных, что и запрос main, но для конкретного поставщика.
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
Как и другие классы BLL, имеет Protected
Adapter
свойство , 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, и нажмите кнопку Далее.
Рис. 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 обнаружил, что столбец является вычисляемого столбца.
Рис. 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.
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по