in

Problema DatagridView con servicio WCF

Last post 11-27-2007 11:17 by nmoro. 6 replies.
Page 1 of 1 (7 items)
Sort Posts: Previous Next
  • 10-17-2007 8:51

    • nmoro
    • Top 10 Contributor
    • Joined on 05-13-2007
    • Posts 23
    • Points 455

    Problema DatagridView con servicio WCF


    Hola,

    Estoy intentando hacer un datagridview en el que se pueda insertar, modificar y eliminar. La parte de reglas de negocio y de acceso a datos están en un proyecto de servicios WCF. En la parte del cliente pongo el datagridview, pero claro desde el diseñador no puedo configurar la base de datos y todo eso, porque de eso se encargan los servicios. Entonces tendré que llamar a unos procedimientos de los servicios. He creado el Dataset en la parte del servidor con el diseñador, junto a los servicios, y he añadido un TableAdapter, para luego en la parte de cliente utilizar este dataset que esta en la parte del servidor. En la parte del cliente he creado lo siguiente un datagridview y un bindingsource con el diseñador.

    El problema es como accedo a este dataset desde el cliente? Porque claro los metodos que son visibles desde el cliente son los que están declarados con [OperationContract]. Se puede hacer de alguna manera después de tener creado el DataSet por un lado con su Table Adapter y el cliente con el Datagridview para que cuando haga eventos en el datagrid llame al dataset del servidor.
    Sino como lo tengo que hacer para montar lo del datagridview y dataset en WCF.

    Como no consigo ver ningún elemento tengo la siguiente duda, cuando haga MITABLEADAPTER.update(MIDATASET), esto actualizara la base de datos o tengo que hacer algo más???

    He visto que en el GRIDVIEW se puede hacer un enlace de datos a un webservice, pero claro será para alguna función concreta que haya en el servicio, no para acceder a un dataset completo, no? Me gustaría saber como montar el webservice para subir datos.

    Gracias

    Un saludo

     

    • Post Points: 22
  • 10-26-2007 17:58 In reply to

    • jjofre
    • Top 10 Contributor
    • Joined on 01-24-2007
    • Posts 112
    • Points 1,434

    Re: Problema DatagridView con servicio WCF

    Filed under:
    • Post Points: 22
  • 11-15-2007 9:33 In reply to

    • nmoro
    • Top 10 Contributor
    • Joined on 05-13-2007
    • Posts 23
    • Points 455

    Re: Problema DatagridView con servicio WCF

    Hola,

    Al final lo que hago no es intentar publicar el DataSet, sino una función que me devuelva ese DataSet.

    He intentado devolver el Datatable desde el webservice con una funcion que es: public DataTable GetDataTable(); con el OperationContract.

    El problema es que cuando lo añado al cliente se ve que en el proxy la función ha cambiado a:

    public pruebaDataset1.localhost.GetDataTableResponseGetDataTableResult GetDataTable();

    y claro cuando lo utilizo en el cliente me da este error al compilar:

    Error: No se puede convertir implícitamente el tipo 'pruebaDataset1.localhost.GetDataTableResponseGetDataTableResult' a 'System.Data.DataTable'.

    Entonces, ¿cómo lo puedo hacer para devolver un DataTable, sin tener que modificar el proxy a mano?

    He intentado también devolver un DataSet y eso sí que lo reconoce desde el servicio como correcto, pero al ejecutar el cliente en la línea del GetDataSet me dice: Se ha terminado la conexión: La conexión ha terminado de forma inesperada. ¿No se puede hacer un GetDataSet en el servicio?

    He intentado también utilizar DataRow en un procedimiento del servicio (update) para sólo actualizar una fila y al ejecutar el servicio me da este error en la página donde pone si se creó el servicio:
    El tipo 'System.Data.DataRow' no se puede serializar. Intente marcarlo con el atributo DataContractAttribute y marque todos los miembros que desee serializar con el atributo DataMemberAttribute.

    ¿Entonces tampoco podré actualizar una única fila, siempre tendré que mandar toda la tabla? 

    Así que me gustaría saber que puedo devolver del servicio para poder cargar los datos en el datagridview del cliente. Algo se podrá enviar de un lado a otro, no? De esta forma podría comprobar los cambios con un dataset que tenga creado en el cliente o algo parecido. Pero si no puedo obtener los datos, tampoco puedo comprobar si ha habido cambios.

    Me podríais dar alguna solución a esto, por favor.

    Gracias.

    • Post Points: 22
  • 11-22-2007 20:03 In reply to

    Re: Problema DatagridView con servicio WCF

    Hola Nieves,

    Te adjunto un ejemplo que carga un dataset obtenido con un servicio WCF en un DataGridView. La información la extrae de la tabla Products de la base de datos de ejemplo Northwind.

    El ejemplo es muy simple tienes dos botones cargar y actualizar, éstos llama a dos métodos distintos del servicio que cargan la información y actualizan las filas que hayas modificado desde el grid en base de datos.

    Como te comenté hay muchísimas formas de hacer esto, yo solamente te muestro un ejemplo incompleto y sin ningún tipo de control de errores, de como podrías hacerlo utilizando datasets como me comentaste, pero que no es ni la única ni la mejor forma de hacerlo. La información la podrías pasar utilizando collections, clases propias, datasets tipados, datatables ....

    Para ejecutar la aplicación tendrás que cambiar la connection string y el userPrincipalName en los ficheros de configuración.

    Suerte.

    Jose Fco Bonnin
    -----------------------
    Coordinador Baleares on .NET
    http://blogs.clearscreen.com/jfbonnin/
    • Post Points: 22
  • 11-23-2007 10:07 In reply to

    • nmoro
    • Top 10 Contributor
    • Joined on 05-13-2007
    • Posts 23
    • Points 455

    Re: Problema DatagridView con servicio WCF

    Hola,

    Lo he probado adaptándolo a mi ejemplo, que no es una librería de clases WCF sino un sitio web WCF. Pero bueno probando con una select de pocos campos va bien, pero si empiezo a poner más me da este error al cargar los datos:

    Se superó la cuota de tamaño máximo para los mensajes entrantes (65536). Para aumentar la cuota, use la propiedad MaxReceivedMessageSize en el elemento de enlace correspondiente.

    He intentado modificar esta cuota, pero no parece que lo esté haciendo bien porque sigue poniendo lo que quiere.

    Así es como lo he puesto en el web.config:

    Antes de la etiqueta <services>:

    <bindings>
          <wsHttpBinding>
            <binding name="WSHttpBinding_IServicePrueba2" closeTimeout="00:01:00"
                        openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                        bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
                        maxBufferPoolSize="524288" maxReceivedMessageSize="70000"
                        messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
                        allowCookies="false">
              <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                  maxBytesPerRead="4096" maxNameTableCharCount="16384" />
              <reliableSession ordered="true" inactivityTimeout="00:10:00"
                  enabled="false" />
              <security mode="Message">
                <transport clientCredentialType="Windows" proxyCredentialType="None"
                    realm="" />
                <message clientCredentialType="Windows" negotiateServiceCredential="true"
                    algorithmSuite="Default" establishSecurityContext="true" />
              </security>
            </binding>
          </wsHttpBinding>
    </bindings>

     
    En la etiqueta de <services>:

    <service name="ServicePrueba2" behaviorConfiguration="ServicePrueba2Behavior">
            <endpoint contract="IServicePrueba2" name="WSHttpBinding_IServicePrueba2" binding="wsHttpBinding"
    bindingConfiguration="WSHttpBinding_IServicePrueba2"  />

     

    Actualizar el dataset: UpdateProducts se encarga de modificar, insertar y eliminar, no?

     
    Muchas gracias

    Un saludo
     

    • Post Points: 22
  • 11-23-2007 15:12 In reply to

    • jjofre
    • Top 10 Contributor
    • Joined on 01-24-2007
    • Posts 112
    • Points 1,434

    Re: Problema DatagridView con servicio WCF

    Filed under:
    • Post Points: 22
  • 11-27-2007 11:17 In reply to

    • nmoro
    • Top 10 Contributor
    • Joined on 05-13-2007
    • Posts 23
    • Points 455

    Re: Problema DatagridView con servicio WCF

    Hola,

    He probado varias cosas de lo de MaxReceivedMessage y sigue sin funcionar. Pero mientras no cargue muchos datos me va bien, el problema será cuando cargue más datos.

    Tengo un problema con el ejemplo de Dataset, como comenté lo he adaptado a mi proyecto, que es un sitio web WCF y un cliente y no va bien.
    El cargar sí que va bien, ningún problema e insertar también va bien. En cambio modificar falla a veces.
    Si inserto una fila y despues la quiero modificar salta esta excepción: DBConcurrencyException: "Infracción de concurrencia: UpdateCommand afectó a 0 de los 1 registros esperados."
    En cambio si salgo y vuelvo a entrar sí que me deja modificar sin problema.

    Después el caso de una tabla que no me deja modificar las filas existentes de ninguna manera, en cambio si inserto una fila pasa lo mismo que el caso anterior. Cuando vuelvo a entrar me deja modificar esta fila insertada y sigue sin dejar modificar las filas que existían antes.

    ¿Por qué puede ser?

    En concreto falla la sentencia del Update del servicio: da.Update(changes);

    Es normal que en da.UpdateCommand ponga null despues de hacer el builder.GetUpdateCommand()? En cambio si miro en la inspección rápida de builder.UpdateCommand() pone una sentencia de update con parámetros que es la del GetUpdateCommand.

     
    Gracias

    Un saludo
     

    • Post Points: 5
Page 1 of 1 (7 items)
Baleares on .NET®
Powered by Community Server (Commercial Edition), by Telligent Systems