mvc - gridview asp net c# sql server
SqlDataReader.HasRows devuelve falso desde la actualizaciĆ³n de SQL 2008 (7)
Tengo un sitio web ASP.NET 2.0 que se conecta a una base de datos SQL. Actualicé el servidor SQL de 2000 a 2008 y, desde entonces, una página se niega a funcionar.
He resuelto que el problema es que la llamada a SqlDataReader.HasRows devuelve falso aunque el conjunto de datos no está vacío y la eliminación de la comprobación permite que el lector pase por el lector.Leer () para acceder a los datos esperados.
_connectionString = WebConfigurationManager.ConnectionStrings["SQLServer"].ConnectionString;
SqlConnection connection = new SqlConnection(_connectionString);
SqlCommand command = new SqlCommand(searchtype, connection);
SqlParameter _parSeachTerm = new SqlParameter("@searchterm", SqlDbType.VarChar, 255);
_parSeachTerm.Value = searchterm;
command.Parameters.Add(_parSeachTerm);
command.CommandType = CommandType.StoredProcedure;
try
{
connection.Open();
SqlDataReader reader = command.ExecuteReader();
if (reader.HasRows) //this always returns false!?
{
while (reader.Read())
{...
¿Alguien tiene alguna idea de lo que está pasando? Hay bloques de código similares en otras páginas donde HasRows devuelve el valor correcto.
EDITAR- Solo para aclarar, el procedimiento almacenado SÍ devuelve resultados que he confirmado porque el ciclo funciona bien si elimino la verificación HasRows. Cambiar el nombre del servidor SQL en la cadena de conexión a una base de datos idéntica que se ejecuta en SQL 2000 hace que el problema desaparezca. He comprobado que NOCOUNT está desactivado, ¿qué otra cosa podría hacer que HasRows devuelva falso cuando ese no es el caso?
EDIT2- Aquí está el SP
CREATE PROCEDURE StaffEnquirySurnameSearch
@searchterm varchar(255)
AS
SELECT AD.Name, AD.Company, AD.telephoneNumber, AD.manager, CVS.Position, CVS.CompanyArea, CVS.Location, CVS.Title, AD.guid AS guid,
AD.firstname, AD.surname
FROM ADCVS AD
LEFT OUTER JOIN CVS ON
AD.Guid=CVS.Guid
WHERE AD.SurName LIKE @searchterm
ORDER BY AD.Surname, AD.Firstname
GO
Muchas gracias de antemano.
Estoy especulando de nuevo.
¿Tiene múltiples lectores de datos abiertos por casualidad?
Agregar MARS_Connection = yes; O MultipleActiveResultSets = verdadero para la cadena de conexión, si eso ayuda.
Además, su uso de conexión y lector de datos no es una forma recomendada de hacer las cosas
una forma más simple de escribirlo podría ser
using (connection cnn = new Connection(...)
{
using (SqlDataReader rdr = ....
{
//some code which deals with datareader
}
}
Esto cerrará la conexión y el lector de datos una vez que se complete la operación.
¿Funciona el procedimiento almacenado si lo invocas directamente, digamos en SSMS? Comenzaría asegurándome de que así sea.
¿No estás usando RAISEERROR por casualidad? Encontramos algunos problemas usando el mismo patrón que el anterior (compruebe HasRows, luego reader.Read ()) y descubrí que si RAISEERROR se usó con un cierto código de error (por encima de 16, creo) entonces el HasRows devolvería falso y tendríamos problemas para atrapar una excepción
Creo que tienes NOCOUNT al revés. Creo que NOCOUNT debe estar encendido para que esto funcione.
En su procedimiento almacenado, agregue SET NOCOUNT ON después del AS y antes de cualquier código. De lo contrario, devuelve dos conjuntos de resultados. Uno con el recuento y otro con los datos reales. Solo quiere el resultado establecido con los datos reales.
Es su cadena de conexión, el procedimiento almacenado o un error en el controlador sql. La mayoría de las personas está adivinando el procedimiento almacenado. Entonces muéstranos el código. Mientras lo hace, muéstrenos la cadena de conexión y los contenidos de las variables de tipo de búsqueda.
Primero, verifique el procedimiento como dice @tvanfosson. En segundo lugar, la comprobación de HasRows () es realmente innecesaria en el fragmento de código.
HasRows
requiere un cursor desplazable.
¿Las filas que está trayendo contienen datos de image/BLOB
gran tamaño?
Como sugirió otra persona, creo que publicar el Stored Procedure
podría arrojar algo de luz sobre el asunto ...