Estás trabajando sin conexión, espera a que vuelva la conexión a Internet

Cómo fabricación de un Recordset de ADO basado en otro conjunto de registros

IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.

Haga clic aquí para ver el artículo original (en inglés): 247868
Renuncia a responsabilidad de los contenidos de la KB sobre productos a los que ya no se ofrece asistencia alguna
El presente artículo se escribió para productos para los que Microsoft ya no ofrece soporte técnico. Por tanto, el presente artículo se ofrece "tal cual" y no será actualizado.
Resumen
Algunas directivas corporativas permiten el acceso de sólo lectura a las tablas de base de datos con todas las actualizaciones se realiza mediante procedimientos almacenados. Si desea enlazar un control de datos, como el control cuadrícula de datos de Microsoft o de vista de lista, a un objeto recordset de ADO, esto puede suponer un problema de mantener en sincronización con los datos del conjunto de registros si puede permitir agregar, eliminar y modificar registros pero no puede editar directamente a través del conjunto de registros.
Más información
Si desea mantener en sincronización con el servidor un conjunto de registros pero no puede agregar registros a través de recordset jerárquico, hay en contacto con un número de soluciones:
  1. Puede volver a consultar el conjunto de registros. Esto tiene la desventaja de un rendimiento deficiente.
  2. Puede desconectar el conjunto de registros y realizar adiciones y otras modificaciones en paralelo con procedimientos almacenados. El problema aquí es que algunos campos son de sólo lectura, como la identidad y TimeStamp y no se puede establecer su valor. Esto resulta problemático si la columna de identidad se suministra a los procedimientos almacenados para identificar el registro se actualice, o si la columna TimeStamp se pasa al procedimiento almacenado para determinar si alguien ha modificado el registro mientras tanto. Hay una serie de soluciones:
    1. Puede copiar los datos en una base de datos local, como por ejemplo una MDB de Jet y utilizar tipos de datos que no el campo de sólo lectura. Puede actualizar el conjunto de registros en paralelo mediante procedimientos almacenados y mantener sincronizados los datos.
    2. Puede fabricar un conjunto de registros basado en el original y copie los datos en él. Los campos son actualizables todo y puede actualizar el conjunto de registros en paralelo mediante procedimientos almacenados.
Este artículo proporciona código de ejemplo para la segunda solución. Es genérico para trabajar con cualquier conjunto de registros no jerárquico (no se copian los campos de capítulo). Si necesita utilizar conjuntos de registros jerárquicos, consulte el siguiente artículo de Knowledge Base:
241202Cómo crear una base de Recordset jerárquico fabricado en un conjunto de registros existente
En este artículo proporciona las siguientes funciones:

Nombre de funciónDescripción
Responsables deCrea un objeto Recordset cerrado, vacío con campos con los mismos nombres y tipos de datos como el original. No se copian campos dividido en capítulos.
OpenAndFillRSAbre el Recordset de destino y copia datos desde el origen (abierto) Recordset. No se copian datos en campos de ella.

La aplicación de ejemplo tiene los siguientes pasos:
  1. Se abre un conjunto de registros.
  2. Llama a los responsables de crear un conjunto de registros equivalente que no se basa en cualquier proveedor y, por lo tanto, no tiene campos de sólo lectura.
  3. Llama a OpenAndFillRS para abrir el conjunto de registros y copiar los datos desde el conjunto de registros original.
  4. Cierra el conjunto de registros original.
  5. Enlaza la cuadrícula de datos de ADO al conjunto de registros fabricado.
Nota : el código no proporciona ejemplos de actualizar el servidor tabla y realizar los cambios equivalentes en el conjunto de registros fabricado. Se deja como ejercicio para el lector porque el conjunto de registros fabricado ahora está en un estado para que esto sea posible.

Aplicación de ejemplo

  1. Abra un proyecto nuevo en Microsoft Visual Basic 6.0. Se creará Form1 de manera predeterminada.
  2. En el menú proyecto , elija componentes , seleccione el control de "Microsoft DataGrid Control 6.0 (OLEDB)" y coloque en el formulario. Hacen bastante grande.
  3. En el menú proyecto , elija referencias , seleccione "Microsoft ActiveX Data Objects 2.1 biblioteca".
  4. Agregue el código siguiente al módulo de formulario:
    Option ExplicitPrivate Sub Command1_Click()Dim cn As ADODB.Connection, rsSource As ADODB.Recordset, rsDest As ADODB.Recordset  Set cn = New ADODB.Connection  cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=nwind.mdb"  Set rsSource = cn.Execute("SELECT * FROM Customers")  Set rsDest = MakeRS(rsSource)  OpenAndFillRS rsSource, rsDest  rsSource.Close  cn.Close  Set DataGrid1.DataSource = rsDestEnd SubFunction MakeRS(ByVal rsSource As ADODB.Recordset) As ADODB.RecordsetDim rsTemp As ADODB.Recordset, F As ADODB.Field  Set rsTemp = New ADODB.Recordset  For Each F In rsSource.Fields    If F.Type <> adChapter Then      rsTemp.Fields.Append F.Name, F.Type, F.DefinedSize, F.Attributes And adFldIsNullable      With rsTemp(F.Name)        .Precision = F.Precision        .NumericScale = F.NumericScale      End With    End If  Next F  Set MakeRS = rsTempEnd FunctionSub OpenAndFillRS(ByVal rsSource As ADODB.Recordset, ByVal rsDest As ADODB.Recordset)Dim F As ADODB.Field  If rsSource.State = adStateClosed Then Exit Sub<BR/>  If rsSource.EOF And rsSource.BOF Then Exit Sub  If rsSource.CursorType <> adOpenForwardOnly Then    If Not rsSource.EOF And Not rsSource.BOF Then      rsSource.MoveFirst    End If  End If  rsDest.CursorLocation = adUseClient  rsDest.Open   Do While Not rsSource.EOF    rsDest.AddNew    For Each F In rsSource.Fields      If F.Type <> adChapter Then rsDest(F.Name).Value = F.Value    Next F    rsDest.Update    rsSource.MoveNext  LoopEnd Sub					
  5. Agregue un CommandButton, modificar la cadena de conexión en el procedimiento Command1_Click y ejecute el proyecto. Los datos del cliente se muestran en la cuadrícula después de hacer clic en el control CommandButton.
Referencias
Para obtener información adicional, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
305346Cómo copiar DataRows entre DataTables utilizando Visual Basic .NET

Advertencia: este artículo se tradujo automáticamente

Propiedades

Id. de artículo: 247868 - Última revisión: 07/02/2004 13:57:29 - Revisión: 2.2

Microsoft ActiveX Data Objects 2.1, Microsoft ActiveX Data Objects 2.1 Service Pack 1, Microsoft ActiveX Data Objects 2.1 Service Pack 2, Microsoft ActiveX Data Objects 2.5, Microsoft ActiveX Data Objects 2.6, Microsoft ActiveX Data Objects 2.7

  • kbmt kbhowto KB247868 KbMtes
Comentarios
one;" onerror="var m=document.createElement('meta');m.name='ms.dqp0';m.content='true';document.getElementsByTagName('head')[0].appendChild(m);" onload="var m=document.createElement('meta');m.name='ms.dqp0';m.content='false';document.getElementsByTagName('head')[0].appendChild(m);" src="http://c1.microsoft.com/c.gif?"> dex -->
대한민국 - 한국어
España - Español
Paraguay - Español
Venezuela - Español
//c1.microsoft.com/c.gif?DI=4050&did=1&t=">s.dqp0';m.content='false';document.getElementsByTagName('head')[0].appendChild(m);" src="http://c1.microsoft.com/c.gif?"> + "//c.microsoft.com/ms.js'><\/script>");