web-dev-qa-db-ja.com

データベースエラー:位置0に行がありません

この質問は数か月前に尋ねられたと思いますが、私の状況は異なり、同じルールが適用されない可能性があります。

このメソッドを実行するたびに、同じエラーがポップアップします。位置0に行がありません。[0]を[1]または[15]に変更すると、 [1]などに行がありません。これは、私のデータベースが接続さえしていないことを意味しますか?行がそこにあるかどうかを確認するために、ある種のifステートメントを書く必要がありますか?

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

これは非常に簡単です。つまり、クエリから結果が返されなかったことを意味します。常に防御的なコーディングを行い、インデックスを作成する前に、Rows配列に項目が含まれているかどうかを確認する必要があります。何かのようなもの:

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

テーブルにデータがあるかもしれませんが、最初のクエリの後で接続が閉じると思います。接続をもう一度開いてみてください。また、最初のSQLクエリに文字列連結があるため、これは良い方法ではありません。 try .. catchの代わりにblockを使用してみてください。そしてジョエルが示唆したように、チェックを使用して

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

私も同じ問題を抱えていましたが、最初の列が整数ベースではないことに気付きました。そのため、最初の編集時に同じエラーに直面しました。

したがって、最初の列を編集しないか、最初の列をID列にすることをお勧めします。この場合、何も編集する必要はありません。

0