2011-05-30 46 views
5

Estoy ejecutando una instrucción if else de un lector de datos para consultar los datos de la tabla y activar/desactivar algunos controles en una página. Implementé una instrucción de uso para cerrar automáticamente la conexión y el lector cuando cerré el bloque, pero todavía obtengo el error de cierre del lector en cada una de mis sentencias if else. ¿Qué falta? Código de abajo:¿Intento no válido de llamar a MetaData cuando el lector está cerrado?

string comnt = "SELECT StatusId FROM Submission WHERE SubmissionId =" + x; 


    using (SqlConnection editConn = new SqlConnection(connectionString)) 
    { 
     editConn.Open(); 

     using (SqlCommand statCmd = new SqlCommand(comnt, editConn)) 
     { 
      SqlDataReader dr = statCmd.ExecuteReader(); 
      dr.Read(); 
      if (dr.GetInt32(0) > 0) 
      { 
       PanelComment.Visible = true; 
       PanelQuote.Visible = false; 
       LnbFid.Visible = false; 
       LnbCrim.Visible = false; 
       LnbEo.Visible = false; 
       LnbEpl.Visible = false; 
       LnbNot.Visible = false; 
       LnbPriv.Visible = false; 
       LnbPub.Visible = false; 

      } 
      else 
      { 
       PanelComment.Visible = false; 
      } 

     } 
+1

¿está seguro de que el lector devuelve las filas? Tiene la propiedad "HasRows" para verificar antes de leer – vityanya

+0

¿qué representa 'x'? ¿Es una cadena que representa una cadena? ¿un número? Deberías acostumbrarte a usar parámetros, concatenar cadenas para construir consultas SQL es peligroso, especialmente si 'x' depende del usuario. – InBetween

+0

El campo que se está consultando no aceptará valores nulos, por lo que definitivamente devuelve las filas @vityanya, y @InBetween, 'x' es una cadena utilizada para almacenar el ID de envío jqueried en la página. –

Respuesta

3

Su consulta no está recibiendo ningún resultado espalda. Hay que acostumbrarse a construir la siguiente si no está seguro si su consulta devolverá todos los datos:

while (dr.Read()) //will return true while there is data to be read. 
{ 
    ... 
} 
+0

Gracias, @InBetween. No estoy seguro de por qué la consulta no obtendría resultados, ya que el campo no es nulo y una comprobación en la tabla db revela que los datos están allí. –

+0

@brazos: si el ID de envío no es numérico, es posible que falte '' en su cadena de consulta. Si es un control numérico para cualquier problema de localización. – InBetween

+0

Vacío o no, este constructo no evita el error. Me encontré con eso incluso cuando estaba haciendo una consulta tipo 'SELECT * FROM Authors', mientras estaba en modo de depuración. – vapcguy

3

Trate de esta manera:

if (dr.HasRows) 
{ 
    while (dr.Read()) 
    { 
     if (dr.GetInt32(0) > 0) 
     { 
      ... 
     } 
    } 
} 

Para obtener más información, consulte esta página:

Retrieving Data Using a DataReader

+0

'HasRows' fue suficiente para borrar mi error - no necesitaba el segundo 'si'. Y para mí, aunque esperaba un GUID, cuando hice 'dr.GetGuid (0)> 0', arrojó un error porque se guardó en el DB como una columna char (35) en lugar de una columna uniqueidentifier - - Eso nunca pasaría la prueba 'if' en esa instancia. Deje que el comprador tenga cuidado con eso, aunque admito que tuve un caso especial ... – vapcguy

1

Parece que la instrucción SELECT devuelve ninguna fila y cuando se llama dr.Read() para la primera vez lo hará datareader cerrarse imidiately para el uso de lector de datos que siempre muestra el uso si o mientras como lo que dijo leniel

using (SqlCommand statCmd = new SqlCommand(comnt, editConn)) 
    { 
     SqlDataReader dr = statCmd.ExecuteReader(); 
     if(dr.Read()) 
     if (dr.GetInt32(0) > 0) 
     { 
      PanelComment.Visible = true; 
      PanelQuote.Visible = false; 
      LnbFid.Visible = false; 
      LnbCrim.Visible = false; 
      LnbEo.Visible = false; 
      LnbEpl.Visible = false; 
      LnbNot.Visible = false; 
      LnbPriv.Visible = false; 
      LnbPub.Visible = false; 

     } 
     else 
     { 
      PanelComment.Visible = false; 
     } 

    } 
1

me enfrentaba a este problema debido a la falta de coincidencia del nombre lector. es decir

SqlCommand sqlmd = new SqlCommand(); 
SqlDataReader sqldr = sqlmd.ExecuteReader(); 
while (sqldr.Read()) 
{ 

    idd = (int)rdr["Id"]; 
} 

más tarde sustituye el código

idd = (int)sqldr["Id"]; 

y se resolvió el error.

-1
if (conn.State == ConnectionState.Closed) 
    conn.Open(); 

    SqlCommand qr1 = new SqlCommand("select TransID, FType, FldName, LTrans, 
     OnCCBeforeLoad, LTop, LLeft, LWidth, LHeight, LFColor 
     from jwOndropExecButtonS where active = 'T' and MyType = '' 
     and LTrans = '" + TmpRajTransID + "' order by dbo.val(TransID) ", conn); 
    SqlDataReader d1 = qr1.ExecuteReader(); 
    while (d1.Read()) 
    { 
     if (d1.HasRows) 
     { 
      string MrFldName = d1["FldName"].ToString().Trim(); 

      if (d1["OnCCBeforeLoad"].ToString().Trim() == "Clr") 
       ClearValueandToolTipforFieldName(MrFldName); 
      if (d1["LTop"].ToString().Trim() != "") 
       DisplaySetTopValue(MrFldName, d1["LTop"].ToString().Trim()); 
      if (d1["LLeft"].ToString().Trim() != "") 
       DisplaySetLeftValue(MrFldName, d1["LLeft"].ToString().Trim()); 
      if (d1["LWidth"].ToString().Trim() != "") 
       DisplaySetWidthValue(MrFldName, d1["LWidth"].ToString().Trim()); 
      if (d1["LHeight"].ToString().Trim() != "") 
       DisplaySetHeightValue(MrFldName, d1["LHeight"].ToString().Trim()); 
      if (d1["FType"].ToString().Trim() == "Visible") 
       ShowTextBoxWithFldName(MrFldName); 
      if (d1["FType"].ToString().Trim() == "InVisible") 
       HideandClearTextBoxWithFldName(MrFldName); 
      if (d1["FType"].ToString().Trim() == "InNVisible") 
       HideOnlyTextBoxWithFldName(MrFldName); 
      if (d1["FType"].ToString().Trim() == "Enable") 
       SetEnableforFieldName(MrFldName); 
      if (d1["FType"].ToString().Trim() == "Disable") 
       SetDisableforFieldName(MrFldName); 
     } 
    } 
    d1.Close(); 
    if (conn.State == ConnectionState.Open) 
     conn.Close(); 

me dieron el mismo error de vez en cuando en

if (d1["FType"].ToString().Trim() == "Visible") 

diciendo metadata not found. Más tarde descubrí que el lector no estaba cerrado, pero el programa ASP.NET que usaba demasiada memoria cerró el lector automáticamente. Principalmente depende de la etapa del servidor SQL. Si se trata de un error habitual, compruebe su conexión.

Cuestiones relacionadas