2008-12-16 135 views
5

Tengo problemas para recuperar los resultados de mi lector de datos en visual studio 2008. Tengo varios Procs almacenados en la misma base de datos. Puedo recuperar valores de aquellos que no reciben parámetros de entrada. Sin embargo, cuando uso el método executreReader() en un proceso almacenado con parámetros de entrada obtengo un lector de datos vacío. Al examinar la recopilación de resultados, aparece el mensaje "IEnumerable no devolvió resultados". Estoy desconcertado ya que puedo ejecutar los procesos almacenados dentro del servidor sql y devolver conjuntos de resultados. Anteriormente pude recuperar filas de estos procedimientos almacenados en Visual Studio, pero aparentemente dejó de funcionar un día.El lector de datos no devuelve ningún resultado en VS pero el procedimiento almacenado devuelve varios conjuntos de resultados en el servidor Sql

He intentado utilizar un datadapter para llenar un conjunto de datos con mis resultados y usar el método executereader() para obtener un sqldatareader y aún así no obtener resultados. No se lanzan excepciones tampoco. Mis parámetros están nombrados correctamente, pero debería poder llamar a estos procesos almacenados sin parámetros y hacer que devuelvan un conjunto de resultados sin filtrar. El código que estoy utilizando actualmente es el siguiente:

string connStr = ConfigurationManager.ConnectionStrings["MyConnectionString"] 
            .ConnectionString; 

SqlConnection connCactus = new SqlConnection(connStr); 
SqlCommand cmdPopulateFilterDropDowns = new SqlCommand("dbo.MyStoredProc", 
                 connCactus); 
SqlDataReader rdrFilterSearch = null; 
cmdPopulateFilterDropDowns.CommandType = CommandType.StoredProcedure; 

connCactus.Open(); 
rdrFilterSearch = cmdPopulateFilterDropDowns 
         .ExecuteReader(CommandBehavior.CloseConnection); 

return (rdrFilterSearch); 

Por favor ayuda!

+0

Si se pone un punto de interrupción en la línea ExecuteReader y pasar por encima, es el lector sigue vacía? – JamesSugrue

+1

Además, ¿podría ayudar si publica el SP también? – JamesSugrue

+0

Si pongo un punto de interrupción y cierro el cursor sobre el lector de datos, al expandir la vista de resultados dice "Enumeración no produjo resultados" –

Respuesta

0

¿Cuándo obtiene el error "IEnumerable no devolvió ningún resultado"? ¿Podría mostrar un ejemplo de cómo está accediendo al DataReader?

¿Qué ocurre si se establece un punto de interrupción antes del retorno, y ejecutar

rdrFilterSearch.GetString(0); 

en la ventana inmediata?

5

¿Alguna vez agrega los parámetros a la colección de parámetros de SqlCommand? Usted ha mencionado que los que no funcionan son los que toman parametros de entrada, sin embargo, en su código no tiene nada como esto:

cmdPopulateFilterDropDowns.Parameters.AddWithValue(...); 
2

ejecutar un rastreo del servidor SQL en el servidor cree que' re ejecutar tu comando en contra. ¿Qué se está enviando realmente al servidor? Creo que encontrarás la pista de tu pistola humeante allí.

BFree tiene un buen punto, para comprobar AddWtihValue() contra Add(). También asegúrese de que si está instanciando explícitamente objetos SqlParameter, puede ocurrir el mismo problema que tendrá con .Add(). Tenga en cuenta que hay un error de diseño con Parameters.Add() cuando pasa los valores de (int) 0 - se toman como una enumeración en lugar de un valor ...

2

esto puede parecer obvio, pero dígame por favor estás llamando al método .Read()? Odio hacer esa pregunta, pero a veces son las cosas más obvias que olvidamos cuando nos volvemos locos por un problema.

+0

El código anterior devuelve un lector, uso el método .read() en el código de llamada. –

5

Estúpido error de mi parte. Después de unas pocas horas luchando con esto, me di cuenta de que los procedimientos almacenados que estaba utilizando devuelven múltiples conjuntos de resultados, de los cuales el primer conjunto de resultados siempre estaba vacío. De ahí la falta de resultados.

+0

A veces, las respuestas estúpidas son las mejores. Estaba teniendo un problema similar. – Xynariz

1

Configurar el parameterdirection en el sqlParam debería resolver el problema.

mySqlParam.Direction = ParameterDirection.ReturnValue; 

Si esperas más de un valor a ser devuelto, sólo tiene que añadir el parámetro y establece que es la dirección:

SqlParameter mySqlParam = new SqlParameter(); 
    mySqlParam.ParameterName = "@ID"; 
    mySqlParam.SqlDbType = SqlDbType.int; 
    mySqlParam.Direction = ParameterDirection.ReturnValue; 

    SqlParameter mySqlParam = new SqlParameter(); 
    mySqlParam.ParameterName = "@Name"; 
    mySqlParam.SqlDbType = SqlDbType.NVarChar; 
    mySqlParam.Direction = ParameterDirection.ReturnValue; 


    SqlParameter mySqlParam = new SqlParameter(); 
    mySqlParam.ParameterName = "@Address"; 
    mySqlParam.SqlDbType = SqlDbType.NVarChar; 
    mySqlParam.Direction = ParameterDirection.ReturnValue; 

El mySqlParam.ParameterName no tiene que ser exactamente igual que el nombre del procedimiento almacenado .

continuación, puede leer los valores de este tipo (ejemplo no completa):

int.Parse(dataReader["ID"]); 
dataReader["name"].ToString(); 
dataReader["address"].ToString(); 

el valor en dataReader[""].ToString(); tiene que coincidir con el coloumname del procedimiento almacenado.

2

Tuve un problema similar, pero no idéntico, que me estaba volviendo loco, así que lo incluiré por si ayuda a alguien a lo largo de la línea.

Podría ejecutar el SQL, o llamar a un procedimiento almacenado con el mismo SQL, en SQL Server utilizando Management Studio, y obtener un conjunto de resultados poblado. Pero cuando utilicé el SQL idéntico en línea, o llamé al sproc que lo contenía, desde mi código de Visual Studio para un proyecto de aplicación web ASP.Net, obtuve un DataReader vacío.

¿Cómo podría el mismo SQL idéntico devolver un conjunto de resultados en Management Studio, pero un DataReader vacío en Visual Studio? La respuesta fue que me estaba ejecutando como un usuario diferente con diferentes permisos en las dos herramientas. En Management Studio, me estaba ejecutando como desarrollador en una función específica de SQL con muchos permisos. Pero en Visual Studio, me estaba ejecutando como una cuenta de servicio a la que no se le habían otorgado permisos en las tablas que estaba consultando.

En realidad, mi problema era un paso más complicado. Todo estuvo bien hasta que modifiqué SQL/sproc y agregué una tabla JOIN a una tabla más, y esa tabla carecía de los permisos necesarios de la cuenta de servicio. Pero el principio es el mismo: examinar todos los permisos para el usuario que hace la llamada a la base de datos.

0

Uso

reader.ExecuteNonQuery() 

feliz de codificación

Cuestiones relacionadas