PRB: DB_E_ERRORSOCCURRED devuelto por abrir cuando se utiliza GROUP BY y agregar función

Seleccione idioma Seleccione idioma
Id. de artículo: 236933 - Ver los productos a los que se aplica este artículo
Este artículo se ha archivado. Se ofrece "tal cual" y no se volverá a actualizar.
Expandir todo | Contraer todo

En esta página

Síntomas

Cuando se utiliza el Microsoft SQL Server OLE DB proveedor (SQLOLEDB) con clases de consumidor de plantilla de OLE DB para abrir un conjunto de filas con un SQL consulta que contenga GROUP BY y funciones de agregado como MAX , puede recibir un error DB_E_ERRORSOCCURRED de la llamada a Open.

Causa

Se ha marcado el conjunto de filas para cambiar, insertar o eliminar cuando usa el Asistente para consumidores ATL o ha agregado propiedades para que el conjunto de filas actualizable.

Solución

No marque el conjunto de filas para cambiar, insertar o eliminar cuando el comando contiene una función de agregado. Comente las líneas siguientes en el código ATL:
propset.AddProperty(DBPROP_IRowsetChange, true);
propset.AddProperty(DBPROP_UPDATABILITY, DBPROPVAL_UP_CHANGE | DBPROPVAL_UP_INSERT | DBPROPVAL_UP_DELETE);
				

Estado

Este comportamiento es por diseño.Si una instrucción SELECT contiene una función de agregado, como MAX , se abre automáticamente un cursor de servidor con una opción de desplazamiento de CUR_INSENSITIVE y un dbcursoropen de CUR_READONLY que no es actualizable. Para obtener información adicional, busque "concuropt" en SQL libros en pantalla de Server 7.0.

Más información

Pasos para reproducir el comportamiento

  1. Crear una tabla en SQL Server. Para ello, siga estos pasos:
    1. Conectarse a SQL Server con el Analizador de consultas SQL.
    2. Cambie a la base de datos Northwind.
    3. Pegue el código siguiente en el Analizador de consultas SQL:
      Create table myProducts ( ProductName NVarchar (40),  UnitsOnOrder smallint)
      go
      insert into myProducts values ( 'A', 1)
      go 
    4. Presione F5
  2. Utiliza al Asistente para consumidores OLE DB ATL para crear una clase CCommand que admite las operaciones de cambiar , Insertar y Eliminar
    1. Inicie Visual C++ 6.0
    2. En el menú archivo , haga clic en nuevo . Aparecerá el cuadro de diálogo de nuevo .
    3. En la ficha proyectos , haga clic en AppWizard(exe) de MFC .
    4. En la ficha proyectos , escriba Q236933 en el cuadro proyecto y, a continuación, haga clic en Aceptar . Aparece el Asistente para aplicaciones MFC.
    5. Haga clic en diálogo basado como tipo de aplicación.
    6. Haga clic en Finalizar y, a continuación, haga clic en Aceptar .
    7. En el menú Insertar , haga clic en Nuevo objeto ATL y, a continuación, haga clic en Aceptar . La ATL Aparece el Asistente para objetos.
    8. En el panel izquierdo, haga clic en Acceso A datos , haga clic en el panel derecho en el icono de cliente y, a continuación, haga clic en siguiente . Aparecerá el cuadro de diálogo Propiedades de Asistente para objetos ATL .
    9. Haga clic en Seleccionar origen de datos . Aparecerá el cuadro de diálogo Crear nuevo vínculo de datos .
    10. Haga clic en proveedor Microsoft OLE DB para SQL Server y, a continuación, haga clic en siguiente . Establecer su SQL SERVER conexión para utilizar la base de datos Northwind y, a continuación, haga clic en Aceptar .
    11. En el cuadro de diálogo Seleccionar tabla de base de datos , utilice el control de árbol para seleccionar la tabla dbo.myProducts y, a continuación, haga clic en Aceptar . Volver a la Asistente para objetos ATL propiedades cuadro de diálogo.
    12. Haga clic para seleccionar las casillas cambiar , Insertar y Eliminar a poder modificar, insertar y eliminar los registros del conjunto de filas del.
    13. Haga clic en Aceptar .
  3. Utilizando el nuevo CCommand clase derivada, haga lo siguiente:
    1. Abra el archivo dbomyProducts.h en el área de trabajo.
    2. Busque el código siguiente:
      DEFINE_COMMAND(CdbomyProductsAccessor, _T(" \
      	SELECT \
      		ProductName, \
      		UnitsOnOrder  \
      		FROM dbo.myProducts"))
      
    3. Reemplace con el siguiente código:
      DEFINE_COMMAND(CdbomyProductsAccessor, _T(" \
      	SELECT \
      		ProductName, \
      		MAX(UnitsOnOrder)  \
      		FROM dbo.myProducts GROUP BY ProductName"))
    4. Abra el archivo Q236933Dlg.cpp en el área de trabajo
    5. Agregue el código siguiente en la parte superior de windows después de la instrucción # include "Q236933.h" :
      #include "dbomyProducts.h"
    6. Busque el código siguiente:
      BOOL CQ1321321Dlg::OnInitDialog()
    7. Pegue el código siguiente encima de la función OnInitDialog() :
      HRESULT hr;
      CdbomyProducts rs1;
      hr= rs1.Open();
      // 0x80040e21 is the value of DB_E_ERRORSOCCURRED.
      	if (hr==0x80040E21) MessageBox("Command Failed.\rDB_E_ERRORSOCCURRED",NULL,MB_OK);
    8. Presione CTRL + F5 para generar y ejecutar la aplicación. Recibirá el siguiente mensaje de error:
      Error de comando. DB_E_ERRORSOCCURRED

Propiedades

Id. de artículo: 236933 - Última revisión: lunes, 03 de febrero de 2014 - Versión: 3.0
La información de este artículo se refiere a:
  • Microsoft Visual C++ 6.0 Enterprise
  • Microsoft Visual C++ .NET 2002 Standard
Palabras clave: 
kbnosurvey kbarchive kbmt kbatl300 kbdatabase kbdtl kbfaq kbgrpdsvcdb kboledb kbprb kbsqlserv KB236933 KbMtes
Traducción automática
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): 236933

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com