2011-10-17 159 views
8

Creo que esta pregunta fue hecha varios meses atrás, pero creo que mi situación es diferente y las mismas reglas no se pueden aplicar.base de datos de error: No hay ninguna fila en la posición 0

Cada vez que ejecute este método que aparece mismo error hacia arriba. No hay fila en la posición 0. Si cambio [0] a [1] o [15]; No hay fila en [1] y etc. ¿Esto podría significar que mi base de datos ni siquiera se está conectando? ¿Debería escribir algún tipo de instrucción if para determinar si las filas están allí?

public bool UpdateOrderToShipped(string order) 
{ 
    orderNumber = order; 
    string batch = ConfigurationManager.AppSettings["SuccessfulOrderBatch"]; 
    string statement = "UPDATE SOP10100 SET BACHNUMB = '"+ batch +"' WHERE SOPNUMBE = @SOPNUMBE"; 
    SqlCommand comm = new SqlCommand(statement, connectionPCI); 
    comm.Parameters.Add("SOPNUMBE", orderNumber); 
    try 
    { 
     comm.Connection.Open(); 
     comm.ExecuteNonQuery(); 
     comm.Connection.Close(); 
    } 
    catch(Exception e) 
    { 
     comm.Connection.Close(); 
     KaplanFTP.errorMsg = "Database error: " + e.Message; 
    } 

    statement = "SELECT SOPTYPE FROM SOP10100 WHERE SOPNUMBE = @SOPNUMBE"; 
    comm.CommandText = statement; 
    SqlDataAdapter da = new SqlDataAdapter(comm); 
    DataTable dt = new DataTable(); 
    da.Fill(dt); 
    soptype = dt.Rows[0]["SOPTYPE"].ToString(); //errror here 

    return true; 
} 
+1

¿Por qué su método es un bool? Solo devuelve verdadero – Andre

+0

@Andre: una razón obvia es que en el futuro la captura va a devolver un falso para que la persona que llama sepa si ha tenido éxito o no. – Chris

+0

@Chris, esto está bien en algunos métodos, donde espera que ocurran errores. Esto no parece ser el caso. – Andre

Respuesta

17

Esto es muy simple ... significa que no se obtuvieron resultados de su consulta. Siempre debe codificar a la defensiva y verificar si la matriz Filas tiene elementos antes de intentar indexar. Algo como:

if (dt.Rows.Count > 0) 
    soptype = dt.Rows[0]["SOPTYPE"].ToString(); 
else 
    somethingWentWrong(); 
+0

Gracias por la ayuda:] – javasocute

+1

Gracias. Por cierto, "ds.Rows.Count" es verdadero, no "Length". –

1

es posible que tenga datos en la tabla, pero creo que la conexión se cierra después de la primera consulta. intente abrir la conexión nuevamente. También tiene concatenación de cadenas en la primera consulta SQL, lo cual no es una buena práctica. intenta usar bloque en lugar de try ... catch, solo para obtener un mejor código. Y como se sugiere Joel, utilice un cheque

0

que estaba teniendo el mismo problema, entonces me di cuenta de que mi primera columna no se basa entero. Así que cuando edité el primero me enfrenté al mismo error.

Por lo tanto, mi sugerencia es o bien editar la primera columna o hacer que la primera columna sea una columna de ID en cuyo caso no tiene que editar nada.

0
for (int i = 0; i <= dt.rows.count; i++) 
{ 
    // do something till rows in DT 
} 
+1

Si bien este fragmento de código puede resolver la pregunta, [incluyendo una explicación] (// meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) realmente ayuda a mejorar la calidad de su publicación. Recuerde que usted está respondiendo la pregunta a los lectores en el futuro, y es posible que esas personas no sepan los motivos de su sugerencia de código. Por favor, intente no saturar su código con comentarios explicativos, ya que esto reduce la legibilidad tanto del código como de las explicaciones. – FrankerZ

Cuestiones relacionadas