Настройка операций с помощью хранимых процедур (LINQ to SQL)
Обновлен: November 2007
Использование хранимых процедур является наиболее распространенным методом переопределения поведения по умолчанию. В примерах данного раздела показано, как можно использовать созданные оболочки методов для хранимых процедур и непосредственно вызывать хранимые процедуры.
При использовании Visual Studio назначение хранимых процедур для настройки операций вставки, обновления и удаления можно выполнять с помощью Сред. Объектно-реляционный конструктор .
Примечание. |
---|
Чтобы считать значения, созданные базой данных, используются выходные параметры хранимых процедур. Если использовать выходные параметры невозможно, то вместо применения переопределений, созданных конструктором Сред. Объектно-реляционный конструктор, реализуйте разделяемый метод. После успешного завершения операций INSERT или UPDATE необходимо установить соответствующие значения членов, сопоставленных значениям, созданным базой данных. Дополнительные сведения см. в разделе Обязанности разработчика при переопределении поведения по умолчанию (LINQ to SQL). |
Пример
Описание
В следующем примере предполагается, что класс Northwind содержит два метода для вызова хранимых процедур, используемых для переопределений в производном классе.
Код
<[Function]()> _
Public Function CustomerOrders( _
<Parameter(Name:="CustomerID", DbType:="NChar(5)")> ByVal _
customerID As String) As IEnumerable(Of Order)
Dim result As IExecuteResult = Me.ExecuteMethodCall(Me, _
(CType(MethodInfo.GetCurrentMethod(), MethodInfo)), _
customerID)
Return CType(result.ReturnValue, IEnumerable(Of Order))
End Function
<[Function]()> _
Public Function CustomerById( _
<Parameter(Name:="CustomerID", DbType:="NChar(5)")> ByVal _
customerID As String) As IEnumerable(Of Customer)
Dim result As IExecuteResult = Me.ExecuteMethodCall(Me, _
CType(MethodInfo.GetCurrentMethod(), MethodInfo), _
customerID)
Return CType(result.ReturnValue, IEnumerable(Of Customer))
End Function
[Function()]
public IEnumerable<Order> CustomerOrders(
[Parameter(Name = "CustomerID", DbType = "NChar(5)")]
string customerID)
{
IExecuteResult result = this.ExecuteMethodCall(this,
((MethodInfo)(MethodInfo.GetCurrentMethod())),
customerID);
return ((IEnumerable<Order>)(result.ReturnValue));
}
[Function()]
public IEnumerable<Customer> CustomerById(
[Parameter(Name = "CustomerID", DbType = "NChar(5)")]
string customerID)
{
IExecuteResult result = this.ExecuteMethodCall(this,
((MethodInfo)(MethodInfo.GetCurrentMethod())),
customerID);
return (IEnumerable<Customer>)(result.ReturnValue);
}
Пример
Описание
Следующий класс использует эти методы для переопределения.
Код
Public Class NorthwindThroughSprocs : Inherits Northwnd
Sub New()
MyBase.New("")
End Sub
' Override loading of Customer.Orders by using method wrapper.
Private Function LoadOrders(ByVal customer As Customer) As _
IEnumerable(Of Order)
Return Me.CustomerOrders(customer.CustomerID)
End Function
' Override loading of Order.Customer by using method wrapper.
Private Function LoadCustomer(ByVal order As Order) As Customer
Return Me.CustomerById(order.CustomerID).Single()
End Function
' Override INSERT operation on Customer by calling the
' stored procedure directly.
Private Sub InsertCustomer(ByVal customer As Customer)
' Call the INSERT stored procedure directly.
Me.ExecuteCommand("exec sp_insert_customer …")
End Sub
' The UPDATE override works similarly, that is, by
' calling the stored procedure directly.
Private Sub UpdateCustomer(ByVal original As Customer, ByVal _
current As Customer)
' Call the UPDATE stored procedure by using current
' and original values.
Me.ExecuteCommand("exec sp_update_customer …")
End Sub
' The DELETE override works similarly.
Private Sub DeleteCustomer(ByVal customer As Customer)
' Call the DELETE stored procedure directly.
Me.ExecuteCommand("exec sp_delete_customer …")
End Sub
End Class
public class NorthwindThroughSprocs : Northwnd
{
public NorthwindThroughSprocs(string connection) :
base(connection)
{
}
// Override loading of Customer.Orders by using method wrapper.
private IEnumerable<Order> LoadOrders(Customer customer)
{
return this.CustomerOrders(customer.CustomerID);
}
// Override loading of Order.Customer by using method wrapper.
private Customer LoadCustomer(Order order)
{
return this.CustomerById(order.CustomerID).Single();
}
// Override INSERT operation on Customer by calling the
// stored procedure directly.
private void InsertCustomer(Customer customer)
{
// Call the INSERT stored procedure directly.
this.ExecuteCommand("exec sp_insert_customer …");
}
// The UPDATE override works similarly, that is, by
// calling the stored procedure directly.
private void UpdateCustomer(Customer original, Customer current)
{
// Call the UPDATE stored procedure by using current
// and original values.
this.ExecuteCommand("exec sp_update_customer …");
}
// The DELETE override works similarly.
private void DeleteCustomer(Customer customer)
{
// Call the DELETE stored procedure directly.
this.ExecuteCommand("exec sp_delete_customer …");
}
}
Пример
Описание
Класс NorthwindThroughSprocs можно использовать точно так же, как класс Northwnd.
Код
Dim db As New NorthwindThroughSprocs()
Dim custQuery = From cust In db.Customers _
Where cust.City = "London" _
Select cust
For Each custObj In custQuery
' Deferred loading of cust.Orders uses the override LoadOrders.
For Each ord In custObj.Orders
' ...
' Make some changes to customers/orders.
' Overrides for Customer are called during the execution
' of the following:
db.SubmitChanges()
Next
Next
NorthwindThroughSprocs db = new NorthwindThroughSprocs("");
var custQuery =
from cust in db.Customers
where cust.City == "London"
select cust;
foreach (Customer custObj in custQuery)
// deferred loading of cust.Orders uses the override LoadOrders.
foreach (Order ord in custObj.Orders)
// ...
// Make some changes to customers/orders.
// Overrides for Customer are called during the execution of the
// following:
db.SubmitChanges();
См. также
Основные понятия
Обязанности разработчика при переопределении поведения по умолчанию (LINQ to SQL)