Español


Español


Base de conocimientos

Impacto de los tipos de cursores ADO en un controlador ODBC en ASP


KB-LJW-DB-101



  




Artículos y recursos relacionados




Arquitectura ADO / OLE DB / ODBC en ASP Classic

 Haga clic para ordenar por columna
ComponenteTipoEjemplos
1. Aplicación ASPLógica funcionalArchivos *.asp
2. ADOAPI de acceso a datosN/A (biblioteca estandarizada)
3. OLE DBProvider / adaptadorProvider=MSDASQL;
Provider=Microsoft.ACE.OLEDB.12.0;
Provider=SQLOLEDB;
4. ODBCDriver / controladorDriver={MariaDB ODBC 3.2 Driver};
Driver={MySQL ODBC 5.1 Driver};
5. DatosArchivo o motor de base de datosMariaDB Server 11.4
Microsoft SQL Server
Archivo *.mdb
Archivo *.xlsx


Función de cada capa




Flujo de datos ADO + OLE DB + ODBC en ASP Classic


Funcionamiento general



Capa ADO



Capa OLE DB



Capa ODBC




Los tipos de cursores ADO




Impactos del tipo de cursor ADO






Cómo aprovechar los cursores ADO en ASP ?

PHP no se ve afectado por ADO + ODBC


PHP
<?php
$user = 'testUser';
$pass = 'testPassword';
$pdoConn = new PDO('mysql:host=localhost;dbname=TestDB', $user, $pass, [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
]);

$sqlStmt = $pdoConn->prepare('SELECT * FROM users WHERE field_1 = :field_1');
$sqlStmt->execute(['field_1' => $_GET['field_1']]);
$result = $sqlStmt->fetch();
?>


PHP
<?php
$conn = new COM("ADODB.Connection");
$conn->Open("Provider=MSOLEDBSQL;Server=localhost;Database=TestDB;Trusted_Connection=Yes;");
?>


ASP.NET no se ve afectado por ADO + ODBC



CursorType permite un código ASP fiable y previsible



Compatibilidad de las funcionalidades ADO por Cursor


 Haga clic para ordenar por columna
Método / Propiedad ADO0=Forward-Only (por defecto)3=Static1=Keyset2=Dynamic
MoveNext Sí Sí Sí Sí
MoveFirst No Sí Sí Sí
MoveLast No
(o comportamiento no garantizado)
 Sí Sí Sí
MovePrevious No Sí Sí Sí
AbsolutePosition No Sí Sí Sí
PageSize / PageCount / AbsolutePage No Sí Sí Sí
RecordCount Inutilizable
(devuelve -1)
 Fiable Fiable Fiable
Bookmark / Supports(adBookmark) No Sí Sí Sí
Sort No
(provoca cambio a client-side)
 Sí
(client-side estable)
 Sí Sí
Filter No
(provoca cambio a client-side)
 Sí Sí Sí
Edición (Update, AddNew, Delete) No
(Read-Only)
 Sí
(pero snapshot)
 Sí
(filas visibles)
 Sí
(reactivo)
Ver las nuevas filas insertadas después de la apertura No No No Sí
Estabilidad concurrente de los datosMuy alta (flujo fijo)Alta (snapshot)MediaBaja


  • BOF
  • EOF
  • MoveNext
  • Fields
  • Fields.Item
  • Fields.Item("fieldname").Value
  • GetRows
  • GetString
  • State
  • ActiveConnection
  • Source
  • CursorType (retourne 0)
  • CursorLocation
  • LockType
  • CacheSize
  • MarshalOptions



Consejos para un código ASP Classic fiable con ADO + ODBC


Utilizar un CursorType=0 (adOpenForwardOnly) para las lecturas simples de un Recordset


ASP CLASSIC
<%
'Abrir la conexión
Set dbConn = Server.CreateObject("ADODB.Connection")
dbConn.Open dbConnString

'Abrir el Recordset en modo "Forward-Only" mediante .Open()
Set rs = Server.CreateObject("ADODB.Recordset")
rs.Open strSQL, dbConn

''O bien: abrir el Recordset en modo "Forward-Only" mediante .Execute()
'Set rs = dbConn.Execute(strSQL)
%>


  • BOF
  • EOF
  • MoveNext
  • Fields
  • Fields.Item
  • Fields.Item("fieldname").Value
  • GetRows
  • GetString
  • State
  • ActiveConnection
  • Source
  • CursorType (retourne 0)
  • CursorLocation
  • LockType
  • CacheSize
  • MarshalOptions

ASP CLASSIC
<%
'Si el Recordset contiene registros
if ((NOT rs.BOF) AND (NOT rs.EOF)) then
   do while NOT rs.EOF
      'Devolver el valor del campo "field_1"
      Response.Write rs("field_1")
      'Pasar al registro siguiente
      rs.MoveNext
   loop
end if
%>




Especificar el CursorType antes de cada llamada a rs.Open

ASP CLASSIC
<%
Set rs = Server.CreateObject("ADODB.Recordset")
'Especificar el tipo de cursor
rs.CursorLocation = 3 'adUseClient (preferiblemente, ya que los cursores del lado del servidor dependen del Driver ODBC)
rs.CursorType     = 3 'adOpenStatic (o bien 1 o 2 según sus necesidades)
rs.LockType       = 1 'adLockReadOnly (el más rápido si no hay escritura)

'Abrir el Recordset de manera desplazable
rs.Open strSQL, dbConn
%>


  • RecordCount
  • MoveFirst
  • MoveLast
  • MovePrevious
  • AbsolutePage
  • PageSize
  • PageCount
  • Sort
  • Filter

ASP CLASSIC
<%
'El recordset ha sido almacenado en caché en memoria del lado cliente
'gracias a que rs.CursorType es diferente de 0.
'La propiedad .Recordcount es por lo tanto calculable y refleja el número real de filas recuperadas
if (rs.RecordCount <> 0) then
   'Hacer algo
end if
%>




Especificar el CursorType=3 (adOpenStatic) para cualquier desplazamiento u ordenación en un Recordset


  • RecordCount
  • MoveFirst
  • MoveLast
  • MovePrevious
  • AbsolutePage
  • PageSize
  • PageCount
  • Sort
  • Filter





Especificar CursorLocation=3 (adUseClient) para cualquier uso de rs.Sort y rs.Filter




Gestión de los cursores ADO con el Driver Microsoft SQL Server




Gestión de los cursores ADO con el Driver Microsoft Access




Gestión de los cursores ADO con el Driver MySQL



Cursor predeterminado del Driver MySQL ODBC 3.51



Cursor predeterminado del Driver MySQL ODBC 5.3



Utilizar el modo Forward-Only (streaming) del lado del servidor (motor MySQL)


Implementación

  • 1048576 (NO_CACHE)
  • 2097152 (FORWARD_CURSOR)



Gestión de los cursores ADO con el Driver MariaDB



Cursor predeterminado del Driver MariaDB ODBC 3.1



Cursor predeterminado del Driver MariaDB ODBC 3.2

ODBC-290 = Cursor type now defaults to SQL_CURSOR_FORWARD_ONLY as it is required by specs. 3.1.x series has default cursor type SQL_CURSOR_STATIC.



Utilizar el modo Forward-Only (streaming) del lado del servidor (motor MariaDB)


Comportamiento con MariaDB ODBC 3.1


Comportamiento con MariaDB ODBC 3.2


Implementación

  • 1048576 (NO_CACHE)
  • 2097152 (FORWARD_CURSOR)
  • FORWARDONLY=1;
  • NO_CACHE=1;





Al servicio de su ASP Classic





Preferentias de privacidadPreferencias relacionadas con sus datos personales.

NOTA : Sus cambios se aplicarán desde la página siguiente que visitará/cargará.

Su privacidad es preciosa: la respetamos.

Al usar este sitio, usted acepta que usemos estadísticas anónimas para analizar nuestro tráfico y mejorar su experiencia de navegación en nuestro sitio, además de tecnologías y cookies para personalizar el contenido. Esta información anónima se puede compartir con nuestros socios de redes sociales y de análisis de confianza.

  • No recolectamos ningún dato nominativo.
  • No almacenamos ninguna contraseña.
  • Utilizamos un algoritmo de seguridad de alto nivel.