0

私のコードは長い間実行されてきましたが、最近このエラーが発生しました。これObject reference not set to an instance of an object.が新しいデータベースの作成と使用に関連しているかどうかはわかりません。

これが私のコードです:

con2.Open();
    SqlCommand cmd = new SqlCommand();
    cmd.Connection = con;
    cmd.CommandText = "SELECT QtyInHand FROM Inventory WHERE ProductID=@ProductID";
    cmd.Parameters.Add("@ProductID", SqlDbType.Int).Value = productID;
    int existingQty = (int)cmd.ExecuteScalar();
    cmd.Parameters.Clear();
    cmd.CommandText = "UPDATE Inventory SET QtyInHand=@QtyInHand WHERE ProductID=@ProductID";
    cmd.Parameters.Add("@QtyInHand", SqlDbType.Int).Value = existingQty - int.Parse(quantity);
    cmd.Parameters.Add("@ProductID", SqlDbType.Int).Value = productID;
    cmd.ExecuteNonQuery();
    con2.Close();

この部分のエラー:int existingQty = (int)cmd.ExecuteScalar();

他の SqlConnection: con を使用しようとしたとき

con.Open();
    SqlCommand cmd = new SqlCommand();
    cmd.Connection = con;
    cmd.CommandText = "SELECT QtyInHand FROM Inventory WHERE ProductID=@ProductID";
    cmd.Parameters.Add("@ProductID", SqlDbType.Int).Value = productID;
    int existingQty = (int)cmd.ExecuteScalar();
    cmd.Parameters.Clear();
    cmd.CommandText = "UPDATE Inventory SET QtyInHand=@QtyInHand WHERE ProductID=@ProductID";
    cmd.Parameters.Add("@QtyInHand", SqlDbType.Int).Value = existingQty - int.Parse(quantity);
    cmd.Parameters.Add("@ProductID", SqlDbType.Int).Value = productID;
    cmd.ExecuteNonQuery();
    con.Close();

別のエラー、一部のThe connection was not closed. The connection's current state is open.エラーが発生しましcon.Open();た。この問題を解決するにはどうすればよいですか?

4

1 に答える 1

2

最初のエラーでは、executeScalar()呼び出しが null 値を返しています。クエリを改良するか (クエリをデータベースで直接実行して確認できます)、またはロジックを変更して null 値を処理します。

2 番目のエラーについて、呼び出しOpen()がそのエラーをスローしている場合は、接続オブジェクトが以前に使用されていて、適切に閉じられていなかったことが原因です。通常、そのような接続を再利用することは悪い習慣と考えられているため、新しい接続インスタンスを開くときは、新しい接続インスタンスを作成することを検討してください。

編集: 2 番目の段落で何かを暗示しようとしましたが、今はそれを明示する必要があると感じています: アプリケーションの主要なパフォーマンスの浪費になる可能性があるため、そこで開いたままにした接続に対処することを忘れないでください。特に、ASP.NET であるためです。不要になった接続はすぐに破棄してください。接続を呼び出すDispose()と、接続が閉じられます - 他のより細かいメモリ管理手順のボーナスも追加されます。using時間ができたらすぐに、ステートメントと接続でのその使用法について読んでください。

于 2013-08-26T13:31:00.913 に答える