Работа с вычисляемыми столбцами (C#)
При создании таблицы базы данных 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 INSERT
UPDATE
автоматически создаются после завершения работы мастера настройки 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. Хотя в этом экземпляре работает или 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 см. в технической документации. Кроме того, проверка пошаговое руководство по созданию вычисляемых столбцов в разделе Практическое руководство. Указание вычисляемых столбцов.
Примечание
По умолчанию вычисляемые столбцы физически не хранятся в таблице, а пересчитываются каждый раз, когда на них ссылаются в запросе. Установив флажок Is Persisted , вы можете указать SQL Server физически сохранить вычисляемый столбец в таблице. Это позволяет создать индекс в вычисляемом столбце, что может повысить производительность запросов, использующих значение вычисляемого столбца в своих WHERE
предложениях. Дополнительные сведения см. в разделе Создание индексов для вычисляемых столбцов .
Шаг 2. Просмотр значений вычисляемых столбцов
Прежде чем приступить к работе над уровнем доступа к данным, давайте уйдем минуту, чтобы просмотреть FullContactName
значения. В Обозреватель сервера щелкните правой кнопкой мыши Suppliers
имя таблицы и выберите в контекстном меню пункт Создать запрос. Откроется окно Запрос, в которое будет предложено выбрать таблицы для включения в запрос. Добавьте таблицу Suppliers
и нажмите кнопку Закрыть. Затем проверка столбцы CompanyName
, ContactName
, ContactTitle
и FullContactName
из таблицы Поставщики. Наконец, щелкните красный восклицательный знак на панели инструментов, чтобы выполнить запрос и просмотреть результаты.
Как показано на рисунке 2, результаты включают в себя FullContactName
, в котором перечислены CompanyName
столбцы , ContactName
и ContactTitle
в формате ldquo;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 InsertCommand
UpdateCommand
, эти настройки будут потеряны при каждом повторном запуске мастера настройки 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
таблицы, выберите параметр Создать хранимые процедуры, чтобы мастер создал их для нас и нажмите кнопку Далее.
Рис. 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. Переименование метода в GetData
GetSuppliers
(щелкните для просмотра полноразмерного изображения)
После нажатия кнопки Готово мастер создаст четыре хранимые процедуры и добавит 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
и добавьте следующий код:
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using NorthwindWithSprocsTableAdapters;
[System.ComponentModel.DataObject]
public class SuppliersBLLWithSprocs
{
private SuppliersTableAdapter _suppliersAdapter = null;
protected SuppliersTableAdapter Adapter
{
get
{
if (_suppliersAdapter == null)
_suppliersAdapter = new SuppliersTableAdapter();
return _suppliersAdapter;
}
}
[System.ComponentModel.DataObjectMethodAttribute
(System.ComponentModel.DataObjectMethodType.Select, true)]
public NorthwindWithSprocs.SuppliersDataTable GetSuppliers()
{
return Adapter.GetSuppliers();
}
[System.ComponentModel.DataObjectMethodAttribute
(System.ComponentModel.DataObjectMethodType.Update, true)]
public bool UpdateSupplier(string companyName, string contactName,
string contactTitle, int supplierID)
{
NorthwindWithSprocs.SuppliersDataTable suppliers =
Adapter.GetSupplierBySupplierID(supplierID);
if (suppliers.Count == 0)
// no matching record found, return false
return false;
NorthwindWithSprocs.SuppliersRow supplier = suppliers[0];
supplier.CompanyName = companyName;
if (contactName == null)
supplier.SetContactNameNull();
else
supplier.ContactName = contactName;
if (contactTitle == null)
supplier.SetContactTitleNull();
else
supplier.ContactTitle = contactTitle;
// Update the product record
int rowsAffected = Adapter.Update(supplier);
// Return true if precisely one row was updated, otherwise false
return rowsAffected == 1;
}
}
Как и другие классы BLL, имеет protected
Adapter
свойство , SuppliersBLLWithSprocs
которое возвращает экземпляр класса вместе с двумя 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, и нажмите кнопку Далее.
Рис. 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 как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по