Hvordan hente AutoInc verdier med BDP i Delphi 2005

I denne artikkelen vil jeg bruke begrepet "identitet" om hverandre å merke Auto generert (fra RDMS) verdier vanligvis for en kolonne som representerer primærnøkkel i en tabell. Disse kalles "sekvenser" i Oracle og "generatorer" i Interbase. Egentlig er det 3 alternativer for å få identiteten verdi tilbake ved hjelp av ADO .NET generelt:


    Bruk en batch spørring (databasen har tydeligvis å støtte dette)

    Bruk en lagret prosedyre (som Sett inn kommando) som har som en utgang parameter på "Identity" verdi (dette er den raskeste og dermed anbefalt metode)

    Håndtak Adapter er RowUpdated /RowUpdating hendelsen og utstede en " SELECT@@IDENTITY " (I tilfelle av SQL Server) spørring i koden i dette hendelseshåndterer (tregest)
    De to første alternativene er avhengige UpdatedRowSource tilhører en Command objektet slik at den nye verdien forplantes tilbake til DataSet objektet. Dessverre, denne egenskapen har foreløpig ikke blitt implementert i bdpCommand. Det betyr at den eneste levedyktige alternativet er den tredje en, og jeg vil bygge et prøveprogram (mot MS SQL Server Northwind database) som viser dette:

    Komme i Delphi 2005.

    Gjør fil | Ny, og velg " Windows Forms Application - Delphi for .NET " alternativet.

    Dra fra Data Explorer den dbo.Employees bordet fra Northwind databasen i MSSQL leverandør (informasjon om hvordan du setter opp denne forbindelse kan bli funnet i denne utmerkede artikkel av Bob Swart). Ansatte-tabellen bruker en AutoInc kolonnen som primærnøkkel kalt "EmployeeID"

    Høyreklikk på BDPDataAdapter opprettet, og velg Konfigurer Adapter. Dette vil bringe opp data konfigurere kort skjema for bdpAdapter komponent. Endre SELECT-leddet som er vist på bildet nedenfor og klikk GenerateSQL:


    Klikk på fanen datasett og velg "New datasett" og klikk OK .

    sett bdpAdapter Aktiv eiendom til True

    . Klikk på Tabeller tilhører den nyopprettede datasett ( "Dataset1"). Dette vil bringe opp Tabeller samling eiendom redaktør for datasettet. Velg kolonner og dette vil bringe opp Kolonner redaktør for ansatte Table. Velg "EmployeeID" -kolonnen og endre følgende egenskaper:

    AutoIncrement=True

    AutoIncrementSeed=-1

    AutoIncrementStep=-1




    as er vist i følgende bilde:
    MERK: Siden de verdiene vi vil sette i datasettet vil bli forkastet uansett under installasjon av oppdateringer til databasen, da noen dummy (unik) verdien kan brukes i tillegg. Men det er en god praksis å sette AutoIncrement verdien av kolonnen representerer primærnøkkelfeltet som sant og til at det tar unike negative verdier, fordi denne måten vi stole på Datasett eiendommer å få midlertidige unike verdier og i tillegg bruke negative verdier midlertidige AnsattID verdier sørger for at det ikke er noen konflikt med permanente (positiv) database server tildelte verdiene.

    Drop en Datagrid til skjemaet og angi datakilden eiendom til Dataset1 og dens DataMember eiendom til "ansatte".

    Drop en knapp, endre navn på den som btnSave og sette tekst til "Lagre endringer". Dobbeltklikk på knappen og skriv inn følgende kode:
    prosedyre TWinForm1.btnSave_Click (avsender: System.Object; e: System.EventArgs); begynne BdpDataAdapter1.AutoUpdate (DataSet1, 'ansatte', BdpUpdateMode.All, [ 'AnsattID'], []); enden,
    The 4 thparameter av Autoupdate metoden definerer AnsattID som en skrivebeskyttet kolonne (det betyr at det ikke vil bli inkludert i den endelige INSERT klausul), og det er det vi egentlig vil, siden denne verdien . blir automatisk generert fra databasetjeneren

    til slutt, dobbeltklikk på RowUpdated tilfelle bdpAdapter og legge til følgende handler:
    prosedyre TWinForm1.BdpDataAdapter1_RowUpdated (avsender: System.Object; e: Borland.Data.Provider.BdpRowUpdatedEventArgs); Var Cmd: BdpCommand; begynne Hvis (e.Status = UpdateStatus.Continue) og (e.StatementType = StatementType.Insert), og start Cmd: = BdpCommand.Create ( 'SELECT@@IDENTITY', BdpConnection1); e.Row [ 'EmployeeID']: = Cmd.ExecuteScalar; e.Row.AcceptChanges; slutt; enden,
    Ved første, jeg fastslå at en feil ikke har kommet opp under oppdatering av denne raden (UpdateStatus.Continue) og hvis raden er lagret var en innsatt en. I så fall oppretter jeg en bdpCommand objekt som utsteder SELECT@@IDENTITY søket. Jeg deretter tildele verdien som ble hentet til den gjeldende rad (e.row) og til slutt jeg kaller e.Row.AcceptChanges å fjerne endringen jeg laget fra endringsloggen. Merk at vi bør bruke@@SCOPE_IDENTITY stedet for@@IDENTITY i tilfelle det var Revisjons tabeller i databasen automatisk oppdateres gjennom noen trigger (gjør@@IDENTITY som er satt inn i revisjonen tabellen verdi og ikke " ekte " tabellen vi oppdaterer ).
    Kjør programmet og legge til et par rader:
    Klikk på "Lagre endringer" -knappen og AnsattID verdiene vil ha automatisk oppdatert:
    bilder Lignende teknikker (som involverer RowUpdating hendelse) kan brukes til å få en generert verdi fra en Interbase generator før påføring denne nye verdien til databasen
    Referanser:
    - Borland Delphi 2005 RAD for ADO.NET - av Bob Swart - Microsoft ADO .NET (Microsoft Press) av David Sceppa - Hvordan bruke Autoinc felt med DataSnap av Dan Miser



    Next Page: