0

C#でライブラリシステムを作りたいです。このシステムでは、書籍が発行されると、データベース内の書籍の数量が自動的に減らされます。book quantity == 0 「利用できません」というメッセージ ボックスが表示される 場合。

これは私のコードです:

private void btnIssue_Click(object sender, EventArgs e)
{
    if (cmbResID.Text != "" && cmbMemID.Text != "" && cmbBookID.Text != "" && txtBkTitle.Text != "" && txtCategory.Text != "" && txtAuthor.Text != "" && txtIssueDate.Text != "" && txtActDate.Text != "")
    {
        SqlCommand Quantity = new SqlCommand("Select * from tblBookDetails where Book_ID = '" + cmbBookID.Text +"'");
        DataSet ds = Library.Select(Quantity);
        if (ds.Tables[0].Rows.Count > 0)
        {
            textBox1.Text = ds.Tables[0].Rows[0].ItemArray.GetValue(5).ToString();
            int b = Convert.ToInt32(textBox1.Text);
            if (b > 0)
            {
                //a = a - 1;
                //int b = Convert.ToInt32(a);
                //label15.Text = a.ToString();

                SqlCommand update=new SqlCommand("UPDATE tblBookDetails SET Quantity=Quantity-1 WHERE Book_ID='"+ cmbBookID +"'");                          
                Library.ExecuteInsert(update);

                SqlCommand save = new SqlCommand("insert into tblBookIssue values(@ResID,@Member_ID,@Book_ID,@Issue_Date,@Act_Ret_Date)");
                save.Parameters.AddWithValue("@ResID", cmbResID.Text);
                save.Parameters.AddWithValue("@Member_ID", cmbMemID.Text);
                save.Parameters.AddWithValue("@Book_ID", cmbBookID.Text);
                save.Parameters.AddWithValue("@Issue_Date", txtIssueDate.Text);
                save.Parameters.AddWithValue("@Act_Ret_Date", txtActDate.Text);
                Library.Insert(save);
                MessageBox.Show("Book Issued", "Book Issue", MessageBoxButtons.OK, MessageBoxIcon.Information);
                clear();
            }
            else
            {
                MessageBox.Show("this book is not available");
            }
        }
    }
    else
    {
        MessageBox.Show("FILL COLUMS");
    }
}
4

1 に答える 1

1

テキスト ボックスに基づいて SQL を実行することは非常に危険であり、SQL インジェクション攻撃を受けやすくなります。また、オブジェクト指向プログラムに従い、よりクリーンなコードを作成するには、Book オブジェクトを作成することをお勧めします。ブック インクリメンタを含む例を示す以下のコードを完成させました。書籍の取得と書籍のチェックアウトの更新を実行する、焦点を絞ったストアド プロシージャを作成することをお勧めします。基本的な選択をストアド プロシージャに変換し、数量を調べ、数量が 1 未満の場合は 0 を返し、それ以外の場合は 1 を返す別のプロシージャを作成する必要があります。詳細情報が必要な場合はお知らせください。このコードは、作業を進めるのに役立ちます。

using System;
using System.Data;
using System.Data.SqlClient;


namespace MockLibrary
{
internal class Book
{
    #region Constructors

    public Book()
    {

    }

    public Book(string resId, string memberId, string bookId, DateTime issueDate,     DateTime actRetDate)
    {
        this.ResId = resId;
        this.MemberId = memberId;
        this.BookId = bookId;
        this.IssueDate = issueDate;
        this.ActRetDate = actRetDate;
    }

    #endregion

    #region Properties

    private string _ResID;
    private string _MemberID;
    private string _BookId;
    private DateTime _IssueDate;
    private DateTime _ActRetDate;

    public string ResId
    {
        get { return _ResID; }
        set { _ResID = value; }
    }

    public string MemberId
    {
        get { return _MemberID; }
        set { _MemberID = value; }
    }

    public string BookId
    {
        get { return _BookId; }
        set { _BookId = value; }
    }

    public DateTime IssueDate
    {
        get { return _IssueDate; }
        set { _IssueDate = value; }
    }

    public DateTime ActRetDate
    {
        get { return _ActRetDate; }
        set { _ActRetDate = value; }
    }

    #endregion

    public Book GetBookByID(string resId, string memberId)
    {

        try
        {
            using (SqlConnection con = new SqlConnection("put your db con string here"))
            {
                using (SqlCommand cmd = new SqlCommand("sp_GetBookById", con))
                {
                    cmd.CommandType = CommandType.StoredProcedure;

                    cmd.Parameters.Add("@ResId", SqlDbType.VarChar).Value = resId;
                    cmd.Parameters.Add("@MemberId", SqlDbType.VarChar).Value = memberId;

                    con.Open();
                    cmd.ExecuteNonQuery();

                    SqlDataReader  rdr = cmd.ExecuteReader();

                    while (rdr.Read())
                    {
                        Book newBook = new Book(rdr["ResId"].ToString(),rdr["MemberId"].ToString(),rdr["BookId"].ToString(),DateTime.Now,DateTime.Now);
                        return newBook;
                    }
                }

            }

        }
        catch
        {
            throw new Exception("something went wrong");
        }
        return null;
    }

    public bool CheckoutBook(string resId, string memberId)
    {
        using (SqlConnection con = new SqlConnection("put your db con string here"))
        {
            using (SqlCommand cmd = new SqlCommand("sp_CheckoutBook", con))
            {
                cmd.CommandType = CommandType.StoredProcedure;

                cmd.Parameters.Add("@ResId", SqlDbType.VarChar).Value = resId;
                cmd.Parameters.Add("@MemberId", SqlDbType.VarChar).Value = memberId;

                con.Open();
                cmd.ExecuteNonQuery();
                SqlDataReader rdr = cmd.ExecuteReader();

                while (rdr.Read())
                {
                    if (rdr["checkoutsuccessful"].ToString() == "1")
                    {
                        return true;
                    }
                }

            }
        }
        return false;
    }
}

}

于 2013-10-08T20:36:03.817 に答える