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# 的初学者,我在维护一个表,其中有 3 个字段,一个是 BookID,第二个是 BookName,第三个是 BookQuantity .. 范围是书籍移动到过道时的书籍应该从主要库存中减去。我正在使用这种方法..但我想知道有没有更好或更有效的方法来做到这一点..提前谢谢

4

1 回答 1

3

几个变化。
首先,永远不要使用字符串连接来构建 sql 命令文本。这会导致sql 注入攻击。一个非常严重的安全问题

其次,您获取书籍数量的代码可能会导致 ExecuteScalar 返回空值,因此您会收到错误消息

第三。连接应在需要时打开、使用,然后关闭和处置。如果由于某种原因出现异常,您的代码将无法关闭和处理连接。using 语句防止出现此问题,在出现异常时也要注意关闭和处理连接

第四,这更像是一个逻辑问题。我认为你不能移动比库存中存储的书籍更多的书,所以为了安全起见添加一张支票-

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 回答