Neste artigo, vou usar o termo "Identidade" indiferentemente a nota gerada automaticamente (a partir de RDMS) valores geralmente de uma coluna que representam a chave primária de uma tabela. Estes são chamados de "sequências", em Oracle e "geradores" no Interbase.
Na verdade, existem 3 opções para obter o valor de volta identidade usando ADO. NET em geral:

  1. Use um lote consulta (o banco de dados tem, obviamente, de apoio a este)
  2. Use um procedimento armazenado (como o comando Insert) tendo como parâmetro a saída de uma "identidade" valor (esse é o método mais rápido e, portanto, recomendável)
  3. Manipular Adapter's RowUpdated / RowUpdating evento e emitir um "SELECT @ @ IDENTIDADE" (no caso do SQL Server) consulta no código neste evento manipulador (mais lento)

As duas primeiras opções dependem de UpdatedRowSource propriedade de um objeto Command para que o novo valor é propagado de volta para o objeto DataSet. Infelizmente, essa propriedade não tenha sido implementado actualmente em bdpCommand. Isso significa que a única opção viável é a 3 ª e uma amostra Vou construir uma candidatura (contra o MS SQL Server Northwind database) mostrando esta:

  • Inicie o Delphi 2005.
  • Do Arquivo | Novo, e selecione a opção "Windows Forms Application - Delphi para. NET" opção.
  • Arraste Explorer a partir de dados Adamastor dbo.Employees tabela de banco de dados em MSSQL provedor (detalhes sobre como configurar esta ligação pode ser encontrado neste excelente artigo de Bob SWART). Utiliza uma tabela Empregados AutoInc coluna como chave primária chamada "EmployeeID"
  • BDPDataAdapter criou o botão direito e selecione Configurar Adapter. Isso fará com que o adaptador de dados para a configuração formulário bdpAdapter componente. Modificar a cláusula SELECT como é mostrado na figura seguinte e clique GenerateSQL:

BdpAdapterConfiguration

  • Clique na guia sobre o conjunto de dados e selecione "New dataset" e clique em OK.
  • Definir bdpAdapter propriedade Active para True.
  • Clique no Tabelas propriedade do recém-criado dataset ( "Dataset1"). Isso fará com que os quadros propriedade editor para a coleta de dados. Select Columns e isso fará com que o editor Colunas para os empregados Quadro. Selecione o "EmployeeID" coluna e alterar as seguintes propriedades:
    • AutoIncrement = True
    • AutoIncrementSeed =- 1
    • AutoIncrementStep =- 1

como é mostrado na figura seguinte:

ColumnsCollectionEditor

NOTA:Uma vez que os valores que serão fixados no DataSet será descartado qualquer maneira durante aplicando atualizações para o banco de dados, então qualquer manequim (único) valor poderia ser utilizado também. No entanto, é uma boa prática para definir o valor da coluna AutoIncrement representando o campo chave primária como verdade única e torná-la assumir valores negativos, porque dessa maneira vamos confiar nas propriedades do dataset temporário para obter valores exclusivos e, além disso usando os valores negativos como temporário EmployeeID valores garante que não existe qualquer conflito com a permanente (positivo) de dados servidor valores atribuídos.

  • Largar um datagrid ao formulário e defina sua propriedade de dados para Dataset1 e DataMember propriedade de seus "colaboradores".
  • Largar um Button, renomeá-lo como btnSave e definir o seu texto para "Salvar alterações". Duplo clique no botão e digite o seguinte código:

procedimento TWinForm1.btnSave_Click (remetente: System.Object; e: System.EventArgs);
começo
BdpDataAdapter1.AutoUpdate (DataSet1, «Trabalhadores», BdpUpdateMode.All, [ 'EmployeeID'],[]);
final;

A 4 ªparâmetro de atualização automática EmployeeID define como um método lidos apenas coluna (que significa, que não será incluído no final cláusula INSERT) e é isso que realmente querem uma vez que esse valor será automaticamente gerada a partir de servidor de banco de dados.

  • Finalmente, duplo clique no evento RowUpdated de bdpAdapter e adicione o seguinte manipulador:

procedimento TWinForm1.BdpDataAdapter1_RowUpdated (remetente: System.Object; e: Borland.Data.Provider.BdpRowUpdatedEventArgs);
var
Cmd: BdpCommand;
começo
If (e.Status = UpdateStatus.Continue) e
(e.StatementType = StatementType.Insert)
então
começo
Cmd: = BdpCommand.Create ( 'SELECT @ @ IDENTIDADE', BdpConnection1);
e.Row [ 'EmployeeID']: = Cmd.ExecuteScalar;
e.Row.AcceptChanges;
final;
final;

No começo, eu saber que tem um erro não se durante a atualização desta linha especial (UpdateStatus.Continue) e se a linha foi inserida uma era guardado um. Nesse caso eu crio um objeto emite o bdpCommand SELECT @ @ IDENTIDADE consulta. Fiz, então, atribuir o valor obtido com a actual linha (e.row) e finalmente me chamam e.Row.AcceptChanges para remover a alteração que fiz a mudança de registo.
Perceba que devemos utilizar em vez de SCOPE_IDENTITY @ @ @ @ IDENTIDADE em caso houvesse Auditoria tabelas no banco de dados atualizado automaticamente através de cerca de gatilho (tornando @ @ IDENTIDADE o valor inserido na tabela de auditoria e não o "real" mesa nós estamos atualizando) .

Execute o aplicativo e adicionar um par de linhas:

Addingrows

Clique no botão "Salvar alterações" EmployeeID e os valores terão sido automaticamente atualizado:

SavedChanges

Técnicas semelhantes (que envolvem o evento RowUpdating) poderia ser utilizada para obter geraram um valor a partir de um gerador Interbase anterior à aplicação deste novo valor para o banco de dados

Referências:

-- Borland Delphi 2005 RAD para ADO.NET - por Bob SWART
-- Microsoft ADO. NET (Microsoft Press), de David Sceppa
-- Como usar campos Autoinc com DataSnap por Dan miser

Average rating: