2011-10-17 885 views
8

この質問は数か月前に聞かれたと思いますが、私の状況は違うと思います。同じルールが適用されないかもしれません。データベースエラー:位置0に行がありません

このメソッドを実行するたびに、同じエラーがポップアップします。 [0]を[1]または[15]に変更すると、位置0に行がありません。 [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; 
} 
+1

なぜあなたの方法はブールですか?それはtrueを返すだけです。 – Andre

+0

@Andre:明白な理由の1つは、将来、catchがfalseを返して、呼び出し側が成功したかどうかを知ることです。 – Chris

+0

@Chris、これはエラーが発生すると予想されるいくつかの方法では問題ありません。これは当てはまりません。 – Andre

答えて

17

これは非常に簡単です。つまり、クエリから結果が返されなかったことを意味します。あなたは常に防御的にコードを作成し、配列にインデックスを付ける前にRows配列に項目があるかどうかをチェックする必要があります。次のようなものがあります。

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

助けてくれてありがとう:] – javasocute

+1

ありがとう。ところで、 "ds.Rows.Count"は真であり、 "Length"ではありません。 –

1

テーブルにデータがある可能性がありますが、最初のクエリの後に接続が終了すると思います。接続を再度開いてみてください。また、最初のSQLクエリに文字列連結がありますが、これは良い方法ではありません。 try .. catchの代わりにブロックを使用してみてください。そして、Joelが示唆したように、小切手を使用してください。

0

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

私の提案では、最初の列を編集しないか、最初の列をID列にしないでください。その場合、何も編集する必要はありません。

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

このコードスニペットは問題を解決するかもしれませんが、[説明を含む](// meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)本当にあなたの投稿の質を向上させるのに役立ちます。将来読者の質問に答えていることを覚えておいてください。そうした人々はあなたのコード提案の理由を知らないかもしれません。また、コードと説明の両方の可読性が低下するため、説明的なコメントを使用してコードを混乱させないようにしてください。 – FrankerZ

関連する問題