2
    public void moveBooks(int quantityOfMovedBooks, int booksID)
    {
        int finalQuantityOfBooks = totalBooksInDB(booksID) - quantityOfMovedBooks;
        queryString = "update Books set bQuantity='" + finalQuantityOfBooks + "'where bID=" + booksID;
        myComm = new OleDbCommand(queryString, myConn);
        myConn.Open();
        myComm.ExecuteNonQuery();
        myConn.Close();
    }
    public int totalBooksInDB(int bID)
    {
        int booksQuantity;
        queryString = "select bQuantity from Books where bID=" + bID;
        myComm = new OleDbCommand(queryString, myConn);
        myConn.Open();
        booksQuantity = (int)myComm.ExecuteScalar();
        myConn.Close();
        return booksQuantity;
    }

MSAccess データベースと C# の初心者です。1 つは BookID、2 番目は BookName、3 番目は BookQuantity の 3 つのフィールドがあるテーブルを維持しています。このアプローチ..しかし、これを行うためのより良いまたは効率的な方法があるのだろうか..事前に感謝します

4

1 に答える 1

3

いくつかの変更。
まず、文字列連結を使用して SQL コマンド テキストを作成しないでください。これは、 SQL インジェクション攻撃につながります。非常に深刻なセキュリティ問題

第二に、本の数を取得するためのコードは、ExecuteScalar によって null 値が返される可能性があるため、エラーが発生します。

3番目。接続は、必要に応じて開いて使用し、閉じて破棄する必要があります。何らかの理由で例外が発生した場合、コードは接続を閉じて破棄できません。using ステートメント
は、例外が発生した場合にも接続を閉じて破棄するように注意して、この問題を防ぎます。

4番目に、これはより論理的な問題です。持ち物以上の本は動かせないと思うので、念のためチェックを入れて――

public void moveBooks(int quantityOfMovedBooks, int booksID)
{
    int quantity = totalBooksInDB(booksID);
    if(quantity > quantityOfMovedBooks)
    {
        int finalQuantityOfBooks = quantity - quantityOfMovedBooks;
        queryString = "update Books set bQuantity=? where bID=?";
        using ( OleDbConnection myConn = new OleDbConnection(GetConnectionString() )
        using ( OleDbCommand myComm = new OleDbCommand(queryString, myConn))
        {
            myComm.Parameters.AddWithValue("@p1", finalQuantityOfBooks);
            myComm.Parameters.AddWithValue("@p2", booksID);
            myConn.Open();
            myComm.ExecuteNonQuery();
        }
     }
     else
        MessageBox.Show("Invalid quantity to move");
}

public int totalBooksInDB(int bID)
{
    int booksQuantity = 0;
    queryString = "select bQuantity from Books where bID=?";
    using ( OleDbConnection myConn = new OleDbConnection(GetConnectionString() )
    using ( OleDbCommand myComm = new OleDbCommand(queryString, myConn))
    {
        myComm = new OleDbCommand(queryString, myConn);
        myComm.Parameters.AddWithValue("@p1", bID);
        myConn.Open();
        object result = myComm.ExecuteScalar();
        if(result != null)
            booksQuantity = Convert.ToInt32(result);
    }
    return booksQuantity;
}
于 2013-04-04T19:19:04.227 に答える