SQLDataReader: sin resultados
Frecuentes
Visto 836 veces
1
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?
2 Respuestas
2
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
1
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 asp.net .net sql sql-server or haz tu propia pregunta.
¿Qué pasa si solo usas
order by [index]
, u ordenar por alguna otra propiedad? - Jon Skeet@Jon Skeet, gracias. Devuelve dos filas en el orden correcto (sin problema) - w0051977
@ 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
@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? - w0051977