この質問は数か月前に尋ねられたと思いますが、私の状況は異なり、同じルールが適用されない可能性があります。
このメソッドを実行するたびに、同じエラーがポップアップします。位置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;
}
これは非常に簡単です。つまり、クエリから結果が返されなかったことを意味します。常に防御的なコーディングを行い、インデックスを作成する前に、Rows配列に項目が含まれているかどうかを確認する必要があります。何かのようなもの:
if (dt.Rows.Count > 0)
soptype = dt.Rows[0]["SOPTYPE"].ToString();
else
somethingWentWrong();
テーブルにデータがあるかもしれませんが、最初のクエリの後で接続が閉じると思います。接続をもう一度開いてみてください。また、最初のSQLクエリに文字列連結があるため、これは良い方法ではありません。 try .. catchの代わりにblockを使用してみてください。そしてジョエルが示唆したように、チェックを使用して
for (int i = 0; i <= dt.rows.count; i++)
{
// do something till rows in DT
}
私も同じ問題を抱えていましたが、最初の列が整数ベースではないことに気付きました。そのため、最初の編集時に同じエラーに直面しました。
したがって、最初の列を編集しないか、最初の列をID列にすることをお勧めします。この場合、何も編集する必要はありません。