none
Pasaje de parametros entre Web Service y Linq RRS feed

  • Pregunta

  • en las siguientes lineas tengo unos problemas

    el web service manda esto a la clase Sistema_Linq

    //donde PROFESOR es el nombre de la tabla

    [

    WebMethod]

     

    public PROFESOR BUSCAR_PROFESOR(string ape_nom, string dpto)

    {

     

    SISTEMA_LINQ OBJ = new SISTEMA_LINQ();

     

    PROFESOR prof = OBJ.BUSCAR_PROFESOR(ape_nom, dpto);

     

    return prof;

    }

     

     

    y en LINQ

     

    internal PROFESOR BUSCAR_PROFESOR(string ape_nom, string dpto)

    {

     

    SCYT_LINQDataContext myDB = new SCYT_LINQDataContext();

     

    var usu = from u in myDB.PROFESOR

     

    where u.APE_NOM == ape_nom

     

    select u;

     

    if (usu.Count() > 0)

     

    return usu.First();

     

    else

     

    return null;

    }

     

     

     

     

     

    y me genera el siguiente mensaje.

    System.InvalidCastException: La conversión especificada no es válida.
    
    
    
     en System.Data.Linq.SqlClient.SqlProvider.Execute(Expression query, QueryInfo queryInfo, IObjectReaderFactory factory, Object[] parentArgs, Object[] userArgs, ICompiledSubQuery[] subQueries, Object lastResult)
    
    
    
     en System.Data.Linq.SqlClient.SqlProvider.ExecuteAll(Expression query, QueryInfo[] queryInfos, IObjectReaderFactory factory, Object[] userArguments, ICompiledSubQuery[] subQueries)
    
    
    
     en System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query)
    
    
    
     en System.Data.Linq.DataQuery`1.System.Linq.IQueryProvider.Execute[S](Expression expression)
    
    
    
     en System.Linq.Queryable.First[TSource](IQueryable`1 source)
    
    
    
     en SCYT_WS.SISTEMA_LINQ.BUSCAR_PROFESOR(String ape_nom, String dpto) en C:\SCYT\SCYT_WS\SCYT_LINQ.designer.cs:línea 719
    
    
    
     en SCYT_WS.Service1.BUSCAR_PROFESOR(String ape_nom, String dpto) en C:\SCYT\SCYT_WS\Service1.asmx.cs:línea 32
    
    
    
    

    si alguien me puede ayudar soy nuevo programando en esto...

    miércoles, 23 de junio de 2010 21:11

Respuestas

  • el problema estaba en los parametros que enviava Linq reemplaze PROFESOR por List<PROFESOR> y andubo, muchas gracias a todos por su colaboracion.
    • Marcado como respuesta willy_perico lunes, 28 de junio de 2010 13:22
    lunes, 28 de junio de 2010 13:22

Todas las respuestas

  • hola

    una consulta esta clase PROFESOR que devuelves en el metodo BUSCAR_PROFESOR() de linq es uan clase creada por ti, o es la clase que ha creado linq to sql ?

    lo que veo es que por ahi debas convertir de tipo tu consulta, y no usar el var para asignar la query

    podria ser algo asi

    internal PROFESOR BUSCAR_PROFESOR(string  ape_nom, string dpto)
    {

        SCYT_LINQDataContext myDB = new SCYT_LINQDataContext();


        List<PROFESOR> usu = (from u in myDB.PROFESOR
                            where u.APE_NOM == ape_nom
                            select u).Tolist<PROFESOR>();

         
        if (usu.Count() > 0)
            return usu.First();
        else
            return null;

    }

    si es que el PROFESOR es una clase compatible con myDB.PROFESOR, o sea es la clase crrada por linq to sql

     

    sino deberias ser algo como esto

    internal PROFESOR BUSCAR_PROFESOR(string  ape_nom, string dpto)
    {

        SCYT_LINQDataContext myDB = new SCYT_LINQDataContext();


        List<PROFESOR> usu = (from u in myDB.PROFESOR
                                where u.APE_NOM == ape_nom
                                select new PROFESOR()
                                {
                                    Id = u.Id,
                                    Nombre = u.Nombre,
                                    Apellido = u.Appelido
                                }).ToList<PROFESOR>();

         
        if (usu.Count() > 0)
            return usu.First();
        else
            return null;

    }

     

    como veras hay una transformacion de un tipo de entidad en otro, seria un mapeo de propiedades que conviertes de una clase en otra, para que sean compatible con el el tipo especificado para devolver

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    jueves, 24 de junio de 2010 3:36
  • Gracias por responder.

    La clase PROFESOR es creada por Linq to SQL, y con la midificacion me genera el siguiente mensaje

    System.InvalidCastException: La conversi&#243;n especificada no es v&#225;lida.
       en System.Data.SqlClient.SqlBuffer.get_Decimal()
       en System.Data.SqlClient.SqlDataReader.GetDecimal(Int32 i)
       en Read_PROFESOR(ObjectMaterializer`1 )
       en System.Data.Linq.SqlClient.ObjectReaderCompiler.ObjectReader`2.MoveNext()
       en System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
       en System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
       en SCYT_WS.SISTEMA_LINQ.BUSCAR_PROFESOR(String ape_nom, String dpto) en C:\SCYT\SCYT_WS\SCYT_LINQ.designer.cs:línea 1155   //  List<PROFESOR>....
       en SCYT_WS.Service1.BUSCAR_PROFESOR(String ape_nom, String dpto) en C:\SCYT\SCYT_WS\Service1.asmx.cs:línea 35  //  PROFESOR prof = OBJ.BUSCAR_PROFESOR(ape_nom, dpto);

    con el codigo que puse al depurar paso a paso por instrucciones busca el registro y devuelve los datos, pero cuando no es paso a paso me genera un error.

    jueves, 24 de junio de 2010 14:56
  • hola

    pero segun puedo ver en la descripcion del error el falo se da porque una conversion a decimal

    veras qeu menciona

    System.InvalidCastException: La conversi&#243;n especificada no es v&#225;lida.
       en System.Data.SqlClient.SqlBuffer.get_Decimal()
       en System.Data.SqlClient.SqlDataReader.GetDecimal(Int32 i)
       en Read_PROFESOR(ObjectMaterializer`1 )

     

    lo que podrias ahcer es poner en el codigo linea de debug para que registre por donde va pasando cuando ejecuta sin debug, el registro podrias ahcerlo en un archivo de texto, y loguear el error, ya que por lo que veo es muy puntual el problema y en debug si funciona

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    jueves, 24 de junio de 2010 16:00
  • de la linea de Linq

    List

     

    <PROFESOR> usu = (from u in myDB.PROFESOR

                                     where u.APE_NOM == ape_nom

                                     select u).ToList<PROFESOR>();

     

    salta a la linea 

    [

    Table(Name="dbo.PROFESOR")]

     

    public partial class PROFESOR : INotifyPropertyChanging, INotifyPropertyChanged

    y de a ahi a la linea

     

    public PROFESOR()

    {

    OnCreated();

    }

    PROFESOR()

    {

    y ahi termina el ciclo mostrando el mensaje citado.

     

     

     

    jueves, 24 de junio de 2010 18:05
  • hola

    cuando pegues codigo en el foro pasalo primero por el notepad asi le quitas el formato, es mejor tener el codigo sin color que con sin identacion correcta

    no llego a entender que es esta linea

    [ Table(Name="dbo.PROFESOR")]

    public partial class PROFESOR : INotifyPropertyChanging, INotifyPropertyChanged

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    jueves, 24 de junio de 2010 18:57
  • namespace SCYT_WS
    {
      ...
      ...
      ...
      [System.Data.Linq.Mapping.DatabaseAttribute(Name="SCYT_DB")]
      ...
      ...
      ...
    // toda esta parte es creada automaticamente por Linq to SQL
      [Table(Name="dbo.PROFESOR")]
      public partial class PROFESOR : INotifyPropertyChanging, INotifyPropertyChanged
      {
      
     private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);
      
     private int _COD_PROFESOR;
      
     private string _APE_NOM;
      
     private string _DEPARTAMENTO;
      
        #region Extensibility Method Definitions
        partial void OnLoaded();
        partial void OnValidate(System.Data.Linq.ChangeAction action);
        partial void OnCreated();
        partial void OnCOD_PROFESORChanging(int value);
        partial void OnCOD_PROFESORChanged();
        partial void OnAPE_NOMChanging(string value);
        partial void OnAPE_NOMChanged();
        #endregion
      
        public PROFESOR()
        {
     OnCreated();
        }

        //*****  llega asta esta linea y termian mostrando el mensaje

      } 
    //++++++++++++++++++++++++++++++++++++++++++++++++
      ...
      ...
      ...
      partial class SISTEMA_LINQ
      {
         internal SCYT_WS.PROFESOR BUSCAR_PROFESOR(string ape_nom, string dpto)
            {
                SCYT_LINQDataContext myDB = new SCYT_LINQDataContext();

                List<PROFESOR> usu = (from u in myDB.PROFESOR where u.APE_NOM == ape_nom select u).ToList<PROFESOR>();

                if (usu.Count() > 0)
                    return usu.First();
                else
                    return null;
            }
       }
    }


    primero ejecuta el llamdo a List<PROFESOR>....

    luego salta a la linea que esta arriba public PROFESOR

    jueves, 24 de junio de 2010 19:50
  • hola

    algo no me termina de cerrar porque veo que el metodo devuelve un SCYT_WS.PROFESOR, pero en el linq usas solo PROFESOR

    internal SCYT_WS.PROFESOR BUSCAR_PROFESOR(string ape_nom, string dpto)
            {
                SCYT_LINQDataContext myDB = new SCYT_LINQDataContext();

                List<PROFESOR > usu = (from u in myDB.PROFESOR where u.APE_NOM == ape_nom select u).ToList<PROFESOR >();

                if (usu.Count() > 0)
                    return usu.First();
                else
                    return null;
            }

    me refiero a los puntos que marco en negrita, parecieran ser diferentes entidades, o es la misma ?

    no deberias hacer

    internal PROFESOR BUSCAR_PROFESOR(string ape_nom, string dpto)
            {
                SCYT_LINQDataContext myDB = new SCYT_LINQDataContext();

                List<PROFESOR > usu = (from u in myDB.PROFESOR where u.APE_NOM == ape_nom select u).ToList<PROFESOR >();

                if (usu.Count() > 0)
                    return usu.First();
                else
                    return null;
            }

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    jueves, 24 de junio de 2010 22:30
  • Negativo sigue saliendo el mismo error con las modificaciones.

    pero no entiendo con

    var usu = from u int myDB.PROFESOR....

    depurando lentamente me devuelve el registro, pero en ejecucion normal de genera el error.

    y con lo que me pasaste  

    list<PROFESOR> usu = from u int myDB.PROFESOR....

    no lo hace

    gracias.

    viernes, 25 de junio de 2010 13:12
  • el problema estaba en los parametros que enviava Linq reemplaze PROFESOR por List<PROFESOR> y andubo, muchas gracias a todos por su colaboracion.
    • Marcado como respuesta willy_perico lunes, 28 de junio de 2010 13:22
    lunes, 28 de junio de 2010 13:22
  • Hola Willy, disculpa la molestia pero estoy haciendo una aplicacion movil y me gustari saber si puedo utilizar un web service q utilice linq to sql. porq lo he intente pero cuando accedo al web service desde del emulador de la pda. me brota este error:

    System.NullReferenceException: Referencia a objeto no establecida como instancia de un objeto.
    en campeonato.DataClassesCampeonatoDataContext..ctor() en C:\Documents and Settings\Judith\Mis documentos\Visual Studio 2008\Projects\campeonato\campeonato\DataClassesCampeonato.designer.cs:línea 56
    en campeonato.LinqTest..ctor() en C:\Documents and Settings\Judith\Mis documentos\Visual Studio 2008\Projects\campeonato\campeonato\negocio.cs:línea 21
    en campeonato.WebServiceEquipo..ctor() en C:\Documents and Settings\Judith\Mis documentos\Visual Studio 2008\Projects\campeonato\campeonato\WebServices\WebServiceEquipo.asmx.cs:línea 24
    domingo, 4 de julio de 2010 3:37