web-dev-qa-db-fra.com

Erreur de base de données: il n'y a pas de ligne à la position

Je crois que cette question a été posée il y a plusieurs mois, mais je crois que ma situation est différente et que les mêmes règles peuvent ne pas s'appliquer. 

A chaque fois que j'exécute cette méthode, la même erreur se produit. Il n'y a pas de ligne à la position 0. Si je change de [0] à [1] ou [15]; Il n'y a pas de ligne dans [1] et etc. Cela pourrait-il signifier que ma base de données n'est même pas en cours de connexion? Devrais-je écrire une sorte d’instruction if pour déterminer si les lignes sont égales? 

    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;
}
10
javasocute

C'est très simple ... cela signifie qu'aucun résultat n'a été renvoyé par votre requête. Vous devez toujours coder de manière défensive et vérifier si le tableau de lignes contient des éléments avant d'essayer d'y indexer. Quelque chose comme:

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

vous pourriez avoir des données dans la table mais je pense que la connexion se ferme après la première requête. essayez d'ouvrir à nouveau la connexion. De plus, vous avez la concaténation de chaînes dans la première requête SQL, ce qui n’est pas une bonne pratique. essayez d'utiliser block au lieu d'essayer .. catch, juste pour un meilleur code. Et comme Joël a suggéré, utilisez un chèque

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

J'avais le même problème, puis j'ai réalisé que ma première colonne n'était pas à base d'entiers. Ainsi, lorsque j'ai édité le premier, j'ai rencontré la même erreur.

Ma suggestion est donc soit de ne pas éditer la première colonne, soit de faire de la première colonne une colonne ID, auquel cas vous ne devez rien éditer.

0
Muhammad Suleman