c# - 在 Ms Access 数据库中的特定记录上应用运算符的有效方法

标签 c# ms-access-2007

    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。范围是当书籍移动到过道时,应从主库存中减去书籍。 .我正在使用这种方法..但我想知道是否有更好或有效的方法来做到这一点.. 提前致谢

最佳答案

一些更改。
首先,切勿使用字符串连接来构建 sql 命令文本。这导致 sql injection攻击。一个非常严重的安全问题

第二,获取图书数量的代码可能会导致 ExecuteScalar 返回空值,因此您将收到错误

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

第四这更像是一个逻辑问题。我认为您移动的图书数量不能超过库存中存储的图书数量,因此为了安全起见,请添加一张支票 -

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;
}

关于c# - 在 Ms Access 数据库中的特定记录上应用运算符的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15819669/

相关文章:

c# - 调试器正在寻找 executioncontext.cs,如何修复?

c# - System.InvalidCastException:无法将类型为“System.Object”的对象转换为类型为“System.IO.StreamWriter”

ms-access - 带有 VBA 的 MS Access 链接表

sql - Access 2007 中切换的默认值

database - 逆向工程 Access 数据库

c# - 尝试克隆 Entity Framework 对象时违反了多重性约束

c# - 用于捕获标记和未标记内容的正则表达式

c# - 在不重新查询数据库的情况下,在另一个 LINQ 查询中重用 LINQ 查询结果

c# - 插入 Ms Access 数据库时出错(未指定错误\r\n 对象无效或不再设置)

ms-access - 在 MS Access 中记录错误和警告的方法