visual tener recuperar puede mediante executereader datos data acceso c# ado.net datareader

c# - tener - Datareader no devuelve resultados en VS pero el procedimiento almacenado devuelve múltiples conjuntos de resultados en el servidor Sql



recuperar datos mediante datareader c# (8)

esto puede parecer obvio, pero por favor dime que 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.

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.

He intentado usar un dataadapter para llenar un conjunto de datos con mis resultados y usar el método executereader () para obtener un sqldatareader y todavía no obtengo ningún resultado. 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 usando 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!


¿Alguna vez agrega los parámetros a la colección de Parámetros de SqlCommand? Mencionaste que los que no funcionan son los que toman parámetros de entrada, pero en tu código no tienes nada como esto:

cmdPopulateFilterDropDowns.Parameters.AddWithValue(...);


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

¿Qué sucede si establece un punto de interrupción antes de la devolución y ejecuta

rdrFilterSearch.GetString(0);

en la ventana inmediata?


Ejecute un rastreo de SQL Server contra el servidor en el que cree que está ejecutando su comando. ¿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 valores de (int) 0 en él; se toman como una enumeración en lugar de un valor ...


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.


Tuve un problema similar, pero no idéntico, que me estaba volviendo loco, así que lo incluiré en caso de que ayude 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 recuperar 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 fue un paso más complicado. Todo estuvo bien hasta que modifiqué el 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.


Configurar el parámetro dirección en sqlParam debería resolver el problema.

mySqlParam.Direction = ParameterDirection.ReturnValue;

Si espera que se devuelva más de un valor, simplemente agregue el parámetro y configure su 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;

mySqlParam.ParameterName no tiene que ser exactamente igual al nombre en el procedimiento almacenado.

A continuación, puede leer los valores de esta manera (ejemplo no completo):

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

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


Utilizar

reader.ExecuteNonQuery()

Feliz codificación