Access.ApplicationClass y WebServices

30/09/2005 - 13:16 por David | Informe spam
Hola! Había puesto este post en C#, pero tal vez sea mejor aquí. Tengo una
aplicación hecha en C# para Windows que utiliza la clase
Access.ApplicationClass para crear una instancia y conseguir que mediante el
método oAccess.DoCmd.TransferText (...) vuelque a un fichero los datos de una
tabla.
Bien, pues esto quiero hacerlo pero desde un WebService. Es decir un
webmethod que invocado consiga crear este fichero en el servidor. Pero el
programa da una excepción nada más crear la instancia de Access: oAccess =
new Access.ApplicationClass(), dando el error "Acceso Denegado". Tanto la
carpeta com el fichero .mdb tienen permisos de escritura. De hecho creo
consultas en la BD sin problemas con el método CreateQueryDef.
¿Alguien tienen alguna idea de cual puede ser el problema? ¿Se os ocurre
otra solución?
Gracias de antemano

Preguntas similare

Leer las respuestas

#1 Ronald Ricardo Ramirez Moran
30/09/2005 - 23:58 | Informe spam
Hola,

Una consulta, el usuario ASP.NET tiene acceso sobre el componente COM de
Access que estas invocando?

Este podria ser el problema, ya que no puedes hacer la llamada a un
componente al que no tienes acceso.

Saludos
Ronald Ricardo Ramirez Moran
Microsoft Certified Professional C#

INETA Latam Volunteer

Blog:
http://dlanorok.blogspot.com
http://weblogs.foxite.com/DlanorOk
http://blogs.wdevs.com/DlanorOk


"David" wrote:

Hola! Había puesto este post en C#, pero tal vez sea mejor aquí. Tengo una
aplicación hecha en C# para Windows que utiliza la clase
Access.ApplicationClass para crear una instancia y conseguir que mediante el
método oAccess.DoCmd.TransferText (...) vuelque a un fichero los datos de una
tabla.
Bien, pues esto quiero hacerlo pero desde un WebService. Es decir un
webmethod que invocado consiga crear este fichero en el servidor. Pero el
programa da una excepción nada más crear la instancia de Access: oAccess =
new Access.ApplicationClass(), dando el error "Acceso Denegado". Tanto la
carpeta com el fichero .mdb tienen permisos de escritura. De hecho creo
consultas en la BD sin problemas con el método CreateQueryDef.
¿Alguien tienen alguna idea de cual puede ser el problema? ¿Se os ocurre
otra solución?
Gracias de antemano

Respuesta Responder a este mensaje
#2 David
03/10/2005 - 08:49 | Informe spam
Hola. Lo primero gracias por contestar. Las referencias que utiliza son
Microsoft Access 11.0 Object Library y Microsoft Office 11.0 Object Library
(ésta se pone por defecto al referenciar la primera). Tienen puestas a true
la propiedad "copia local". Y la carpeta donde se encuentra el proyecto de
WebService y todos los archivos tienen permisos de lectura (e incluso
escritura he probado) para el usuario ASP.NET. Supongo que será a lo que te
referías con acceso al componente COM. Pero sigue sin funcionar.

"Ronald Ricardo Ramirez Moran" escribió:

Hola,

Una consulta, el usuario ASP.NET tiene acceso sobre el componente COM de
Access que estas invocando?

Este podria ser el problema, ya que no puedes hacer la llamada a un
componente al que no tienes acceso.

Saludos
Ronald Ricardo Ramirez Moran
Microsoft Certified Professional C#

INETA Latam Volunteer

Blog:
http://dlanorok.blogspot.com
http://weblogs.foxite.com/DlanorOk
http://blogs.wdevs.com/DlanorOk


"David" wrote:

> Hola! Había puesto este post en C#, pero tal vez sea mejor aquí. Tengo una
> aplicación hecha en C# para Windows que utiliza la clase
> Access.ApplicationClass para crear una instancia y conseguir que mediante el
> método oAccess.DoCmd.TransferText (...) vuelque a un fichero los datos de una
> tabla.
> Bien, pues esto quiero hacerlo pero desde un WebService. Es decir un
> webmethod que invocado consiga crear este fichero en el servidor. Pero el
> programa da una excepción nada más crear la instancia de Access: oAccess =
> new Access.ApplicationClass(), dando el error "Acceso Denegado". Tanto la
> carpeta com el fichero .mdb tienen permisos de escritura. De hecho creo
> consultas en la BD sin problemas con el método CreateQueryDef.
> ¿Alguien tienen alguna idea de cual puede ser el problema? ¿Se os ocurre
> otra solución?
> Gracias de antemano
>
Respuesta Responder a este mensaje
#3 Ronald Ricardo Ramirez Moran
03/10/2005 - 18:19 | Informe spam
Hola de nuevo,

En lo anteriormente expuesto, no lei detenidamente tu mensaje, por lo que
pense que el problema era causado por el Componente de Access(Que es un COM),
mis disculpas por ello.

Ok, a ver si entiendo... quieres enviar los datos de una tabla a un fichero,
correcto?,

Bueno pues .NET te ofrece mucha funcionalidad y productividad con respecto
al envio de informacion hacia algun fichero, ademas del tratamiento de datos
no SQLServer7.0+, usando OLEDB, te recomiendo que leas la documentacion del
.NET Framework, ya que aun para enviar los datos a un fichero no creo que sea
necesario utilizar interoperacion COM via Web Service, aunque lo que mas bien
creo con respecto a lo que escribes, es que estas almacenando el archivo en
un lugar que tienes restringido o al que el usuario invitado* no tiene
acceso.

Por ejemplo... en mi caso cuando almaceno algun fichero, lo hago usando lo
siguiente:

Server.MapPath("MiFichero.XML")

Esto le dice al servicio que el fichero se almacenara en el mismo directorio
que mi aplicacion, ya que si obvias esto el componente determinara almacenar
el fichero en un lugar al que no tienes acceso, lo que en si acarrea que lo
trate de almacenar en su propio directorio(el del componente, peor si se
encuentra en Archivos de Programa), en la carpeta de temporales, y uno de las
restringidos: La carpeta Windows, Winnt, System32 o System, dependiendo del
caso; ya que debes de saber que todas estas carpetas muchas veces son
inaccesibles por un usuario anonimo o basicamente "Invitado", lo pudo haber
hecho que te ocurriera el error.

Basicamente no recomiendo almacenar datos en el mismo lugar de la
aplicacion, ya que muchas veces es bueno seguir normas de seguridad y
funcionalidad, en el ejemplo anterior solo lo hice para demostrar como
almacenar correctamente un fichero, pero si te recomendaria que lo almacenes
en un subdirectorio ubicado en dentro del directorio de la aplicacion.


-
* Invitado: se le dice asi al usuario que usa ASP.NET para poder acceder a
los datos, ademas del usuario invitado de Windows y el usuario invitado de
IIS que utiliza cuando se ingresa en modo anonimo.
-


Espero te ayude,

Saludos!
Ronald Ricardo Ramirez Moran
Microsoft Certified Professional C#

INETA Latam Volunteer

Blog:
http://dlanorok.blogspot.com
http://weblogs.foxite.com/DlanorOk
http://blogs.wdevs.com/DlanorOk


"David" wrote:

Hola. Lo primero gracias por contestar. Las referencias que utiliza son
Microsoft Access 11.0 Object Library y Microsoft Office 11.0 Object Library
(ésta se pone por defecto al referenciar la primera). Tienen puestas a true
la propiedad "copia local". Y la carpeta donde se encuentra el proyecto de
WebService y todos los archivos tienen permisos de lectura (e incluso
escritura he probado) para el usuario ASP.NET. Supongo que será a lo que te
referías con acceso al componente COM. Pero sigue sin funcionar.

"Ronald Ricardo Ramirez Moran" escribió:

> Hola,
>
> Una consulta, el usuario ASP.NET tiene acceso sobre el componente COM de
> Access que estas invocando?
>
> Este podria ser el problema, ya que no puedes hacer la llamada a un
> componente al que no tienes acceso.
>
> Saludos
> Ronald Ricardo Ramirez Moran
> Microsoft Certified Professional C#
>
> INETA Latam Volunteer
>
> Blog:
> http://dlanorok.blogspot.com
> http://weblogs.foxite.com/DlanorOk
> http://blogs.wdevs.com/DlanorOk
>
>
> "David" wrote:
>
> > Hola! Había puesto este post en C#, pero tal vez sea mejor aquí. Tengo una
> > aplicación hecha en C# para Windows que utiliza la clase
> > Access.ApplicationClass para crear una instancia y conseguir que mediante el
> > método oAccess.DoCmd.TransferText (...) vuelque a un fichero los datos de una
> > tabla.
> > Bien, pues esto quiero hacerlo pero desde un WebService. Es decir un
> > webmethod que invocado consiga crear este fichero en el servidor. Pero el
> > programa da una excepción nada más crear la instancia de Access: oAccess =
> > new Access.ApplicationClass(), dando el error "Acceso Denegado". Tanto la
> > carpeta com el fichero .mdb tienen permisos de escritura. De hecho creo
> > consultas en la BD sin problemas con el método CreateQueryDef.
> > ¿Alguien tienen alguna idea de cual puede ser el problema? ¿Se os ocurre
> > otra solución?
> > Gracias de antemano
> >
Respuesta Responder a este mensaje
#4 David
04/10/2005 - 09:33 | Informe spam
Hola Ronald, te voy a explicar más detalladamente el problema. Existe una BD
Access de la cual quiero volcar a un fichero varias tablas. Como bien dices
podría utilizar OleDB, conectarme y recorrer un dataset para ir generando un
fichero de texto, pero el elevado número de registros lo hace bastante lento.
No puedo crear un XML, ya que por requisitos debe ser un fichero de texto. La
única alternativa que se me ha ocurrido es usar interoperacion COM, ya que
una función de Access te genera un fichero de texto a partir de una tabla o
consulta.
Pero el problema viene al crear la instancia de Access, oAccess = new
Access.ApplicationClass(), dando el error "Acceso Denegado". En WinForms lo
he probado y funciona. Crea un proceso de Access (tal vez ahí esté el
problema) y a partir de ahí ya puedo llamar al método
oAccess.DoCmd.TransferText, que es bastante más rápido que recorrer el
dataset e ir insertando en un fichero.
De momento estoy utilizando la opción del dataset, pero espero que esto se
pueda solucionar. Muchas gracias de nuevo por el interes

David

"Ronald Ricardo Ramirez Moran" escribió:

Hola de nuevo,

En lo anteriormente expuesto, no lei detenidamente tu mensaje, por lo que
pense que el problema era causado por el Componente de Access(Que es un COM),
mis disculpas por ello.

Ok, a ver si entiendo... quieres enviar los datos de una tabla a un fichero,
correcto?,

Bueno pues .NET te ofrece mucha funcionalidad y productividad con respecto
al envio de informacion hacia algun fichero, ademas del tratamiento de datos
no SQLServer7.0+, usando OLEDB, te recomiendo que leas la documentacion del
.NET Framework, ya que aun para enviar los datos a un fichero no creo que sea
necesario utilizar interoperacion COM via Web Service, aunque lo que mas bien
creo con respecto a lo que escribes, es que estas almacenando el archivo en
un lugar que tienes restringido o al que el usuario invitado* no tiene
acceso.

Por ejemplo... en mi caso cuando almaceno algun fichero, lo hago usando lo
siguiente:

Server.MapPath("MiFichero.XML")

Esto le dice al servicio que el fichero se almacenara en el mismo directorio
que mi aplicacion, ya que si obvias esto el componente determinara almacenar
el fichero en un lugar al que no tienes acceso, lo que en si acarrea que lo
trate de almacenar en su propio directorio(el del componente, peor si se
encuentra en Archivos de Programa), en la carpeta de temporales, y uno de las
restringidos: La carpeta Windows, Winnt, System32 o System, dependiendo del
caso; ya que debes de saber que todas estas carpetas muchas veces son
inaccesibles por un usuario anonimo o basicamente "Invitado", lo pudo haber
hecho que te ocurriera el error.

Basicamente no recomiendo almacenar datos en el mismo lugar de la
aplicacion, ya que muchas veces es bueno seguir normas de seguridad y
funcionalidad, en el ejemplo anterior solo lo hice para demostrar como
almacenar correctamente un fichero, pero si te recomendaria que lo almacenes
en un subdirectorio ubicado en dentro del directorio de la aplicacion.


-
* Invitado: se le dice asi al usuario que usa ASP.NET para poder acceder a
los datos, ademas del usuario invitado de Windows y el usuario invitado de
IIS que utiliza cuando se ingresa en modo anonimo.
-


Espero te ayude,

Saludos!
Ronald Ricardo Ramirez Moran
Microsoft Certified Professional C#

INETA Latam Volunteer

Blog:
http://dlanorok.blogspot.com
http://weblogs.foxite.com/DlanorOk
http://blogs.wdevs.com/DlanorOk


"David" wrote:

> Hola. Lo primero gracias por contestar. Las referencias que utiliza son
> Microsoft Access 11.0 Object Library y Microsoft Office 11.0 Object Library
> (ésta se pone por defecto al referenciar la primera). Tienen puestas a true
> la propiedad "copia local". Y la carpeta donde se encuentra el proyecto de
> WebService y todos los archivos tienen permisos de lectura (e incluso
> escritura he probado) para el usuario ASP.NET. Supongo que será a lo que te
> referías con acceso al componente COM. Pero sigue sin funcionar.
>
> "Ronald Ricardo Ramirez Moran" escribió:
>
> > Hola,
> >
> > Una consulta, el usuario ASP.NET tiene acceso sobre el componente COM de
> > Access que estas invocando?
> >
> > Este podria ser el problema, ya que no puedes hacer la llamada a un
> > componente al que no tienes acceso.
> >
> > Saludos
> > Ronald Ricardo Ramirez Moran
> > Microsoft Certified Professional C#
> >
> > INETA Latam Volunteer
> >
> > Blog:
> > http://dlanorok.blogspot.com
> > http://weblogs.foxite.com/DlanorOk
> > http://blogs.wdevs.com/DlanorOk
> >
> >
> > "David" wrote:
> >
> > > Hola! Había puesto este post en C#, pero tal vez sea mejor aquí. Tengo una
> > > aplicación hecha en C# para Windows que utiliza la clase
> > > Access.ApplicationClass para crear una instancia y conseguir que mediante el
> > > método oAccess.DoCmd.TransferText (...) vuelque a un fichero los datos de una
> > > tabla.
> > > Bien, pues esto quiero hacerlo pero desde un WebService. Es decir un
> > > webmethod que invocado consiga crear este fichero en el servidor. Pero el
> > > programa da una excepción nada más crear la instancia de Access: oAccess =
> > > new Access.ApplicationClass(), dando el error "Acceso Denegado". Tanto la
> > > carpeta com el fichero .mdb tienen permisos de escritura. De hecho creo
> > > consultas en la BD sin problemas con el método CreateQueryDef.
> > > ¿Alguien tienen alguna idea de cual puede ser el problema? ¿Se os ocurre
> > > otra solución?
> > > Gracias de antemano
> > >
Respuesta Responder a este mensaje
#5 CESAR DE LA TORRE [MVP]
06/10/2005 - 16:41 | Informe spam
Lee el siguiente artículo del KB de Microsoft:
How To Run Office Macros by Using Automation from Visual Basic .NET
http://support.microsoft.com/defaul...en-us;3066 82

Probablemente también deberías hacer impersonación porque no es nada seguro
darle todos los permisos al usuario ASPNET. O sea, puedes hacer que se
impersone el WebService p.e. con un usuario Administrador en tu WebService
asmx, para lo cual puedes añadir una línea al Web.config del WebService
similar a la siguiente:
<identity impersonate="true" userName="UsuarioAdmin"
password="PasswordAdmin"/>

De todas formas, yo nunca haría un Servicio-Web-XML que publique datos de
una B.D. Access. Un WebService es un servicio que debe ser escalable para 'n'
usuarios y tanto el WebService como el sistema de Base de Datos que publique
debe de ser escalable y multithreading. De hecho, Microsoft no da soporte a
aplicaciones que accedan a Office (MS-Access entre ellos) desde aplicaciones
que no sean de interfaz gráfico. O sea, que un WebService o una aplicación
web ASP.NET accediendo a ACCESS, no es nada escalable y a la larga (en cuanto
haya un número de usuarios simultáneos no muy alto) te dará muchísimos
problemas.
Para un WebService-XML, se deben de utilizar Bases de Datos escalables como
SQL Server, Oracle, etc.

CESAR DE LA TORRE
Software Architect
[Microsoft MVP - XML Web Services]
[MCSE] [MCT]

Renacimiento
[Microsoft GOLD Certified Partner]


"David" wrote:

Hola Ronald, te voy a explicar más detalladamente el problema. Existe una BD
Access de la cual quiero volcar a un fichero varias tablas. Como bien dices
podría utilizar OleDB, conectarme y recorrer un dataset para ir generando un
fichero de texto, pero el elevado número de registros lo hace bastante lento.
No puedo crear un XML, ya que por requisitos debe ser un fichero de texto. La
única alternativa que se me ha ocurrido es usar interoperacion COM, ya que
una función de Access te genera un fichero de texto a partir de una tabla o
consulta.
Pero el problema viene al crear la instancia de Access, oAccess = new
Access.ApplicationClass(), dando el error "Acceso Denegado". En WinForms lo
he probado y funciona. Crea un proceso de Access (tal vez ahí esté el
problema) y a partir de ahí ya puedo llamar al método
oAccess.DoCmd.TransferText, que es bastante más rápido que recorrer el
dataset e ir insertando en un fichero.
De momento estoy utilizando la opción del dataset, pero espero que esto se
pueda solucionar. Muchas gracias de nuevo por el interes

David

"Ronald Ricardo Ramirez Moran" escribió:

> Hola de nuevo,
>
> En lo anteriormente expuesto, no lei detenidamente tu mensaje, por lo que
> pense que el problema era causado por el Componente de Access(Que es un COM),
> mis disculpas por ello.
>
> Ok, a ver si entiendo... quieres enviar los datos de una tabla a un fichero,
> correcto?,
>
> Bueno pues .NET te ofrece mucha funcionalidad y productividad con respecto
> al envio de informacion hacia algun fichero, ademas del tratamiento de datos
> no SQLServer7.0+, usando OLEDB, te recomiendo que leas la documentacion del
> .NET Framework, ya que aun para enviar los datos a un fichero no creo que sea
> necesario utilizar interoperacion COM via Web Service, aunque lo que mas bien
> creo con respecto a lo que escribes, es que estas almacenando el archivo en
> un lugar que tienes restringido o al que el usuario invitado* no tiene
> acceso.
>
> Por ejemplo... en mi caso cuando almaceno algun fichero, lo hago usando lo
> siguiente:
>
> Server.MapPath("MiFichero.XML")
>
> Esto le dice al servicio que el fichero se almacenara en el mismo directorio
> que mi aplicacion, ya que si obvias esto el componente determinara almacenar
> el fichero en un lugar al que no tienes acceso, lo que en si acarrea que lo
> trate de almacenar en su propio directorio(el del componente, peor si se
> encuentra en Archivos de Programa), en la carpeta de temporales, y uno de las
> restringidos: La carpeta Windows, Winnt, System32 o System, dependiendo del
> caso; ya que debes de saber que todas estas carpetas muchas veces son
> inaccesibles por un usuario anonimo o basicamente "Invitado", lo pudo haber
> hecho que te ocurriera el error.
>
> Basicamente no recomiendo almacenar datos en el mismo lugar de la
> aplicacion, ya que muchas veces es bueno seguir normas de seguridad y
> funcionalidad, en el ejemplo anterior solo lo hice para demostrar como
> almacenar correctamente un fichero, pero si te recomendaria que lo almacenes
> en un subdirectorio ubicado en dentro del directorio de la aplicacion.
>
>
> -
> * Invitado: se le dice asi al usuario que usa ASP.NET para poder acceder a
> los datos, ademas del usuario invitado de Windows y el usuario invitado de
> IIS que utiliza cuando se ingresa en modo anonimo.
> -
>
>
> Espero te ayude,
>
> Saludos!
> Ronald Ricardo Ramirez Moran
> Microsoft Certified Professional C#
>
> INETA Latam Volunteer
>
> Blog:
> http://dlanorok.blogspot.com
> http://weblogs.foxite.com/DlanorOk
> http://blogs.wdevs.com/DlanorOk
>
>
> "David" wrote:
>
> > Hola. Lo primero gracias por contestar. Las referencias que utiliza son
> > Microsoft Access 11.0 Object Library y Microsoft Office 11.0 Object Library
> > (ésta se pone por defecto al referenciar la primera). Tienen puestas a true
> > la propiedad "copia local". Y la carpeta donde se encuentra el proyecto de
> > WebService y todos los archivos tienen permisos de lectura (e incluso
> > escritura he probado) para el usuario ASP.NET. Supongo que será a lo que te
> > referías con acceso al componente COM. Pero sigue sin funcionar.
> >
> > "Ronald Ricardo Ramirez Moran" escribió:
> >
> > > Hola,
> > >
> > > Una consulta, el usuario ASP.NET tiene acceso sobre el componente COM de
> > > Access que estas invocando?
> > >
> > > Este podria ser el problema, ya que no puedes hacer la llamada a un
> > > componente al que no tienes acceso.
> > >
> > > Saludos
> > > Ronald Ricardo Ramirez Moran
> > > Microsoft Certified Professional C#
> > >
> > > INETA Latam Volunteer
> > >
> > > Blog:
> > > http://dlanorok.blogspot.com
> > > http://weblogs.foxite.com/DlanorOk
> > > http://blogs.wdevs.com/DlanorOk
> > >
> > >
> > > "David" wrote:
> > >
> > > > Hola! Había puesto este post en C#, pero tal vez sea mejor aquí. Tengo una
> > > > aplicación hecha en C# para Windows que utiliza la clase
> > > > Access.ApplicationClass para crear una instancia y conseguir que mediante el
> > > > método oAccess.DoCmd.TransferText (...) vuelque a un fichero los datos de una
> > > > tabla.
> > > > Bien, pues esto quiero hacerlo pero desde un WebService. Es decir un
> > > > webmethod que invocado consiga crear este fichero en el servidor. Pero el
> > > > programa da una excepción nada más crear la instancia de Access: oAccess =
> > > > new Access.ApplicationClass(), dando el error "Acceso Denegado". Tanto la
> > > > carpeta com el fichero .mdb tienen permisos de escritura. De hecho creo
> > > > consultas en la BD sin problemas con el método CreateQueryDef.
> > > > ¿Alguien tienen alguna idea de cual puede ser el problema? ¿Se os ocurre
> > > > otra solución?
> > > > Gracias de antemano
> > > >
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida