Principales respuestas
Pasaje de parametros entre Web Service y Linq

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...
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
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 -
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ón especificada no es vá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.
-
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ón especificada no es vá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 -
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.
-
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 -
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
-
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 -
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.
-
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
-
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