ObjectDataSource.InsertMethod Właściwość
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Pobiera lub ustawia nazwę metody lub funkcji wywoływanej ObjectDataSource przez kontrolkę w celu wstawiania danych.
public:
property System::String ^ InsertMethod { System::String ^ get(); void set(System::String ^ value); };
public string InsertMethod { get; set; }
member this.InsertMethod : string with get, set
Public Property InsertMethod As String
Wartość właściwości
Ciąg reprezentujący nazwę metody lub funkcji używanej ObjectDataSource do wstawiania danych. Wartością domyślną jest ciąg pusty ("").
Przykłady
Ten rozdział zawiera dwa przykłady kodu. W pierwszym przykładzie kodu pokazano, jak używać ObjectDataSource obiektu z obiektem biznesowym i kontrolką DetailsView do wstawiania danych. Drugi przykład kodu zawiera przykład obiektu biznesowego warstwy środkowej, który jest używany w pierwszym przykładzie kodu.
W poniższym przykładzie kodu pokazano, jak używać kontrolki ObjectDataSource z obiektem biznesowym i kontrolką DetailsView do wstawiania danych. Początkowo wyświetla DetailsView nowy NorthwindEmployee
rekord wraz z automatycznie wygenerowanym przyciskiem Wstaw . Po wprowadzeniu danych do pól kontrolki DetailsView kliknij przycisk Wstaw . Właściwość InsertMethod określa, która metoda wykonuje operację wstawiania.
W tym przykładzie UpdateEmployeeInfo
metoda jest używana do wstawiania, jednak wymaga NorthwindEmployee
parametru do wstawienia danych. Z tego powodu kolekcja ciągów, które DetailsView kontrolka przekazuje automatycznie, nie jest wystarczająca. Delegat NorthwindEmployeeInserting
jest obiektem ObjectDataSourceMethodEventHandler , który obsługuje Inserting zdarzenie i umożliwia manipulowanie parametrami wejściowymi przed kontynuowaniem Insert operacji. UpdateEmployeeInfo
Ponieważ metoda wymaga NorthwindEmployee
obiektu jako parametru, jest tworzony przy użyciu kolekcji ciągów i jest dodawany do InputParameters kolekcji przy użyciu nazwy parametru (ne
), której oczekuje metoda. Możesz wykonać takie kroki podczas używania istniejącego obiektu warstwy środkowej jako źródła danych z typami i metodami, które nie są przeznaczone specjalnie do użycia z kontrolką ObjectDataSource .
Po wykonaniu Insert operacji wywoływana jest metoda, która jest identyfikowana przez InsertMethod właściwość. Insert
Jeśli metoda obiektu ma sygnaturę metody zawierającą parametry, InsertParameters kolekcja musi zawierać parametr z nazwami, które pasują do parametrów Insert podpisu metody, aby metoda zakończyła się pomyślnie.
<%@ Register TagPrefix="aspSample" Namespace="Samples.AspNet.CS" Assembly="Samples.AspNet.CS" %>
<%@ Import namespace="Samples.AspNet.CS" %>
<%@ Page language="c#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
private void NorthwindEmployeeInserting(object source, ObjectDataSourceMethodEventArgs e)
{
// The business object expects a custom type. Build it
// and add it to the parameters collection.
IDictionary paramsFromPage = e.InputParameters;
NorthwindEmployee ne = new NorthwindEmployee();
ne.FirstName = paramsFromPage["FirstName"].ToString();
ne.LastName = paramsFromPage["LastName"].ToString();
ne.Title = paramsFromPage["Title"].ToString();
ne.Courtesy = paramsFromPage["Courtesy"].ToString();
ne.Supervisor = Int32.Parse(paramsFromPage["Supervisor"].ToString());
paramsFromPage.Clear();
paramsFromPage.Add("ne", ne);
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<title>ObjectDataSource - C# Example</title>
</head>
<body>
<form id="Form1" method="post" runat="server">
<asp:detailsview
id="DetailsView1"
runat="server"
autogenerateinsertbutton="True"
datasourceid="ObjectDataSource1">
</asp:detailsview>
<asp:objectdatasource
id="ObjectDataSource1"
runat="server"
selectmethod="GetEmployee"
insertmethod="UpdateEmployeeInfo"
oninserting="NorthwindEmployeeInserting"
typename="Samples.AspNet.CS.EmployeeLogic"
>
<selectparameters>
<asp:parameter name="anID" defaultvalue="-1" />
</selectparameters>
</asp:objectdatasource>
</form>
</body>
</html>
<%@ Register TagPrefix="aspSample" Namespace="Samples.AspNet.VB" Assembly="Samples.AspNet.VB" %>
<%@ Import namespace="Samples.AspNet.VB" %>
<%@ Page language="vb" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
Private Sub NorthwindEmployeeInserting(source As Object, e As ObjectDataSourceMethodEventArgs)
' The GridView control passes an array of strings in the parameters
' collection because that is the type it knows how to work with.
' However, the business object expects a custom type. Build it
' and add it to the parameters collection.
Dim paramsFromPage As IDictionary = e.InputParameters
Dim ne As New NorthwindEmployee()
ne.FirstName = paramsFromPage("FirstName").ToString()
ne.LastName = paramsFromPage("LastName").ToString()
ne.Title = paramsFromPage("Title").ToString()
ne.Courtesy = paramsFromPage("Courtesy").ToString()
ne.Supervisor = Int32.Parse(paramsFromPage("Supervisor").ToString())
paramsFromPage.Clear()
paramsFromPage.Add("ne", ne)
End Sub ' NorthwindEmployeeInserting
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<title>ObjectDataSource - VB Example</title>
</head>
<body>
<form id="Form1" method="post" runat="server">
<asp:detailsview
id="DetailsView1"
runat="server"
autogenerateinsertbutton="True"
datasourceid="ObjectDataSource1">
</asp:detailsview>
<asp:objectdatasource
id="ObjectDataSource1"
runat="server"
selectmethod="GetEmployee"
insertmethod="UpdateEmployeeInfo"
oninserting="NorthwindEmployeeInserting"
typename="Samples.AspNet.VB.EmployeeLogic" >
<selectparameters>
<asp:parameter name="anID" defaultvalue="-1" />
</selectparameters>
</asp:objectdatasource>
</form>
</body>
</html>
Poniższy przykład kodu zawiera przykład obiektu biznesowego warstwy środkowej używanego w poprzednim przykładzie kodu. Przykładowy kod składa się z dwóch podstawowych klas:
Klasa
EmployeeLogic
, która jest klasą bezstanową, która hermetyzuje logikę biznesową.Klasa
NorthwindEmployee
, która jest klasą modelu, która zawiera tylko podstawowe funkcje wymagane do załadowania i utrwalania danych z warstwy danych.
Dodatkowa NorthwindDataException
klasa jest dostarczana jako wygoda. Aby uzyskać pełny przykład pracy, należy skompilować i użyć tych klas. Metoda UpdateEmployeeInfo
nie jest całkowicie zaimplementowana, więc nie wstawiasz danych do bazy danych Northwind Traders podczas eksperymentowania z tym przykładem.
namespace Samples.AspNet.CS {
using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Web.UI;
using System.Web.UI.WebControls;
//
// EmployeeLogic is a stateless business object that encapsulates
// the operations you can perform on a NorthwindEmployee object.
//
public class EmployeeLogic {
// Returns a collection of NorthwindEmployee objects.
public static ICollection GetAllEmployees () {
ArrayList al = new ArrayList();
ConnectionStringSettings cts = ConfigurationManager.ConnectionStrings["NorthwindConnection"];
SqlDataSource sds
= new SqlDataSource(cts.ConnectionString,
"SELECT EmployeeID FROM Employees");
try {
IEnumerable IDs = sds.Select(DataSourceSelectArguments.Empty);
// Iterate through the Enumeration and create a
// NorthwindEmployee object for each ID.
IEnumerator enumerator = IDs.GetEnumerator();
while (enumerator.MoveNext()) {
// The IEnumerable contains DataRowView objects.
DataRowView row = enumerator.Current as DataRowView;
string id = row["EmployeeID"].ToString();
NorthwindEmployee nwe = new NorthwindEmployee(id);
// Add the NorthwindEmployee object to the collection.
al.Add(nwe);
}
}
finally {
// If anything strange happens, clean up.
sds.Dispose();
}
return al;
}
public static NorthwindEmployee GetEmployee(object anID) {
if (anID.Equals("-1") ||
anID.Equals(DBNull.Value) ) {
return new NorthwindEmployee();
}
else {
return new NorthwindEmployee(anID);
}
}
public static void UpdateEmployeeInfo(NorthwindEmployee ne) {
bool retval = ne.Save();
if (! retval) { throw new NorthwindDataException("UpdateEmployee failed."); }
}
public static void DeleteEmployee(NorthwindEmployee ne) {
bool retval = ne.Delete();
if (! retval) { throw new NorthwindDataException("DeleteEmployee failed."); }
}
// And so on...
}
public class NorthwindEmployee {
public NorthwindEmployee () {
ID = DBNull.Value;
lastName = "";
firstName = "";
title="";
titleOfCourtesy = "";
reportsTo = -1;
}
public NorthwindEmployee (object anID) {
this.ID = anID;
SqlConnection conn
= new SqlConnection (ConfigurationManager.ConnectionStrings["NorthwindConnection"].ConnectionString);
SqlCommand sc =
new SqlCommand(" SELECT FirstName,LastName,Title,TitleOfCourtesy,ReportsTo " +
" FROM Employees " +
" WHERE EmployeeID = @empId",
conn);
// Add the employee ID parameter and set its value.
sc.Parameters.Add(new SqlParameter("@empId",SqlDbType.Int)).Value = Int32.Parse(anID.ToString());
SqlDataReader sdr = null;
try {
conn.Open();
sdr = sc.ExecuteReader();
// Only loop once.
if (sdr != null && sdr.Read()) {
// The IEnumerable contains DataRowView objects.
this.firstName = sdr["FirstName"].ToString();
this.lastName = sdr["LastName"].ToString();
this.title = sdr["Title"].ToString();
this.titleOfCourtesy = sdr["TitleOfCourtesy"].ToString();
if (! sdr.IsDBNull(4)) {
this.reportsTo = sdr.GetInt32(4);
}
}
else {
throw new NorthwindDataException("Data not loaded for employee id.");
}
}
finally {
try {
if (sdr != null) sdr.Close();
conn.Close();
}
catch (SqlException) {
// Log an event in the Application Event Log.
throw;
}
}
}
private object ID;
public string EmpID {
get { return ID.ToString(); }
}
private string lastName;
public string LastName {
get { return lastName; }
set { lastName = value; }
}
private string firstName;
public string FirstName {
get { return firstName; }
set { firstName = value; }
}
public string FullName {
get { return FirstName + " " + LastName; }
}
private string title;
public String Title {
get { return title; }
set { title = value; }
}
private string titleOfCourtesy;
public string Courtesy {
get { return titleOfCourtesy; }
set { titleOfCourtesy = value; }
}
private int reportsTo;
public int Supervisor {
get { return reportsTo; }
set { reportsTo = value; }
}
public bool Save () {
// Implement persistence logic.
return true;
}
public bool Delete () {
// Implement delete logic.
return true;
}
}
internal class NorthwindDataException: Exception {
public NorthwindDataException(string msg) : base (msg) { }
}
}
Imports System.Collections
Imports System.Configuration
Imports System.Data
Imports System.Data.SqlClient
Imports System.Web.UI
Imports System.Web.UI.WebControls
Namespace Samples.AspNet.VB
'
' EmployeeLogic is a stateless business object that encapsulates
' the operations you can perform on a NorthwindEmployee object.
'
Public Class EmployeeLogic
' Returns a collection of NorthwindEmployee objects.
Public Shared Function GetAllEmployees() As ICollection
Dim al As New ArrayList()
Dim cts As ConnectionStringSettings = ConfigurationManager.ConnectionStrings("NorthwindConnection")
Dim sds As New SqlDataSource(cts.ConnectionString, "SELECT EmployeeID FROM Employees")
Try
Dim IDs As IEnumerable = sds.Select(DataSourceSelectArguments.Empty)
' Iterate through the Enumeration and create a
' NorthwindEmployee object for each ID.
Dim enumerator As IEnumerator = IDs.GetEnumerator()
While enumerator.MoveNext()
' The IEnumerable contains DataRowView objects.
Dim row As DataRowView = CType(enumerator.Current,DataRowView)
Dim id As String = row("EmployeeID").ToString()
Dim nwe As New NorthwindEmployee(id)
' Add the NorthwindEmployee object to the collection.
al.Add(nwe)
End While
Finally
' If anything strange happens, clean up.
sds.Dispose()
End Try
Return al
End Function 'GetAllEmployees
Public Shared Function GetEmployee(anID As Object) As NorthwindEmployee
If anID.Equals("-1") OrElse anID.Equals(DBNull.Value) Then
Return New NorthwindEmployee()
Else
Return New NorthwindEmployee(anID)
End If
End Function 'GetEmployee
Public Shared Sub UpdateEmployeeInfo(ne As NorthwindEmployee)
Dim retval As Boolean = ne.Save()
If Not retval Then
Throw New NorthwindDataException("UpdateEmployee failed.")
End If
End Sub
Public Shared Sub DeleteEmployee(ne As NorthwindEmployee)
Dim retval As Boolean = ne.Delete()
If Not retval Then
Throw New NorthwindDataException("DeleteEmployee failed.")
End If
End Sub
' And so on...
End Class
Public Class NorthwindEmployee
Public Sub New()
ID = DBNull.Value
lastName = ""
firstName = ""
title = ""
titleOfCourtesy = ""
reportsTo = - 1
End Sub
Public Sub New(anID As Object)
Me.ID = anID
Dim cts As ConnectionStringSettings = ConfigurationManager.ConnectionStrings("NorthwindConnection")
Dim conn As New SqlConnection(cts.ConnectionString)
Dim sc As New SqlCommand(" SELECT FirstName,LastName,Title,TitleOfCourtesy,ReportsTo " & _
" FROM Employees " & _
" WHERE EmployeeID = @empId", conn)
' Add the employee ID parameter and set its value.
sc.Parameters.Add(New SqlParameter("@empId", SqlDbType.Int)).Value = Int32.Parse(anID.ToString())
Dim sdr As SqlDataReader = Nothing
Try
conn.Open()
sdr = sc.ExecuteReader()
' Only loop once.
If Not (sdr Is Nothing) AndAlso sdr.Read() Then
' The IEnumerable contains DataRowView objects.
Me.aFirstName = sdr("FirstName").ToString()
Me.aLastName = sdr("LastName").ToString()
Me.aTitle = sdr("Title").ToString()
Me.titleOfCourtesy = sdr("TitleOfCourtesy").ToString()
If Not sdr.IsDBNull(4) Then
Me.reportsTo = sdr.GetInt32(4)
End If
Else
Throw New NorthwindDataException("Data not loaded for employee id.")
End If
Finally
Try
If Not (sdr Is Nothing) Then
sdr.Close()
End If
conn.Close()
Catch se As SqlException
' Log an event in the Application Event Log.
Throw
End Try
End Try
End Sub
Private ID As Object
Public ReadOnly Property EmpID() As String
Get
Return ID.ToString()
End Get
End Property
Private aLastName As String
Public Property LastName() As String
Get
Return aLastName
End Get
Set
aLastName = value
End Set
End Property
Private aFirstName As String
Public Property FirstName() As String
Get
Return aFirstName
End Get
Set
aFirstName = value
End Set
End Property
Public ReadOnly Property FullName() As String
Get
Return FirstName & " " & LastName
End Get
End Property
Private aTitle As String
Public Property Title() As String
Get
Return aTitle
End Get
Set
aTitle = value
End Set
End Property
Private titleOfCourtesy As String
Public Property Courtesy() As String
Get
Return titleOfCourtesy
End Get
Set
titleOfCourtesy = value
End Set
End Property
Private reportsTo As Integer
Public Property Supervisor() As Integer
Get
Return reportsTo
End Get
Set
reportsTo = value
End Set
End Property
Public Function Save() As Boolean
' Implement persistence logic.
Return True
End Function 'Save
Public Function Delete() As Boolean
' Implement delete logic.
Return True
End Function 'Delete
End Class
Friend Class NorthwindDataException
Inherits Exception
Public Sub New(msg As String)
MyBase.New(msg)
End Sub
End Class
End Namespace
Uwagi
Zakłada się, że obiekt biznesowy wstawia dane jeden rekord naraz, a nie w partii.
Właściwość InsertMethod deleguje do InsertMethod właściwości obiektu skojarzonego ObjectDataSourceView z obiektem ObjectDataSource .
Okres istnienia obiektu
Metoda, która jest identyfikowana przez InsertMethod właściwość, może być metodą wystąpienia lub static
(Shared
w Visual Basic). Jeśli jest to metoda wystąpienia, obiekt biznesowy jest tworzony i niszczony za każdym razem, gdy metoda określona przez InsertMethod właściwość jest wywoływana. Zdarzenia i ObjectCreating można obsługiwać ObjectCreated do pracy z obiektem biznesowym przed wywołaniem InsertMethod właściwości . Można również obsłużyć ObjectDisposing zdarzenie, które jest wywoływane po wywołaniu metody określonej przez DeleteMethod właściwość. Jeśli obiekt biznesowy implementuje IDisposable interfejs, Dispose metoda jest wywoływana przed zniszczeniem obiektu. Jeśli metoda to static
(Shared
w Visual Basic), obiekt biznesowy nigdy nie jest tworzony i nie można obsłużyć ObjectCreatedzdarzeń , i .ObjectDisposingObjectCreating
Scalanie parametrów
Parametry są dodawane do kolekcji InsertParameters z trzech źródeł:
Z kontrolki powiązanej z danymi w czasie wykonywania.
InsertParameters
Z elementu deklaratywnie.Inserting
Z metody programowo.
Najpierw wszystkie parametry generowane na podstawie kontrolek powiązanych z danymi są dodawane do kolekcji InsertParameters . Jeśli na przykład kontrolka ObjectDataSource jest powiązana z kontrolką zawierającą GridView kolumny Name
i , parametry i Number
Name
Number
są dodawane do kolekcji. Typ danych tych parametrów to string
. Następnie zostaną dodane parametry wymienione w InsertParameters
elemecie . Jeśli parametr w InsertParameters
elemecie zostanie znaleziony o takiej samej nazwie jak parametr, który znajduje się już w InsertParameters kolekcji, istniejący parametr zostanie zmodyfikowany tak, aby był zgodny z parametrem określonym w InsertParameters
elemecie . Zazwyczaj jest to używane do modyfikowania typu danych w parametrze . Na koniec można programowo dodać i usunąć parametry w Inserting zdarzeniu, które występuje przed uruchomieniem Insert metody. Metoda jest rozpoznawana po scaleniu parametrów. Rozwiązanie metody zostało omówione w następnej sekcji.
Ważne
Należy zweryfikować dowolną wartość parametru otrzymaną od klienta. Środowisko uruchomieniowe po prostu zastępuje wartość parametru InsertMethod do właściwości .
Rozwiązanie metody
Po wywołaniu Insert metody pola danych z kontrolki powiązanej z danymi, parametry utworzone deklaratywnie w InsertParameters
elemecie i parametry dodane w procedurze Inserting obsługi zdarzeń są scalane. (Aby uzyskać więcej informacji, zobacz poprzednią sekcję). Następnie ObjectDataSource obiekt próbuje znaleźć metodę do wywołania. Najpierw wyszukuje co najmniej jedną metodę o nazwie określonej we InsertMethod właściwości. Jeśli nie zostanie znalezione dopasowanie, InvalidOperationException zostanie zgłoszony wyjątek. Jeśli zostanie znalezione dopasowanie, szuka pasujących nazw parametrów. Załóżmy na przykład, że typ określony przez TypeName właściwość ma dwie metody o nazwie InsertARecord
. Jeden z nich InsertARecord
ma jeden parametr , ID
a drugi InsertARecord
ma dwa parametry Name
i Number
. InsertParameters Jeśli kolekcja ma tylko jeden parametr o nazwie ID
, InsertARecord
metoda z tylko parametrem jest wywoływanaID
. Typ parametru nie jest sprawdzany podczas rozpoznawania metod. Kolejność parametrów nie ma znaczenia.
DataObjectTypeName Jeśli właściwość jest ustawiona, metoda jest rozpoznawana w inny sposób. Szuka ObjectDataSource metody o nazwie określonej we InsertMethod właściwości, która przyjmuje jeden parametr typu określonego DataObjectTypeName we właściwości. W takim przypadku nazwa parametru nie ma znaczenia.
Dotyczy
Zobacz też
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla