SQLDataReader: sin resultados

Por favor, eche un vistazo al siguiente esquema:

CREATE TABLE Person (id int not null identity,[index] varchar(30),datecreated datetime)

insert into Person ([index],datecreated) values ('4,5,6','2011-01-01')
insert into Person ([index],datecreated) values ('1,2,3','2011-02-02')
insert into Person ([index],datecreated) values ('7,8','2012-02-02')

y el siguiente código:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Try
            Dim _ConString As String = WebConfigurationManager.ConnectionStrings("dbConnection").ConnectionString
            Dim connection As New SqlConnection(_ConString)
            Dim objCommand As New SqlCommand
            Dim objDR As SqlDataReader
            Dim sqlString As String

            sqlString = "SELECT * FROM Person WHERE datecreated < '2012-01-01' "


            objCommand.CommandText = sqlString & " ORDER BY left (substring([index],charindex(',',[index])+1,200),  " & _
            " charindex(',',substring([index],charindex(',',[index])+1,200))-1)"
            objCommand.Connection = connection
            connection.Open()
            objDR = objCommand.ExecuteReader
            If objDR.HasRows Then
                MsgBox("Has Rows")
            Else
                MsgBox("No Rows")
            End If
            connection.Close()
        Catch ex As Exception

        End Try

    End Sub

Este código es parte de una función en el sistema en vivo. Cada vez que ejecuto la aplicación completa en modo de desarrollo (o en vivo) con ORDER BY; el DataReader no tiene registros y aparece un cuadro de mensaje que dice Sin filas (esto no ocurre cuando ejecuto el código anterior de forma aislada). Se devuelve el número correcto de filas después de comentar la cláusula ORDER BY. No se lanza ninguna excepción. ¿Hay alguna manera de ver si SQLDataReader ha producido un error?

ACTUALIZAR Por favor, no publique respuestas sobre pérdidas de memoria, por ejemplo, conexión no cerrada, etc. o el hecho de que las excepciones no se manejan. me doy cuenta de esto Produje el código anterior para intentar recrear el problema.

ACTUALIZACIÓN2 23/05/2012 19:30 gmt Realicé algunas pruebas adicionales y parece que la discrepancia ocurre cuando se usan consultas parametrizadas, es decir, una fila regresará en SQL Studio Manager pero no en la aplicación después de ejecutar el objeto de comando. Sé que las consultas parametrizadas se almacenan en caché. ¿Hay alguna razón por la cual el plan de ejecución parametrizado podría ser diferente al plan de ejecución no parametrizado?

preguntado el 22 de mayo de 12 a las 20:05

¿Qué pasa si solo usas order by [index], u ordenar por alguna otra propiedad? -

@Jon Skeet, gracias. Devuelve dos filas en el orden correcto (sin problema) -

@ w0051977: De acuerdo, sospecho que una fila se "elimina" si el cálculo de su "clave" de pedido sale mal, básicamente, por ejemplo, porque está tomando una subcadena fuera de los límites. -

@Jon Skeet, ese fue mi primer pensamiento, pero este no parece ser el caso. ¿Hay alguna propiedad en SQLDataReader que me diga si esto ha sucedido? -

2 Respuestas

Sospecho que ORDER BY omite cualquier fila en la que la proyección de la fila a la clave provoque un error. Por ejemplo, está utilizando muchas operaciones de cadena en ese orden, incluida la subcadena. ¿Qué sucede si los argumentos de la subcadena están fuera del rango de la cadena?

Te sugiero que pruebes:

SELECT [insert order by projection here] FROM Person

y mira lo que pasa ahí - para eliminar ORDEN POR de la ecuación. También te sugiero que hagas esto desde SQL Management Studio (o lo que sea) en lugar de experimentar a través del código :)

contestado el 22 de mayo de 12 a las 20:05

@w0051977: ¿El original con ORDEN POR, o la versión "simplemente seleccione la clave de pedido"? - jon skeet

¿Puede sugerir una manera de investigar esto más a fondo? - w0051977

Intente crear un procedimiento almacenado y llamar al procedimiento almacenado en lugar de solo SQL sin formato. Eso debería ayudar a sincronizar las diferencias entre las consultas desde la aplicación y desde Management Studio. - ulty4life

@Jon Skeet, actualicé mi pregunta (actualización 2). ¿Podría echar un vistazo, por favor? Los resultados de la consulta son diferentes dependiendo de si uso consultas parametrizadas o consultas no parametrizadas. - w0051977

Para investigar más, recomendaría usar SQL Profiler. No solo podrá ver la consulta exacta que proviene de la aplicación, sino que también podrá devolver cualquier error que pueda generarse (pero no devolverse), además del plan de consulta SQL.

contestado el 23 de mayo de 12 a las 19:05

Gracias. ¿Sabes si hay alguna razón por la que una consulta se puede optimizar de forma diferente dependiendo de si se utiliza una consulta parametrizada o una consulta no parametrizada? - w0051977

Hay muchas razones diferentes por las que las consultas se optimizan de diferentes maneras: obtener los planes de consulta para ambos ayudará en la investigación. - david simione

Gracias. He marcado esto como la respuesta correcta debido a la recomendación de usar SQL Profiler. Usando SQL Profiler, pude ver que la consulta se optimizaba de manera diferente para consultas parametrizadas y consultas no parametrizadas. Uso de consultas parametrizadas; el plan de ejecución mostró que ORDER BY se estaba ejecutando antes de la unión y, por lo tanto, la falla. - w0051977

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.