locked
error consulta linq RRS feed

  • Pregunta

  • <!-- /* Font Definitions */ @font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-1610611985 1107304683 0 0 159 0;} @font-face {font-family:Calibri; panose-1:2 15 5 2 2 2 4 3 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1610611985 1073750139 0 0 159 0;} @font-face {font-family:"DejaVu Sans Mono"; mso-font-charset:0; mso-generic-font-family:modern; mso-font-pitch:auto; mso-font-signature:0 0 0 0 0 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; mso-pagination:widow-orphan; mso-hyphenate:none; font-size:12.0pt; font-family:"Times New Roman","serif"; mso-fareast-font-family:"Times New Roman"; mso-ansi-language:CA; mso-fareast-language:AR-SA;} .MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-size:10.0pt; mso-ansi-font-size:10.0pt; mso-bidi-font-size:10.0pt;} @page Section1 {size:612.0pt 792.0pt; margin:70.85pt 3.0cm 70.85pt 3.0cm; mso-header-margin:36.0pt; mso-footer-margin:36.0pt; mso-paper-source:0;} div.Section1 {page:Section1;} --> Hola tengo esta consulta en linq donde hago un join i me funciona... el problema lo tengo si quiero cargar el campo correu  el cual tengo valores nulos...
    y me da error....
    como puedo cargar solamente los valores noNULOS?

    Dim vlocSQL = From vsQLrecor In My.Application.Ojcodi.vmemDataSet.santoral _
            Join vsqlAmistat In My.Application.Ojcodi.vmemDataSet.amistats _
            On vsqlAmistat.nom Equals vsQLrecor.nom _
            Where (vsQLrecor.data.Month = Now.Month And _
            (vsQLrecor.data.Day() - Now.Day) >= 0 And (vsQLrecor.data.Day() - Now.Day) <= vloc_entrada_variable_condicion_cerca) _
            Or (vsqlAmistat.data_naixement.Month = Now.Month And _
            (vsqlAmistat.data_naixement.Day() - Now.Day) >= 0 And (vsqlAmistat.data_naixement.Day() - Now.Day) <= vloc_entrada_variable_condicion_cerca)
            For Each vlocSant_aniver In vlocSQL.ToList
           

                nom = vlocSant_aniver.vsqlAmistat.nom
                cognom = vlocSant_aniver.vsqlAmistat.cognom
                data_naixement = vlocSant_aniver.vsqlAmistat.data_naixement
                data_sant = vlocSant_aniver.vsQLrecor.data

     'correu = vlocSant_aniver.vsqlAmistat.dades_electròniques  (aqui me da el error)
    domingo, 30 de agosto de 2009 6:31

Respuestas

  • hola

    una consulta dond ese encontraria la seccion Select en la consulta linq

    o sea esta es tu consulta linq

    Dim vlocSQL = From vsQLrecor In My.Application.Ojcodi.vmemDataSet.santoral _
                Join vsqlAmistat In My.Application.Ojcodi.vmemDataSet.amistats _
                On vsqlAmistat.nom Equals vsQLrecor.nom _
                Where (vsQLrecor.data.Month = Now.Month And _
                (vsQLrecor.data.Day() - Now.Day) >= 0 And (vsQLrecor.data.Day() - Now.Day) <= vloc_entrada_variable_condicion_cerca) _
                Or (vsqlAmistat.data_naixement.Month = Now.Month And _
                (vsqlAmistat.data_naixement.Day() - Now.Day) >= 0 And (vsqlAmistat.data_naixement.Day() - Now.Day) <= vloc_entrada_variable_condicion_cerca)

    en esta como seleccionas el objetos que devolvera la consulta, o se aflta la parte del Select

    aqui es lugo donde lo trabajas

            For Each vlocSant_aniver In vlocSQL.ToList

                nom = vlocSant_aniver.vsqlAmistat.nom
                cognom = vlocSant_aniver.vsqlAmistat.cognom
                data_naixement = vlocSant_aniver.vsqlAmistat.data_naixement
                data_sant = vlocSant_aniver.vsQLrecor.data
                 correu = vlocSant_aniver.vsqlAmistat.dades_electròniques  (aqui me da el error)


    o entendi mal y el For Each es parte de la consulta linq

    no deberia ser


    Dim vlocSQL = From vsQLrecor In My.Application.Ojcodi.vmemDataSet.santoral _
                Join vsqlAmistat In My.Application.Ojcodi.vmemDataSet.amistats _
                On vsqlAmistat.nom Equals vsQLrecor.nom _
                Where (vsQLrecor.data.Month = Now.Month And _
                (vsQLrecor.data.Day() - Now.Day) >= 0 And (vsQLrecor.data.Day() - Now.Day) <= vloc_entrada_variable_condicion_cerca) _
                Or (vsqlAmistat.data_naixement.Month = Now.Month And _
                (vsqlAmistat.data_naixement.Day() - Now.Day) >= 0 And (vsqlAmistat.data_naixement.Day() - Now.Day) <= vloc_entrada_variable_condicion_cerca)
                 Select New {
                     nom = vlocSant_aniver.vsqlAmistat.nom,
                     cognom = vlocSant_aniver.vsqlAmistat.cognom,
                    data_naixement = vlocSant_aniver.vsqlAmistat.data_naixement,
                    data_sant = vlocSant_aniver.vsQLrecor.data,
                     correu = vlocSant_aniver.vsqlAmistat.dades_electròniques
                }


    lo que marque en negrita pienso es la parte que falta.

    lo digo porque em guie de estos ejemplos:
    Crear DataTable desde una consulta (LINQ to DataSet)


    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Marcado como respuesta Spandau martes, 1 de septiembre de 2009 23:11
    martes, 1 de septiembre de 2009 15:05
  • ¿Al final de la consulta LINQ tienes una instrucción SELECT?

    Por mucho que miro la consulta, yo no veo la instrucción SELECT, y si no hay instrucción SELECT, ¿cómo seleccionas los campos que deseas recuperar?

    Tu código fuente es muy difícil de interpretar, debido a los nombres tan rebuscados y largos que utilizas como variables. No obstante te comento que, si el error lo obtienes al leer el valor de un campo concreto, tienes que verificar si su valor es NULL de la siguiente manera:

           If vlocSant_aniver.vsqlAmistat.dades_electròniques  Is DBNull.Value Then
                correu = "NULL"
           Else
                correu = vlocSant_aniver.vsqlAmistat.dades_electròniques 
           End If

    Insisto en lo de la instrucción SELECT, así como en los acentos de los nombres de las variables. Mejor será que los elimines.

    Enrique Martínez [MS MVP - VB]
    • Marcado como respuesta Spandau martes, 1 de septiembre de 2009 22:48
    martes, 1 de septiembre de 2009 15:08
    Moderador
  • "Spandau" preguntó:

    > como puedo cargar solamente los valores no NULOS?

    En la cláusula WHERE de la consulta LINQ, tendrás que indicar que deseas recuperar aquellos registros cuyo campo «correu» no sea NULL:

            ' Recuperamos aquellos registros del objeto DataTable llamado
            ' Clientes, cuyo campo CodPostal no sea NULL.
            '
            Dim query As IEnumerable(Of DataRow) = _
                From rowClientes As DataRow In Clientes _
                Where rowClientes.Item("CodPostal") IsNot DBNull.Value _
                Select rowClientes

    En el ejemplo, se comprende que la variable Clientes referencia a un objeto DataTable.

    Adapta el ejemplo a tu consulta LINQ.

    Un saludo


    Enrique Martínez [MS MVP - VB]
    domingo, 30 de agosto de 2009 8:49
    Moderador

  • > Public Property dades_electròniques() As String
    >            Get
    >                Try
    >                    Return CType(Me(Me.tableamistats.dades_electròniquesColumn),String)
    >                Catch e As Global.System.InvalidCastException
    >                    Throw New Global.System.Data.StrongTypingException("El valor de la columna
    >                         'dades electròniques' de la tabla 'amistats' es DBNull.", e)
    >                End Try
    >            End Get
    >            Set
    >                Me(Me.tableamistats.dades_electròniquesColumn) = value
    >            End Set
    > End Property

    Obtienes esa excepción cuando el valor Me.tableamistats.dades_electròniquesColumn no se puede convertir a String, y el bloque Catch está configurado para devolver la excepción al procedimiento llamador con la descripción «El valor de la columna 'dades electròniques' de la tabla 'amistats' es DBNull.»

    Un valor NULL no se puede leer. Para evitar leer valores NULL, en mi anterior mensaje te indiqué lo que tenías que hacer.









    Enrique Martínez [MS MVP - VB]
    miércoles, 2 de septiembre de 2009 8:03
    Moderador

Todas las respuestas

  • "Spandau" preguntó:

    > como puedo cargar solamente los valores no NULOS?

    En la cláusula WHERE de la consulta LINQ, tendrás que indicar que deseas recuperar aquellos registros cuyo campo «correu» no sea NULL:

            ' Recuperamos aquellos registros del objeto DataTable llamado
            ' Clientes, cuyo campo CodPostal no sea NULL.
            '
            Dim query As IEnumerable(Of DataRow) = _
                From rowClientes As DataRow In Clientes _
                Where rowClientes.Item("CodPostal") IsNot DBNull.Value _
                Select rowClientes

    En el ejemplo, se comprende que la variable Clientes referencia a un objeto DataTable.

    Adapta el ejemplo a tu consulta LINQ.

    Un saludo


    Enrique Martínez [MS MVP - VB]
    domingo, 30 de agosto de 2009 8:49
    Moderador
  • gracias softjaen por tu rapida respuesta..
    mis conocimientos en linq no son muy amplios... he estado buscando tutoriales en la red y no he encontrado mucha cosa....solamente he encontrado alguna pagina con ejemplos ..

    en mi caso si le añado:
    and dades_electròniques IsNot DBNull.Value
    no me devolvera los registros que no tengan  ningun valor en este campo...
    quizas no conozca mucho el lenguaje linq... pero como hago que me devuelva todos los registros con las condiciones siguientes y me muestre el campo dades_electròniques
    con o sin valor?  lo  que no entiendo de este caso que tengo la tabla en access(tengo pocos registros y access es más portable)... es que a  valor predeterminado en este campo
    tengo ="", por ello pensava que no me tendria que generar error...


    Dim vlocSQL = From vsQLrecor In My.Application.Ojcodi.vmemDataSet.santoral _
            Join vsqlAmistat In My.Application.Ojcodi.vmemDataSet.amistats _
            On vsqlAmistat.nom Equals vsQLrecor.nom _
            Where (vsQLrecor.data.Month = Now.Month And _
            (vsQLrecor.data.Day() - Now.Day) >= 0 And (vsQLrecor.data.Day() - Now.Day) <= vloc_entrada_variable_condicion_cerca) _
            Or (vsqlAmistat.data_naixement.Month = Now.Month And _
            (vsqlAmistat.data_naixement.Day() - Now.Day) >= 0 And (vsqlAmistat.data_naixement.Day() - Now.Day) <= vloc_entrada_variable_condicion_cerca)
            For Each vlocSant_aniver In vlocSQL.ToList
           
    lunes, 31 de agosto de 2009 7:08
  • acabo de revisar mi primera pregunta y me doy cuenta que la escribi mal... perdon,
    desearia que mi consulta me devolviese todos los registros con el campo dades_electròniques nulo y no nulo
    lunes, 31 de agosto de 2009 7:11
  • La verdad es que leyendo tu mensaje, ya no sé si deseas recuperar los registros cuyo campo «dades_electròniques» sean nulos, sean no nulos, o recuperar todos, sean o no nulos. ¿?

    Si deseas recuperar todos los registros, con independencia de que el campo sea o no NULL, en la cláusula WHERE no indiques

              ... Where dades_electròniques IsNot DBNull.Value ...

    Que deseas recuperar aquellos que sean NULL:

              ... Where dades_electròniques Is DBNull.Value ...

    Y si deseas recuperar aquellos que no sean NULL:

             ... Where dades_electròniques IsNot DBNull.Value ...


    Te aconsejaría que no incluyas acentos en los nombres de los campos, porque lo único que te puede pasar es que, más tarde o más temprano, tengas problemas.



    Enrique Martínez [MS MVP - VB]
    martes, 1 de septiembre de 2009 13:46
    Moderador
  • Gracias SoftJaén por tu clara respuesta,
    pero en el codigo primero no lo he incluido  nada relacionado en el campo dades_electròniques,
    pero cuando quiero cargar los valores si un valor contiene este campo null me genera error.... mi duda es,
    que aparte de darle valor predeterminado ="", ahun me da error ... si hay alguna manera de hacer que al cargar des de el linq darle un valor para que no me de error....

    gracias por adelantado...

    martes, 1 de septiembre de 2009 14:11
  • Lo siento muchísimo, pero no me entero de nada. No sé a qué error te refieres, y como te he comentado antes, tampoco sé qué tipos de registros deseas recuperar.
    Enrique Martínez [MS MVP - VB]
    martes, 1 de septiembre de 2009 14:18
    Moderador
  • Perdona por mis poco claros mensajes...

    si al codigo  linq, quiero cargar el campo dades_electròniques me genera el error de la ultima linea... desearia cargarlo sea null o no....

    Dim vlocSQL = From vsQLrecor In My.Application.Ojcodi.vmemDataSet.santoral _
                Join vsqlAmistat In My.Application.Ojcodi.vmemDataSet.amistats _
                On vsqlAmistat.nom Equals vsQLrecor.nom _
                Where (vsQLrecor.data.Month = Now.Month And _
                (vsQLrecor.data.Day() - Now.Day) >= 0 And (vsQLrecor.data.Day() - Now.Day) <= vloc_entrada_variable_condicion_cerca) _
                Or (vsqlAmistat.data_naixement.Month = Now.Month And _
                (vsqlAmistat.data_naixement.Day() - Now.Day) >= 0 And (vsqlAmistat.data_naixement.Day() - Now.Day) <= vloc_entrada_variable_condicion_cerca)
            For Each vlocSant_aniver In vlocSQL.ToList


                nom = vlocSant_aniver.vsqlAmistat.nom
                cognom = vlocSant_aniver.vsqlAmistat.cognom
                data_naixement = vlocSant_aniver.vsqlAmistat.data_naixement
                data_sant = vlocSant_aniver.vsQLrecor.data
                 correu = vlocSant_aniver.vsqlAmistat.dades_electròniques  (aqui me da el error)



    error:  Throw New Global.System.Data.StrongTypingException("El valor de la columna 'dades electròniques' de la tabla 'amistats' es DBNull.", e)

    gracias

    martes, 1 de septiembre de 2009 14:35
  • hola

    una consulta dond ese encontraria la seccion Select en la consulta linq

    o sea esta es tu consulta linq

    Dim vlocSQL = From vsQLrecor In My.Application.Ojcodi.vmemDataSet.santoral _
                Join vsqlAmistat In My.Application.Ojcodi.vmemDataSet.amistats _
                On vsqlAmistat.nom Equals vsQLrecor.nom _
                Where (vsQLrecor.data.Month = Now.Month And _
                (vsQLrecor.data.Day() - Now.Day) >= 0 And (vsQLrecor.data.Day() - Now.Day) <= vloc_entrada_variable_condicion_cerca) _
                Or (vsqlAmistat.data_naixement.Month = Now.Month And _
                (vsqlAmistat.data_naixement.Day() - Now.Day) >= 0 And (vsqlAmistat.data_naixement.Day() - Now.Day) <= vloc_entrada_variable_condicion_cerca)

    en esta como seleccionas el objetos que devolvera la consulta, o se aflta la parte del Select

    aqui es lugo donde lo trabajas

            For Each vlocSant_aniver In vlocSQL.ToList

                nom = vlocSant_aniver.vsqlAmistat.nom
                cognom = vlocSant_aniver.vsqlAmistat.cognom
                data_naixement = vlocSant_aniver.vsqlAmistat.data_naixement
                data_sant = vlocSant_aniver.vsQLrecor.data
                 correu = vlocSant_aniver.vsqlAmistat.dades_electròniques  (aqui me da el error)


    o entendi mal y el For Each es parte de la consulta linq

    no deberia ser


    Dim vlocSQL = From vsQLrecor In My.Application.Ojcodi.vmemDataSet.santoral _
                Join vsqlAmistat In My.Application.Ojcodi.vmemDataSet.amistats _
                On vsqlAmistat.nom Equals vsQLrecor.nom _
                Where (vsQLrecor.data.Month = Now.Month And _
                (vsQLrecor.data.Day() - Now.Day) >= 0 And (vsQLrecor.data.Day() - Now.Day) <= vloc_entrada_variable_condicion_cerca) _
                Or (vsqlAmistat.data_naixement.Month = Now.Month And _
                (vsqlAmistat.data_naixement.Day() - Now.Day) >= 0 And (vsqlAmistat.data_naixement.Day() - Now.Day) <= vloc_entrada_variable_condicion_cerca)
                 Select New {
                     nom = vlocSant_aniver.vsqlAmistat.nom,
                     cognom = vlocSant_aniver.vsqlAmistat.cognom,
                    data_naixement = vlocSant_aniver.vsqlAmistat.data_naixement,
                    data_sant = vlocSant_aniver.vsQLrecor.data,
                     correu = vlocSant_aniver.vsqlAmistat.dades_electròniques
                }


    lo que marque en negrita pienso es la parte que falta.

    lo digo porque em guie de estos ejemplos:
    Crear DataTable desde una consulta (LINQ to DataSet)


    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Marcado como respuesta Spandau martes, 1 de septiembre de 2009 23:11
    martes, 1 de septiembre de 2009 15:05
  • ¿Al final de la consulta LINQ tienes una instrucción SELECT?

    Por mucho que miro la consulta, yo no veo la instrucción SELECT, y si no hay instrucción SELECT, ¿cómo seleccionas los campos que deseas recuperar?

    Tu código fuente es muy difícil de interpretar, debido a los nombres tan rebuscados y largos que utilizas como variables. No obstante te comento que, si el error lo obtienes al leer el valor de un campo concreto, tienes que verificar si su valor es NULL de la siguiente manera:

           If vlocSant_aniver.vsqlAmistat.dades_electròniques  Is DBNull.Value Then
                correu = "NULL"
           Else
                correu = vlocSant_aniver.vsqlAmistat.dades_electròniques 
           End If

    Insisto en lo de la instrucción SELECT, así como en los acentos de los nombres de las variables. Mejor será que los elimines.

    Enrique Martínez [MS MVP - VB]
    • Marcado como respuesta Spandau martes, 1 de septiembre de 2009 22:48
    martes, 1 de septiembre de 2009 15:08
    Moderador
  • Gracias Softjaen por tu paciencia y Leandro Leandro Tuttini   por tus aportaciones...

    he añandido el codigo de Softjaen y no se porque todavia me genera el error global...cosa que no entiendo porque....
     <Global.System.Diagnostics.DebuggerNonUserCodeAttribute()>  _
            Public Property dades_electròniques() As String
                Get
                    Try
                        Return CType(Me(Me.tableamistats.dades_electròniquesColumn),String)
                    Catch e As Global.System.InvalidCastException
                        Throw New Global.System.Data.StrongTypingException("El valor de la columna 'dades electròniques' de la tabla 'amistats' es DBNull.", e)
                    End Try
                End Get
                Set
                    Me(Me.tableamistats.dades_electròniquesColumn) = value
                End Set
            End Property

    respecto al codigo de Ledandro tengo un error de sintaxis.... pero ya lo voy a arreglar
    Teneis razon.... TODOS los ejemplos o caso todos de la red  terminan con un SELECT (parecido al SQL) veo que tendre que cambiar de chip...
    he finalizado un curso presencial de NET y todos los ejemplos de consultas el profe no se porque las finalizava con el for Each......  pero le funcionava..
    Gracias

    martes, 1 de septiembre de 2009 23:01

  • > Public Property dades_electròniques() As String
    >            Get
    >                Try
    >                    Return CType(Me(Me.tableamistats.dades_electròniquesColumn),String)
    >                Catch e As Global.System.InvalidCastException
    >                    Throw New Global.System.Data.StrongTypingException("El valor de la columna
    >                         'dades electròniques' de la tabla 'amistats' es DBNull.", e)
    >                End Try
    >            End Get
    >            Set
    >                Me(Me.tableamistats.dades_electròniquesColumn) = value
    >            End Set
    > End Property

    Obtienes esa excepción cuando el valor Me.tableamistats.dades_electròniquesColumn no se puede convertir a String, y el bloque Catch está configurado para devolver la excepción al procedimiento llamador con la descripción «El valor de la columna 'dades electròniques' de la tabla 'amistats' es DBNull.»

    Un valor NULL no se puede leer. Para evitar leer valores NULL, en mi anterior mensaje te indiqué lo que tenías que hacer.









    Enrique Martínez [MS MVP - VB]
    miércoles, 2 de septiembre de 2009 8:03
    Moderador
  • Hola Spandau...

    A mi hace poco me paso algo similar con eso...

    lo que a mi me funciono fue, en el dataset designer,

    selecciona el campo que te marca el error (dades electrònique)  y ahi establece los valores  en la propiedades asi

    NullValue --> le asigne <Empty>

    DefaultValue --> lo deje en blanco.

    Ojala te sirva a ti tambien

    saludos!

    • Propuesto como respuesta arzamm viernes, 19 de octubre de 2012 20:28
    viernes, 19 de octubre de 2012 20:27