Recuperar autoinc valores con bdp en delphi 2005

Recuperar autoinc valores con bdp en delphi 2005


En este artículo voy a utilizar el término 'Identidad' de manera intercambiable a la nota generada automáticamente (de RDMS), los valores generalmente para una columna que representa la clave primaria de una tabla. Estos son los llamados 'secuencias' en Oracle y 'generadores' en Interbase.
en Realidad, hay 3 opciones para obtener el valor de identidad mediante ADO .RED en general:

  1. el Uso de un lote de consulta (la base de datos, obviamente, tiene que apoyar este)
  2. Utilizar un procedimiento almacenado (como el comando Insert), teniendo como parámetro de salida de la 'Identidad' valor ' (este es el más rápido y por lo tanto método recomendado)
  3. Adaptador de Manejar la RowUpdated /RowUpdating evento y emitir un 'SELECT @@IDENTITY' (en el caso de SQL Server) consulta en el código en este controlador de eventos (más lento)

& nbsp

Las dos primeras opciones se basan en UpdatedRowSource propiedad de un objeto de Comando, de manera que el nuevo valor se propaga de nuevo en el objeto DataSet. Por desgracia, esta propiedad no ha sido implementado en bdpCommand. Eso significa que la única opción viable es la 3ª y voy a crear una aplicación de ejemplo (en contra de MS SQL Server base de datos Northwind) muestra esto:

  • Inicio Delphi 2005.
  • Archivo | Nuevo y seleccione la 'Aplicación de Windows Forms - Delphi para .NET' opción.
  • Arrastrar desde el Explorador de Datos de la dbo.Tabla empleados de la base de datos Northwind en MSSQL (proveedor de detalles sobre cómo configurar esta conexión se puede encontrar en este excelente artículo de Bob Swart). Tabla de empleados utiliza un AutoInc columna como clave primaria de la llamada 'Idempleado'
  • clic Derecho en la BDPDataAdapter creado y seleccione Configurar el Adaptador. Esto hará que aparezca la configuración del adaptador de datos de formulario para la bdpAdapter componente. Modificar la cláusula SELECT como se muestra en la siguiente imagen y haga clic en GenerateSQL:

BdpAdapterConfiguration

& nbsp

  • haga Clic en el conjunto de datos y seleccione la ficha 'Nuevo conjunto de datos' y haga clic en OK.
  • Establecer bdpAdapter de la propiedad Active a True.
  • haga Clic en las Tablas de la propiedad de la recién creada conjunto de datos ('Dataset1'). Esto traerá la colección de Tablas editor de propiedades para el conjunto de datos. Seleccione las Columnas y esto abrirá el editor de Columnas para la Tabla empleados. Seleccione el 'Idempleado' columna y cambiar las siguientes propiedades:
    • AutoIncrement=True
    • AutoIncrementSeed=-1
    • AutoIncrementStep=-1

< p class='step_content '>como se muestra en la siguiente imagen:

ColumnsCollectionEditor

NOTA: a partir de los valores que se establecen en el conjunto de datos se descartarán todos modos durante la aplicación de actualizaciones a la base de datos, entonces cualquier maniquí (único) valor podría ser utilizado como así. Sin embargo, es una buena práctica para establecer el valor de incremento automático de la columna que representa el campo de clave principal como verdadero y hacer que sea único tomar valores negativos, porque de esta manera nos basamos en el conjunto de datos de las propiedades para obtener temporal de valores únicos y, además, el uso de valores negativos como temporal EmployeeID valores se asegura de que no hay ningún conflicto con permanente (positivo) de la base de datos del servidor de valores asignados.

  • Caída de un datagrid del formulario y establezca su propiedad datasource para Dataset1 y la propiedad DataMember a los 'empleados'.
  • coloque un Botón, cambiar el nombre como btnSave y ajustar su Texto a 'Guardar Cambios'. Haga doble clic en el botón e introduzca el código siguiente:

procedimiento TWinForm1.btnSave_Click(sender: Sistema.Objeto e: Sistema.EventArgs)
begin
BdpDataAdapter1.AutoUpdate(DataSet1, 'Empleados', BdpUpdateMode.Todos, ['EmployeeID'],[])
fin

4thparámetro de AutoUpdate método define EmployeeID como de sólo lectura de la columna (que significa, que no va a ser incluido en la final de la INSERCIÓN de la cláusula) y que es lo que en realidad queremos ya que este valor se genera automáticamente a partir de la base de datos del servidor.

  • por último, haga doble clic en el evento RowUpdated de bdpAdapter y agregue el siguiente controlador:

procedimiento TWinForm1.BdpDataAdapter1_RowUpdated(sender: Sistema.Objeto e: Borland.De datos.Proveedor de.BdpRowUpdatedEventArgs)
var
Cmd:BdpCommand
begin
If (e.Estado=UpdateStatus.Continuar) y
(e.StatementType=StatementType.Insertar)

begin
Cmd:=BdpCommand.Crear('SELECT @@IDENTITY',BdpConnection1)
e.Fila['EmployeeID']:=Cmd.ExecuteScalar
e.La fila.AcceptChanges
fin
fin

En primer lugar, me cerciore de que un error no ha subido durante la actualización de esta fila (UpdateStatus.Continuar), y si la fila se ha guardado fue insertado. En ese caso puedo crear un bdpCommand objeto de la emisión de la consulta SELECT @@IDENTITY. Yo, a continuación, asignar el valor recuperado de la fila actual (e.fila) y, finalmente, me llame e.La fila.AcceptChanges para quitar el cambio que hice desde el cambio de registro.
tenga en cuenta que debemos usar @@SCOPE_IDENTITY en lugar de @@IDENTITY en caso de que hubiera de Auditoría tablas en la base de datos se actualiza automáticamente a través de algún desencadenante (haciendo @@IDENTITY el valor que se inserta en la tabla de auditoría y no 'real' de la tabla que estamos actualizando).

Ejecute la aplicación y añadir un par de filas:

Addingrows

haga Clic en el botón 'Guardar cambios' y el EmployeeID valores será automáticamente actualizado:

SavedChanges

& nbsp

técnicas Similares (que involucra a la RowUpdating evento) podría ser utilizado para obtener un valor generado a partir de un generador de Interbase antes de la aplicación de este nuevo valor a la base de datos

& nbsp

Referencias:

- Borland Delphi 2005 RAD para ADO.NET - por Bob Swart
- ADO de Microsoft .NET (Microsoft Press) por David Sceppa
- Cómo utilizar Autoinc campos con DataSnap por Dan Avaro

& nbsp

& nbsp







Recuperar autoinc valores con bdp en delphi 2005


Recuperar autoinc valores con bdp en delphi 2005 : Multi-millones de consejos para hacer su vida mas facil.


En este articulo voy a utilizar el termino 'Identidad' de manera intercambiable a la nota generada automaticamente (de RDMS), los valores generalmente para una columna que representa la clave primaria de una tabla. Estos son los llamados 'secuencias' en Oracle y 'generadores' en Interbase.
en Realidad, hay 3 opciones para obtener el valor de identidad mediante ADO .RED en general:

  1. el Uso de un lote de consulta (la base de datos, obviamente, tiene que apoyar este)
  2. Utilizar un procedimiento almacenado (como el comando Insert), teniendo como parametro de salida de la 'Identidad' valor ' (este es el mas rapido y por lo tanto metodo recomendado)
  3. Adaptador de Manejar la RowUpdated /RowUpdating evento y emitir un 'SELECT @@IDENTITY' (en el caso de SQL Server) consulta en el codigo en este controlador de eventos (mas lento)

& nbsp

Las dos primeras opciones se basan en UpdatedRowSource propiedad de un objeto de Comando, de manera que el nuevo valor se propaga de nuevo en el objeto DataSet. Por desgracia, esta propiedad no ha sido implementado en bdpCommand. Eso significa que la unica opcion viable es la 3ª y voy a crear una aplicacion de ejemplo (en contra de MS SQL Server base de datos Northwind) muestra esto:

  • Inicio Delphi 2005.
  • Archivo | Nuevo y seleccione la 'Aplicacion de Windows Forms - Delphi para .NET' opcion.
  • Arrastrar desde el Explorador de Datos de la dbo.Tabla empleados de la base de datos Northwind en MSSQL (proveedor de detalles sobre como configurar esta conexion se puede encontrar en este excelente articulo de Bob Swart). Tabla de empleados utiliza un AutoInc columna como clave primaria de la llamada 'Idempleado'
  • clic Derecho en la BDPDataAdapter creado y seleccione Configurar el Adaptador. Esto hara que aparezca la configuracion del adaptador de datos de formulario para la bdpAdapter componente. Modificar la clausula SELECT como se muestra en la siguiente imagen y haga clic en GenerateSQL:

BdpAdapterConfiguration

& nbsp

  • haga Clic en el conjunto de datos y seleccione la ficha 'Nuevo conjunto de datos' y haga clic en OK.
  • Establecer bdpAdapter de la propiedad Active a True.
  • haga Clic en las Tablas de la propiedad de la recien creada conjunto de datos ('Dataset1'). Esto traera la coleccion de Tablas editor de propiedades para el conjunto de datos. Seleccione las Columnas y esto abrira el editor de Columnas para la Tabla empleados. Seleccione el 'Idempleado' columna y cambiar las siguientes propiedades:
    • AutoIncrement=True
    • AutoIncrementSeed=-1
    • AutoIncrementStep=-1

< p class='step_content '>como se muestra en la siguiente imagen:

ColumnsCollectionEditor

NOTA: a partir de los valores que se establecen en el conjunto de datos se descartaran todos modos durante la aplicacion de actualizaciones a la base de datos, entonces cualquier maniqui (unico) valor podria ser utilizado como asi. Sin embargo, es una buena practica para establecer el valor de incremento automatico de la columna que representa el campo de clave principal como verdadero y hacer que sea unico tomar valores negativos, porque de esta manera nos basamos en el conjunto de datos de las propiedades para obtener temporal de valores unicos y, ademas, el uso de valores negativos como temporal EmployeeID valores se asegura de que no hay ningun conflicto con permanente (positivo) de la base de datos del servidor de valores asignados.

  • Caida de un datagrid del formulario y establezca su propiedad datasource para Dataset1 y la propiedad DataMember a los 'empleados'.
  • coloque un Boton, cambiar el nombre como btnSave y ajustar su Texto a 'Guardar Cambios'. Haga doble clic en el boton e introduzca el codigo siguiente:

procedimiento TWinForm1.btnSave_Click(sender: Sistema.Objeto e: Sistema.EventArgs)
begin
BdpDataAdapter1.AutoUpdate(DataSet1, 'Empleados', BdpUpdateMode.Todos, ['EmployeeID'],[])
fin

4thparametro de AutoUpdate metodo define EmployeeID como de solo lectura de la columna (que significa, que no va a ser incluido en la final de la INSERCION de la clausula) y que es lo que en realidad queremos ya que este valor se genera automaticamente a partir de la base de datos del servidor.

  • por ultimo, haga doble clic en el evento RowUpdated de bdpAdapter y agregue el siguiente controlador:

procedimiento TWinForm1.BdpDataAdapter1_RowUpdated(sender: Sistema.Objeto e: Borland.De datos.Proveedor de.BdpRowUpdatedEventArgs)
var
Cmd:BdpCommand
begin
If (e.Estado=UpdateStatus.Continuar) y
(e.StatementType=StatementType.Insertar)

begin
Cmd:=BdpCommand.Crear('SELECT @@IDENTITY',BdpConnection1)
e.Fila['EmployeeID']:=Cmd.ExecuteScalar
e.La fila.AcceptChanges
fin
fin

En primer lugar, me cerciore de que un error no ha subido durante la actualizacion de esta fila (UpdateStatus.Continuar), y si la fila se ha guardado fue insertado. En ese caso puedo crear un bdpCommand objeto de la emision de la consulta SELECT @@IDENTITY. Yo, a continuacion, asignar el valor recuperado de la fila actual (e.fila) y, finalmente, me llame e.La fila.AcceptChanges para quitar el cambio que hice desde el cambio de registro.
tenga en cuenta que debemos usar @@SCOPE_IDENTITY en lugar de @@IDENTITY en caso de que hubiera de Auditoria tablas en la base de datos se actualiza automaticamente a traves de algun desencadenante (haciendo @@IDENTITY el valor que se inserta en la tabla de auditoria y no 'real' de la tabla que estamos actualizando).

Ejecute la aplicacion y añadir un par de filas:

Addingrows

haga Clic en el boton 'Guardar cambios' y el EmployeeID valores sera automaticamente actualizado:

SavedChanges

& nbsp

tecnicas Similares (que involucra a la RowUpdating evento) podria ser utilizado para obtener un valor generado a partir de un generador de Interbase antes de la aplicacion de este nuevo valor a la base de datos

& nbsp

Referencias:

- Borland Delphi 2005 RAD para ADO.NET - por Bob Swart
- ADO de Microsoft .NET (Microsoft Press) por David Sceppa
- Como utilizar Autoinc campos con DataSnap por Dan Avaro

& nbsp

& nbsp

Recuperar autoinc valores con bdp en delphi 2005

Recuperar autoinc valores con bdp en delphi 2005 : Multi-millones de consejos para hacer su vida más fácil.
Recommander aux amis
  • gplus
  • pinterest

Comentario

Dejar un comentario

Clasificación