Modificando dados usando o controle SqlDataSource
Você pode usar o controle SqlDataSource para modificar dados em um banco de dados.A maneira mais comum de usar o controle SqlDataSource em cenários de atualização é recuperar dados e exibí-los usando um controle de servidor Web vinculado a dados, como um controle GridView, DetailsView ou FormView.Você configura o controle vinculado a dados e o SqlDataSource para atualizar os dados.A maioria dos controles ligados a dados permitem que você os configure para oferecer suporte a operações de inserir, atualizar e excluir, e eles passam os valores a serem atualizados para o controle da fonte de dados.O controle da fonte de dados, em seguida, envia os valores atualizados para o banco de dados usando uma instrução SQL ou procedimento armazenado.
O controle SqlDataSource é criado para atualizar dados um registro por vez.Caso você precise executar atualizações em lotes, você deve escrever lógica loop explícita em seu aplicativo ASP.NET.
O básico
Para modificar dados em um banco de dados usando o controle SqlDataSource, você precisa definir pelo menos as seguintes propriedades:
ProviderName Defina como o nome do provedor ADO.NET que representa o banco de dados com que você está trabalhando.
ConnectionString Defina como um sequência de conexão que funciona para seu banco de dados.
Propriedades de comando SqlDataSource Defina para instruções SQL que modifiquem dados no banco de dados.
As seções a seguir descrevem essas propriedades com mais detalhes.
Nome do provedor
Defina a propriedade ProviderName para nome do provedor ADO.NET para o tipo de banco de dados no qual os dados estão armazenados, que pode incluir o seguinte:
Se você estiver trabalhando com Microsoft SQL Server, defina a propriedade ProviderName como "System.Data.SqlClient".É o provedor padrão se você não especificar um título diferente.
Se você estiver trabalhando com um banco de dados Oracle, defina a propriedade ProviderName como "System.Data.OracleClient".
Se você estiver trabalhando com uma fonte de dados OLE DB, defina a propriedade ProviderName como "System.Data.OleDb".
Se você estiver trabalhando com uma fonte de dados ODBC, defina a propriedade ProviderName como "System.Data.Odbc".
Sequência de conexão
Defina a propriedade ConnectionString para se conectar a um determinado banco de dados.É recomendável que você armazene sequências de conexão no elemento ConnectionStrings no arquivo de configuração do aplicativo.Você pode fazer referência às sequências de conexão armazenados usando a sintaxe <%$ ConnectionStrings:connectionStringName %> na marcação de controle.A sequência de conexão deve ser uma sequência de conexão válido para o ProviderName especificado.
Comandos
The SqlDataSource controle tem três propriedades de comando que podem conter instruções SQL que modificam dados: the InsertCommand, UpdateCommand, e DeleteCommand Propriedades. As propriedades de comando podem ser definidas para uma instrução SQL ou o nome de uma procedimento armazenado se sua fonte de dados oferecer suporte para os procedimentos armazenados.A sintaxe real da instrução SQL depende do esquema de seus dados e do banco de dados você está usando.A instrução pode incluir parâmetros se a fonte de dados os suporta.
Observação: |
---|
A instrução que você definir para a propriedade de comando é a mesma instrução que você define para a propriedade CommandText de um objeto IDbCommand ADO.NET ao escrever código de manipulação de dados ADO.NET. |
A instrução SQL na propriedade UpdateCommand é executado sempre que o método Update é chamado.O método Update é chamado implicitamente pelos controles ligados a dados quando um usuário clica em um botão Atualizar em um controle GridView, FormView ou DetailsView.Você também pode chamar este método explicitamente do seu próprio código.Os métodos Insert e Delete do controle SqlDataSource funcionam da mesma forma.
O exemplo de código a seguir mostra como você pode usar um controle SqlDataSource para inserir, atualizar e excluir registros utilizando um controle FormView.O exemplo conecta ao banco de dados Northwind SQL Server.
<%@ 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>
O comando pode ser o nome de um procedimento armazenado se o banco de dados que você estiver trabalhando suporta procedimentos armazenados.Se você usar procedimentos armazenados para atualizar os dados, você deve definir a propriedade UpdateCommandType como StoredProcedure.
Parâmetros
Parâmetros são usados para enviar valores para inserir, atualizar e excluir operações para a fonte de dados.Nomes de parâmetros e valores são baseados em campos de dados acoplados a um controle ou opcionalmente em objetos de parâmetros que você definir explicitamente.Parâmetros de um controle vinculado a dados incluem os dois valores para a operação de dados e para valores chave para identificar uma linha específica, conforme definido pela propriedade DataKeyNames do controle acoplado.
Você pode criar definições explícitas Parameter para especificar ordem de parâmetro, tipo de parâmetro, e direção de parâmetro, bem como parâmetros adicionais diferentes daqueles com base nos campos acoplados a um controle.Um exemplo disso deve ser um parâmetro de saída que retorna um valor gerado automaticamente pela fonte de dados, como uma chave primária que se autoincrementa ou um carimbo de data e hora.
Observação: |
---|
Especificar explicitamente parâmetros é especialmente importante quando trabalhar com os provedores System.Data.OleDb e System.Data.Odbc que não suportam parâmetros nomeados em instruções SQL e usar o marcador '?' para especificar um parâmetro.Nesses casos você deve definir parâmetros na ordem especificada na instrução SQL associada. |
Para obter mais informações e exemplos de como usar parâmetros, consulte Usando parâmetros com o controle SqlDataSource e Como um Controle da Fonte de Dados Cria Parâmetros para Campos Ligados a Dados.
Eventos
O controle SqlDataSource gera eventos que você pode manipular para executar seu próprio código antes e após o controle executar uma operação de inserção, atualização ou exclusão.
O controle SqlDataSource levanta os eventos Inserting, Updating ou Deleting antes de executar a instrução SQL para a correspondente propriedade de comando.Você pode adicionar um manipulador para esses eventos para manipular, reordenar ou validar parâmetros para uma instrução antes que ele seja executado, bem como para cancelar o comando.Por exemplo, se você estiver usando um QueryStringParameter com o controle SqlDataSource, você pode manipular o evento Updating para validar o valor do parâmetro antes de executar uma atualização.(Por padrão, o QueryStringParameter leva o valor de uma variável sequência de consulta e o envia para o banco de dados sem qualquer validação.) Se o valor não for aceitável, você pode cancelar a atualização por configuração da propriedade Cancel do objeto SqlDataSourceCommandEventArgs do evento como true.
O controle SqlDataSource levanta os eventos Inserted, Updated ou Deleted após conclusão da operação de banco de dados.Você pode manipular esses eventos para determinar se uma exceção foi elevada durante a operação do banco de dados, para saber quantos registros foram afetados pela operação, ou para examinar nenhuma saída de valores ao retornar a operação de banco de dados.
Por exemplo, o seguinte exemplo de código usa os eventos Updating e Updated para executar o UpdateCommand dentro de uma transação.
<%@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>
Detecção de conflito
O controle SqlDataSource pode realizar as operações de atualização e exclusão de usando concorrência otimista.Simultaneidade otimista é uma estratégia de banco de dados que protege contra perda de alterações em uma fonte de dados no cenários onde vários usuários estão manipulando dados ao mesmo tempo.O controle SqlDataSource usa a propriedade ConflictDetection para determinar o nível de concorrência otimista verificando para usar ao executar operações de atualização e exclusão.
Por padrão, a propriedade ConflictDetection é definida como ConflictOptions.OverwriteChanges, o que significa que atualizar operações sobrescreve quaisquer valores existentes no registro sem determinar se o registro foi modificado por outra fonte.Esse cenário é às vezes chamado "última gravação vence".
Você pode definir a propriedade ConflictDetection para ConflictOptions.CompareAllValues para garantir que o controle SqlDataSource inclua todos os valores originais durante os comandos atualizar ou excluir.Isso permite a você gravar sua instrução SQL de tal forma que se os dados atualmente no banco de dados não corresponderem aos dados inicialmente que foram lidos a partir do banco de dados, a operação de atualização (update) não é executada.Para um exemplo, consulte Usando simultaneidade otimista.Você pode manipular o evento Updated para verificar quantos registros serão afetados por uma operação de atualização; se não há registros são atualizados, ocorreu uma violação de concorrência.