SqlDataSource 컨트롤을 사용하여 데이터 수정
업데이트: 2007년 11월
SqlDataSource 컨트롤을 사용하여 데이터베이스의 데이터를 수정할 수 있습니다. 업데이트 시나리오에서 SqlDataSource 컨트롤을 사용하는 가장 일반적인 방법은 GridView, DetailsView 또는 FormView와 같은 데이터 바인딩된 웹 서버 컨트롤을 사용하여 데이터를 가져오고 표시하는 것입니다. 데이터 바인딩된 컨트롤과 SqlDataSource를 사용하여 데이터를 업데이트합니다. 대부분의 데이터 바인딩된 컨트롤을 사용하면 삽입, 업데이트 및 삭제 작업을 지원하도록 컨트롤을 구성할 수 있으며 업데이트할 값을 데이터 소스 컨트롤에 전달할 수 있습니다. 그러면 데이터 소스 컨트롤에서 SQL 문 또는 저장 프로시저를 사용하여 데이터베이스에 업데이트된 값을 제출합니다.
SqlDataSource 컨트롤은 한 번에 레코드 하나씩 데이터를 업데이트하도록 되어 있습니다. 일괄 업데이트를 수행해야 할 경우에는 ASP.NET 응용 프로그램에서 명시적 반복 논리를 작성해야 합니다.
기본 사항
SqlDataSource 컨트롤을 사용하여 데이터베이스의 데이터를 수정하려면 최소한 다음과 같은 속성을 설정해야 합니다.
ProviderName 현재 작업 중인 데이터베이스를 나타내는 ADO.NET 공급자의 이름으로 설정합니다.
ConnectionString 데이터베이스에 사용되는 연결 문자열로 설정합니다.
SqlDataSource 명령 속성 데이터베이스의 데이터를 수정하는 SQL 문으로 설정합니다.
다음 단원에서는 이러한 속성에 대해 자세히 설명합니다.
공급자 이름
ProviderName 속성을 다음과 같이 데이터가 저장되는 데이터베이스 유형에 대한 ADO.NET 공급자의 이름으로 설정합니다.
Microsoft SQL Server로 작업하는 경우 ProviderName 속성을 "System.Data.SqlClient"로 설정합니다. 다른 공급자를 지정하지 않으면 이 값이 기본 공급자로 설정됩니다.
Oracle 데이터베이스로 작업하는 경우 ProviderName 속성을 "System.Data.OracleClient"로 설정합니다.
OLE DB 데이터 소스로 작업하는 경우 ProviderName 속성을 "System.Data.OleDb"로 설정합니다.
ODBC 데이터 소스로 작업하는 경우 ProviderName 속성을 "System.Data.Odbc"로 설정합니다.
연결 문자열
특정 데이터베이스에 연결하려면 ConnectionString 속성을 설정합니다. 응용 프로그램 구성 파일에서 ConnectionStrings 요소에 연결 문자열을 저장하는 것이 좋습니다. 그러면 컨트롤 태그에서 <%$ ConnectionStrings:connectionStringName %> 구문을 사용하여 저장된 연결 문자열을 참조할 수 있습니다. 연결 문자열은 지정된 ProviderName에 대해 유효한 연결 문자열이어야 합니다.
명령
SqlDataSource 컨트롤에는 InsertCommand, UpdateCommand 및 DeleteCommand라는 세 가지 명령 속성이 있습니다. 이러한 속성에는 데이터를 수정하는 SQL 문이 포함될 수 있습니다. 명령 속성을 SQL 문 또는 저장 프로시저 이름(데이터 소스에서 저장 프로시저를 지원하는 경우)으로 설정할 수 있습니다. SQL 문의 실제 구문은 데이터 스키마와 사용 중인 데이터베이스에 따라 달라집니다. 데이터 소스에서 지원하는 매개 변수를 SQL 문에 포함할 수 있습니다.
참고: |
---|
명령 속성에 대해 설정하는 문은 ADO.NET 데이터 조작 코드를 작성할 때 ADO.NET IDbCommand 개체의 CommandText 속성에 대해 설정하는 문과 같습니다. |
UpdateCommand 속성에 설정된 SQL 문은 Update 메서드가 호출될 때마다 실행됩니다. 사용자가 GridView, FormView 또는 DetailsView 컨트롤에서 업데이트 단추를 클릭하면 데이터 바인딩된 컨트롤이 Update 메서드를 암시적으로 호출합니다. 코드를 직접 작성하여 이 메서드를 명시적으로 호출할 수도 있습니다. SqlDataSource 컨트롤의 Insert 및 Delete 메서드도 비슷한 방식으로 동작합니다.
다음 코드 예제에서는 FormView 컨트롤을 사용하여 레코드를 삽입, 업데이트, 삭제하기 위해 SqlDataSource 컨트롤을 사용하는 방법을 보여 줍니다. SQL Server Northwind 데이터베이스에 샘플이 연결됩니다.
<%@ Page language="VB" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script >
Sub EmployeesGridView_OnSelectedIndexChanged(sender As Object, e As EventArgs)
EmployeeDetailsSqlDataSource.SelectParameters("EmpID").DefaultValue = _
EmployeesGridView.SelectedValue.ToString()
EmployeeFormView.DataBind()
End Sub
Sub EmployeeFormView_ItemUpdated(sender As Object, e As FormViewUpdatedEventArgs)
EmployeesGridView.DataBind()
End Sub
Sub EmployeeFormView_ItemDeleted(sender As Object, e As FormViewDeletedEventArgs)
EmployeesGridView.DataBind()
End Sub
Sub EmployeeDetailsSqlDataSource_OnInserted(sender As Object, e As SqlDataSourceStatusEventArgs)
Dim command As System.Data.Common.DbCommand = e.Command
EmployeeDetailsSqlDataSource.SelectParameters("EmpID").DefaultValue = _
command.Parameters("@EmpID").Value.ToString()
EmployeesGridView.DataBind()
EmployeeFormView.DataBind()
End Sub
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head >
<title>FormView Example</title>
</head>
<body>
<form id="form1" >
<h3>FormView Example</h3>
<table cellspacing="10">
<tr>
<td>
<asp:GridView ID="EmployeesGridView"
DataSourceID="EmployeesSqlDataSource"
AutoGenerateColumns="false"
DataKeyNames="EmployeeID"
OnSelectedIndexChanged="EmployeesGridView_OnSelectedIndexChanged"
RunAt="Server">
<HeaderStyle backcolor="Navy"
forecolor="White" />
<Columns>
<asp:ButtonField Text="Details..."
HeaderText="Show<BR>Details"
CommandName="Select"/>
<asp:BoundField DataField="EmployeeID" HeaderText="Employee ID"/>
<asp:BoundField DataField="LastName" HeaderText="Last Name"/>
<asp:BoundField DataField="FirstName" HeaderText="First Name"/>
</Columns>
</asp:GridView>
</td>
<td valign="top">
<asp:FormView ID="EmployeeFormView"
DataSourceID="EmployeeDetailsSqlDataSource"
DataKeyNames="EmployeeID"
Gridlines="Both"
OnItemUpdated="EmployeeFormView_ItemUpdated"
OnItemDeleted="EmployeeFormView_ItemDeleted"
RunAt="server">
<HeaderStyle backcolor="Navy"
forecolor="White"/>
<RowStyle backcolor="White"/>
<EditRowStyle backcolor="LightCyan"/>
<ItemTemplate>
<table>
<tr><td align="right"><b>Employee ID:</b></td><td><%# Eval("EmployeeID") %></td></tr>
<tr><td align="right"><b>First Name:</b></td> <td><%# Eval("FirstName") %></td></tr>
<tr><td align="right"><b>Last Name:</b></td> <td><%# Eval("LastName") %></td></tr>
<tr>
<td colspan="2">
<asp:LinkButton ID="EditButton"
Text="Edit"
CommandName="Edit"
RunAt="server"/>
<asp:LinkButton ID="NewButton"
Text="New"
CommandName="New"
RunAt="server"/>
<asp:LinkButton ID="DeleteButton"
Text="Delete"
CommandName="Delete"
RunAt="server"/>
</td>
</tr>
</table>
</ItemTemplate>
<EditItemTemplate>
<table>
<tr><td align="right"><b>Employee ID:</b></td><td><%# Eval("EmployeeID") %></td></tr>
<tr><td align="right"><b>First Name:</b></td>
<td><asp:TextBox ID="EditFirstNameTextBox"
Text='<%# Bind("FirstName") %>'
RunAt="Server" /></td></tr>
<tr><td align="right"><b>Last Name:</b></td>
<td><asp:TextBox ID="EditLastNameTextBox"
Text='<%# Bind("LastName") %>'
RunAt="Server" /></td></tr>
<tr>
<td colspan="2">
<asp:LinkButton ID="UpdateButton"
Text="Update"
CommandName="Update"
RunAt="server"/>
<asp:LinkButton ID="CancelUpdateButton"
Text="Cancel"
CommandName="Cancel"
RunAt="server"/>
</td>
</tr>
</table>
</EditItemTemplate>
<InsertItemTemplate>
<table>
<tr><td align="right"><b>First Name:</b></td>
<td><asp:TextBox ID="InsertFirstNameTextBox"
Text='<%# Bind("FirstName") %>'
RunAt="Server" /></td></tr>
<tr><td align="right"><b>Last Name:</b></td>
<td><asp:TextBox ID="InsertLastNameTextBox"
Text='<%# Bind("LastName") %>'
RunAt="Server" /></td></tr>
<tr>
<td colspan="2">
<asp:LinkButton ID="InsertButton"
Text="Insert"
CommandName="Insert"
RunAt="server"/>
<asp:LinkButton ID="CancelInsertButton"
Text="Cancel"
CommandName="Cancel"
RunAt="server"/>
</td>
</tr>
</table>
</InsertItemTemplate>
</asp:FormView>
</td>
</tr>
</table>
<asp:sqlDataSource ID="EmployeesSqlDataSource"
selectCommand="SELECT EmployeeID, FirstName, LastName FROM Employees"
connectionstring="<%$ ConnectionStrings:NorthwindConnection %>"
RunAt="server">
</asp:sqlDataSource>
<asp:sqlDataSource ID="EmployeeDetailsSqlDataSource"
SelectCommand="SELECT EmployeeID, LastName, FirstName FROM Employees WHERE EmployeeID = @EmpID"
InsertCommand="INSERT INTO Employees(LastName, FirstName) VALUES (@LastName, @FirstName);
SELECT @EmpID = SCOPE_IDENTITY()"
UpdateCommand="UPDATE Employees SET LastName=@LastName, FirstName=@FirstName
WHERE EmployeeID=@EmployeeID"
DeleteCommand="DELETE Employees WHERE EmployeeID=@EmployeeID"
ConnectionString="<%$ ConnectionStrings:NorthwindConnection %>"
OnInserted="EmployeeDetailsSqlDataSource_OnInserted"
RunAt="server">
<SelectParameters>
<asp:Parameter Name="EmpID" Type="Int32" DefaultValue="0" />
</SelectParameters>
<InsertParameters>
<asp:Parameter Name="EmpID" Direction="Output" Type="Int32" DefaultValue="0" />
</InsertParameters>
</asp:sqlDataSource>
</form>
</body>
</html>
<%@ Page language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script >
void EmployeesGridView_OnSelectedIndexChanged(Object sender, EventArgs e)
{
EmployeeDetailsSqlDataSource.SelectParameters["EmpID"].DefaultValue =
EmployeesGridView.SelectedValue.ToString();
EmployeeFormView.DataBind();
}
void EmployeeFormView_ItemUpdated(Object sender, FormViewUpdatedEventArgs e)
{
EmployeesGridView.DataBind();
}
void EmployeeFormView_ItemDeleted(Object sender, FormViewDeletedEventArgs e)
{
EmployeesGridView.DataBind();
}
void EmployeeDetailsSqlDataSource_OnInserted(Object sender, SqlDataSourceStatusEventArgs e)
{
System.Data.Common.DbCommand command = e.Command;
EmployeeDetailsSqlDataSource.SelectParameters["EmpID"].DefaultValue =
command.Parameters["@EmpID"].Value.ToString();
EmployeesGridView.DataBind();
EmployeeFormView.DataBind();
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head >
<title>FormView Example</title>
</head>
<body>
<form id="form1" >
<h3>FormView Example</h3>
<table cellspacing="10">
<tr>
<td>
<asp:GridView ID="EmployeesGridView"
DataSourceID="EmployeesSqlDataSource"
AutoGenerateColumns="false"
DataKeyNames="EmployeeID"
OnSelectedIndexChanged="EmployeesGridView_OnSelectedIndexChanged"
RunAt="Server">
<HeaderStyle backcolor="Navy"
forecolor="White" />
<Columns>
<asp:ButtonField Text="Details..."
HeaderText="Show<BR>Details"
CommandName="Select"/>
<asp:BoundField DataField="EmployeeID" HeaderText="Employee ID"/>
<asp:BoundField DataField="LastName" HeaderText="Last Name"/>
<asp:BoundField DataField="FirstName" HeaderText="First Name"/>
</Columns>
</asp:GridView>
</td>
<td valign="top">
<asp:FormView ID="EmployeeFormView"
DataSourceID="EmployeeDetailsSqlDataSource"
DataKeyNames="EmployeeID"
Gridlines="Both"
OnItemUpdated="EmployeeFormView_ItemUpdated"
OnItemDeleted="EmployeeFormView_ItemDeleted"
RunAt="server">
<HeaderStyle backcolor="Navy"
forecolor="White"/>
<RowStyle backcolor="White"/>
<EditRowStyle backcolor="LightCyan"/>
<ItemTemplate>
<table>
<tr><td align="right"><b>Employee ID:</b></td><td><%# Eval("EmployeeID") %></td></tr>
<tr><td align="right"><b>First Name:</b></td> <td><%# Eval("FirstName") %></td></tr>
<tr><td align="right"><b>Last Name:</b></td> <td><%# Eval("LastName") %></td></tr>
<tr>
<td colspan="2">
<asp:LinkButton ID="EditButton"
Text="Edit"
CommandName="Edit"
RunAt="server"/>
<asp:LinkButton ID="NewButton"
Text="New"
CommandName="New"
RunAt="server"/>
<asp:LinkButton ID="DeleteButton"
Text="Delete"
CommandName="Delete"
RunAt="server"/>
</td>
</tr>
</table>
</ItemTemplate>
<EditItemTemplate>
<table>
<tr><td align="right"><b>Employee ID:</b></td><td><%# Eval("EmployeeID") %></td></tr>
<tr><td align="right"><b>First Name:</b></td>
<td><asp:TextBox ID="EditFirstNameTextBox"
Text='<%# Bind("FirstName") %>'
RunAt="Server" /></td></tr>
<tr><td align="right"><b>Last Name:</b></td>
<td><asp:TextBox ID="EditLastNameTextBox"
Text='<%# Bind("LastName") %>'
RunAt="Server" /></td></tr>
<tr>
<td colspan="2">
<asp:LinkButton ID="UpdateButton"
Text="Update"
CommandName="Update"
RunAt="server"/>
<asp:LinkButton ID="CancelUpdateButton"
Text="Cancel"
CommandName="Cancel"
RunAt="server"/>
</td>
</tr>
</table>
</EditItemTemplate>
<InsertItemTemplate>
<table>
<tr><td align="right"><b>First Name:</b></td>
<td><asp:TextBox ID="InsertFirstNameTextBox"
Text='<%# Bind("FirstName") %>'
RunAt="Server" /></td></tr>
<tr><td align="right"><b>Last Name:</b></td>
<td><asp:TextBox ID="InsertLastNameTextBox"
Text='<%# Bind("LastName") %>'
RunAt="Server" /></td></tr>
<tr>
<td colspan="2">
<asp:LinkButton ID="InsertButton"
Text="Insert"
CommandName="Insert"
RunAt="server"/>
<asp:LinkButton ID="CancelInsertButton"
Text="Cancel"
CommandName="Cancel"
RunAt="server"/>
</td>
</tr>
</table>
</InsertItemTemplate>
</asp:FormView>
</td>
</tr>
</table>
<asp:sqlDataSource ID="EmployeesSqlDataSource"
selectCommand="SELECT EmployeeID, FirstName, LastName FROM Employees"
connectionstring="<%$ ConnectionStrings:NorthwindConnection %>"
RunAt="server">
</asp:sqlDataSource>
<asp:sqlDataSource ID="EmployeeDetailsSqlDataSource"
SelectCommand="SELECT EmployeeID, LastName, FirstName FROM Employees WHERE EmployeeID = @EmpID"
InsertCommand="INSERT INTO Employees(LastName, FirstName) VALUES (@LastName, @FirstName);
SELECT @EmpID = SCOPE_IDENTITY()"
UpdateCommand="UPDATE Employees SET LastName=@LastName, FirstName=@FirstName
WHERE EmployeeID=@EmployeeID"
DeleteCommand="DELETE Employees WHERE EmployeeID=@EmployeeID"
ConnectionString="<%$ ConnectionStrings:NorthwindConnection %>"
OnInserted="EmployeeDetailsSqlDataSource_OnInserted"
RunAt="server">
<SelectParameters>
<asp:Parameter Name="EmpID" Type="Int32" DefaultValue="0" />
</SelectParameters>
<InsertParameters>
<asp:Parameter Name="EmpID" Direction="Output" Type="Int32" DefaultValue="0" />
</InsertParameters>
</asp:sqlDataSource>
</form>
</body>
</html>
작업하고 있는 데이터베이스에서 저장 프로시저를 지원하는 경우 저장 프로시저의 이름이 명령이 될 수 있습니다. 저장 프로시저를 사용하여 데이터를 업데이트할 경우에는 UpdateCommandType 속성을 StoredProcedure로 설정해야 합니다.
매개 변수
매개 변수는 삽입, 업데이트 및 삭제 작업에 대한 값을 데이터 소스에 전달하는 데 사용됩니다. 매개 변수 이름과 값은 컨트롤에 바인딩된 데이터 필드 또는 명시적으로 정의되는 매개 변수 개체를 기반으로 합니다. 데이터 바인딩된 컨트롤의 매개 변수에는 데이터 작업에 대한 값과 바인딩 컨트롤의 DataKeyNames 속성에 정의된 대로 특정 행을 식별하는 키 값이 모두 포함됩니다.
명시적 Parameter 정의를 만들어 매개 변수 순서, 매개 변수 형식, 매개 변수 방향 및 컨트롤에 바인딩된 필드를 기반으로 하는 컨트롤 이외의 추가 매개 변수를 지정할 수 있습니다. 자동 증가 기본 키 또는 날짜/시간 스탬프 등 데이터 소스에서 자동으로 생성하는 값을 반환하는 출력 매개 변수를 예로 들 수 있습니다.
참고: |
---|
SQL 문에서 명명된 매개 변수를 지원하지 않고 대신 '?' 자리 표시자를 사용하여 매개 변수를 지정하는 System.Data.OleDb 및 System.Data.Odbc 공급자로 작업하는 경우 매개 변수를 명시적으로 지정하는 것이 특히 중요합니다. 이러한 경우에는 관련된 SQL 문에 지정된 순서대로 매개 변수를 정의해야 합니다. |
매개 변수를 사용하는 데 대한 자세한 내용과 예제를 보려면 SqlDataSource 컨트롤에 매개 변수 사용 및 데이터 소스 컨트롤에서 데이터 바인딩된 필드에 대해 매개 변수가 생성되는 방식을 참조하십시오.
이벤트
SqlDataSource 컨트롤은 삽입, 업데이트 또는 삭제 작업이 수행되기 전/후에 코드를 실행하기 위해 처리할 수 있는 이벤트를 발생시킵니다.
SqlDataSource 컨트롤은 해당하는 명령 속성에 대한 SQL 문을 실행하기 전에 Inserting, Updating 또는 Deleting 이벤트를 발생시킵니다. 이러한 이벤트에 대한 처리기를 추가하여 SQL 문을 실행하기 전에 이 문의 매개 변수를 조작하고 다시 정렬하거나 유효성을 검사할 수 있으며 명령을 취소할 수도 있습니다. 예를 들어 SqlDataSource 컨트롤과 함께 QueryStringParameter를 사용하는 경우 업데이트를 수행하기 전에 매개 변수 값의 유효성을 검사하도록 Updating 이벤트를 처리할 수도 있습니다. 기본적으로 QueryStringParameter에서는 쿼리 문자열 변수의 값을 사용하고 유효성을 검사하지 않은 상태로 데이터베이스에 값을 제출합니다. 이 때 허용되지 않는 값이면 이벤트의 SqlDataSourceCommandEventArgs 개체에 대한 Cancel 속성을 true로 설정하여 업데이트를 취소할 수 있습니다.
SqlDataSource 컨트롤은 데이터베이스 작업이 완료된 후에 Inserted, Updated 또는 Deleted 이벤트를 발생시킵니다. 이러한 이벤트를 처리하여 데이터베이스 작업 중에 예외가 throw되었는지 여부와 데이터베이스 작업의 영향을 받은 레코드 수를 확인하거나 데이터베이스 작업을 통해 반환되는 출력 값을 검토할 수 있습니다.
예를 들어 다음 코드 예제에서는 Updating 및 Updated 이벤트를 사용하여 트랜잭션 내에서 UpdateCommand를 실행합니다.
<%@Page Language="VB" %>
<%@Import Namespace="System.Data" %>
<%@Import Namespace="System.Data.Common" %>
<%@Import Namespace="System.Diagnostics" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script >
Sub On_Click(ByVal source As Object, ByVal e As EventArgs)
SqlDataSource1.Update()
End Sub 'On_Click
Sub On_Sql_Updating(ByVal source As Object, ByVal e As SqlDataSourceCommandEventArgs)
Dim command as DbCommand
Dim connection as DbConnection
Dim transaction as DbTransaction
command = e.Command
connection = command.Connection
connection.Open()
transaction = connection.BeginTransaction()
command.Transaction = transaction
End Sub 'On_Sql_Updating
Sub On_Sql_Updated(ByVal source As Object, ByVal e As SqlDataSourceStatusEventArgs)
Dim command As DbCommand
Dim transaction As DbTransaction
command = e.Command
transaction = command.Transaction
' In this code example the OtherProcessSucceeded variable represents
' the outcome of some other process that occurs whenever the data is
' updated, and must succeed for the data change to be committed. For
' simplicity, we set this value to true.
Dim OtherProcessSucceeded as Boolean = True
If (OtherProcessSucceeded) Then
transaction.Commit()
Label2.Text="The record was updated successfully!"
Else
transaction.Rollback()
Label2.Text="The record was not updated."
End If
End Sub ' On_Sql_Updated
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head >
<title>ASP.NET Example</title>
</head>
<body>
<form id="form1" >
<asp:SqlDataSource
id="SqlDataSource1"
ConnectionString="<%$ ConnectionStrings:MyNorthwind%>"
SelectCommand="SELECT EmployeeID, LastName, Address FROM Employees"
UpdateCommand="UPDATE Employees SET Address=@Address WHERE EmployeeID=@EmployeeID"
OnUpdating="On_Sql_Updating"
OnUpdated ="On_Sql_Updated">
<UpdateParameters>
<asp:ControlParameter Name="Address" ControlId="TextBox1" PropertyName="Text"/>
<asp:ControlParameter Name="EmployeeID" ControlId="DropDownList1" PropertyName="SelectedValue"/>
</UpdateParameters>
</asp:SqlDataSource>
<asp:DropDownList
id="DropDownList1"
DataTextField="LastName"
DataValueField="EmployeeID"
DataSourceID="SqlDataSource1">
</asp:DropDownList>
<br />
<asp:Label id="Label1" Text="Enter a new address for the selected user."
AssociatedControlID="TextBox1" />
<asp:TextBox id="TextBox1" />
<asp:Button id="Submit" Text="Submit" OnClick="On_Click" />
<br /><asp:Label id="Label2" Text="" />
</form>
</body>
</html>
<%@Page Language="C#" %>
<%@Import Namespace="System.Data" %>
<%@Import Namespace="System.Data.Common" %>
<%@Import Namespace="System.Data.SqlClient" %>
<%@Import Namespace="System.Diagnostics" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script >
private void On_Click(Object source, EventArgs e) {
SqlDataSource1.Update();
}
private void OnSqlUpdating(Object source, SqlDataSourceCommandEventArgs e) {
DbCommand command = e.Command;
DbConnection cx = command.Connection;
cx.Open();
DbTransaction tx = cx.BeginTransaction();
command.Transaction = tx;
}
private void OnSqlUpdated(Object source, SqlDataSourceStatusEventArgs e) {
DbCommand command = e.Command;
DbTransaction tx = command.Transaction;
// In this code example the OtherProcessSucceeded variable represents
// the outcome of some other process that occurs whenever the data is
// updated, and must succeed for the data change to be committed. For
// simplicity, we set this value to true.
bool OtherProcessSucceeded = true;
if (OtherProcessSucceeded) {
tx.Commit();
Label2.Text="The record was updated successfully!";
}
else {
tx.Rollback();
Label2.Text="The record was not updated.";
}
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head >
<title>ASP.NET Example</title>
</head>
<body>
<form id="form1" >
<asp:SqlDataSource
id="SqlDataSource1"
ConnectionString="<%$ ConnectionStrings:MyNorthwind%>"
SelectCommand="SELECT EmployeeID, LastName, Address FROM Employees"
UpdateCommand="UPDATE Employees SET Address=@Address WHERE EmployeeID=@EmployeeID"
OnUpdating="OnSqlUpdating"
OnUpdated ="OnSqlUpdated">
<UpdateParameters>
<asp:ControlParameter Name="Address" ControlId="TextBox1" PropertyName="Text"/>
<asp:ControlParameter Name="EmployeeID" ControlId="DropDownList1" PropertyName="SelectedValue"/>
</UpdateParameters>
</asp:SqlDataSource>
<asp:DropDownList
id="DropDownList1"
DataTextField="LastName"
DataValueField="EmployeeID"
DataSourceID="SqlDataSource1">
</asp:DropDownList>
<br />
<asp:Label id="Label1" Text="Enter a new address for the selected user."
AssociatedControlID="TextBox1" />
<asp:TextBox id="TextBox1" />
<asp:Button id="Submit" Text="Submit" OnClick="On_Click" />
<br /><asp:Label id="Label2" Text="" />
</form>
</body>
</html>
<%@Page Language="VJ#" %>
<%@Import Namespace="System.Data" %>
<%@Import Namespace="System.Data.Common" %>
<%@Import Namespace="System.Diagnostics" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script >
private void On_Click(Object source, System.EventArgs e)
{
try {
SqlDataSource1.Update();
}
catch (System.Exception except) {
// Handle Exception
}
Label2.set_Text("The record was updated successfully!");
} //On_Click
private void OnSqlUpdate(Object source, SqlDataSourceCommandEventArgs e)
{
// Log the command in the Event Log on the Web server.
String logInfo = e.get_Command().get_CommandText()
+ " is being submitted to the database.";
IEnumerator ie = e.get_Command().get_Parameters().GetEnumerator();
while (ie.MoveNext()) {
DbParameter param = ((DbParameter)(ie.get_Current()));
logInfo = logInfo + " " + param.get_ParameterName()+ "="
+ param.get_Value();
}
EventLog log = new EventLog();
log.set_Log("Application");
log.set_Source("ASP.NET Example");
log.WriteEntry(logInfo);
} //OnSqlUpdate
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head >
<title>ASP.NET Example</title>
</head>
<body>
<form id="form1" >
<asp:SqlDataSource
id="SqlDataSource1"
ConnectionString="Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;"
SelectCommand="SELECT EmployeeID, LastName, Address FROM Employees"
UpdateCommand="UPDATE Employees SET Address=@Address WHERE EmployeeID=@EmployeeID"
OnUpdating="OnSqlUpdate">
<UpdateParameters>
<asp:ControlParameter Name="Address" ControlId="TextBox1" PropertyName="Text"/>
<asp:ControlParameter Name="EmployeeID" ControlId="DropDownList1" PropertyName="SelectedValue"/>
</UpdateParameters>
</asp:SqlDataSource>
<asp:DropDownList
id="DropDownList1"
DataTextField="LastName"
DataValueField="EmployeeID"
DataSourceID="SqlDataSource1">
</asp:DropDownList>
<br />
<asp:Label id="Label1" Text="Enter a new address for the selected user."
AssociatedControlID="TextBox1" />
<asp:TextBox id="TextBox1" />
<asp:Button id="Submit" Text="Submit" OnClick="On_Click" />
<br /><asp:Label id="Label2" Text="" />
</form>
</body>
</html>
충돌 감지
SqlDataSource 컨트롤에서는 낙관적 동시성을 사용하여 업데이트 및 삭제 작업을 수행할 수 있습니다. 낙관적 동시성은 여러 사용자가 동시에 데이터를 조작하는 시나리오에서 데이터 소스의 변경 내용이 손실되지 않도록 보호하는 데이터베이스 전략입니다. SqlDataSource 컨트롤은 ConflictDetection 속성을 사용하여 업데이트 및 삭제 작업을 수행할 때 사용할 낙관적 동시성 검사 수준을 확인합니다.
기본적으로 ConflictDetection 속성은 ConflictOptions.OverwriteChanges로 설정됩니다. 이렇게 하면 업데이트 작업 시 다른 소스에서 레코드를 수정했는지 여부를 확인하지 않고 레코드의 기존 값을 덮어씁니다. 이를 "최신 작성자 우선(last writer wins)" 시나리오라고도 합니다.
ConflictDetection 속성을 ConflictOptions.CompareAllValues로 설정하여 업데이트 또는 삭제 명령을 실행하는 동안 SqlDataSource 컨트롤에 원래 값이 모두 포함되도록 할 수 있습니다. 이렇게 하면 데이터베이스의 현재 데이터와 데이터베이스에서 처음에 읽은 데이터가 일치하지 않는 경우 업데이트 작업이 수행되지 않는 방식으로 SQL 문을 작성할 수 있습니다. 예제를 보려면 낙관적 동시성(ADO.NET)을 참조하십시오. Updated 이벤트를 처리하여 업데이트 작업의 영향을 받는 레코드 수를 확인할 수 있습니다. 동시성 위반이 발생한 경우에는 레코드가 업데이트되지 않습니다.