2016-05-19 8 views
1

私はウェブベースの在庫システムを持っていますので在庫を増やして減らすことができます。しかし、私はそれを-1に減らそうとするとエラーが欲しいです。私は在庫データベースをASP.NETに持っています在庫を減らすとエラーメッセージが表示されます

は、例えば:私は1つのアイテムに40株を持っていると私は離れて41をしたい、それは私がデータベースを行うことを許可することをお勧めERROR:NOT ENOUGH STOCK

protected void Button1_Click(object sender, EventArgs e) 
{ 
    con.Open(); 

    SqlCommand cmd = new SqlCommand("update Inventory set stock = stock - '" 
     + txtstockremove.Text + "' where model_number='" + txtmodelno.Text + "'", con); 

    cmd.ExecuteNonQuery(); 
    con.Close(); 
    GridView1.DataBind(); 
    Label1.Visible = true; 
    Label1.Text = "Stock Successfully Removed!"; 
}   

Picture of negative stock

+1

あなたは直接ユーザー入力を持つSQLクエリを連結することはありません。このコードは、[SQL Injection](http://www.w3schools.com/sql/sql_injection.asp)に脆弱です。これは、ソフトウェアの重大なセキュリティ上の欠陥である可能性があります。 –

答えて

1

を言って、エラーメッセージを与える必要がありますそれはうまくいく。 Inventoryテーブルに制約を追加すると、stockが本当に否定的になることはありません。

ALTER TABLE dbo.Inventory ADD CONSTRAINT CK_Inventory_Stock CHECK (Stock >= 0) 

この副作用は、あなたのcmd.ExecuteNonQuery()文がうまく例外をスローかもしれないということです。だから、あなたが本当にそのために準備する必要があります。私が正しく質問を理解していれば

try { 
    cmd.ExecuteNonQuery(); 
    GridView1.DataBind(); 
    Label1.Visible = true; 
    Label1.Text = "Stock Successfully Removed!"; 
} catch (SqlException e) { 
    Label1.Visible = true; 
    Label1.Text = e.ToString(); 
} 
0

、あなたはそれを更新する前に在庫を確認する必要があります。

protected void Button1_Click(object sender, EventArgs e) 
{ 

    con.Open(); 

    SqlDataReader reader; 

    SqlCommand cmd = new SqlCommand("select stock from Inventory, con); 
    cmd.CommandType = CommandType.Text; 

    reader = cmd.ExecuteReader(); 
    // Data is accessible through the DataReader object here. You'll have to fill this part in 

    cmd.ExecuteNonQuery(); 

    if (txtstockremove.Text <= currentStock) 
    { 


    SqlCommand cmd = new SqlCommand("update Inventory set stock= stock - '" + txtstockremove.Text + "' where model_number='" + txtmodelno.Text + "'", con); 


    cmd.ExecuteNonQuery(); 
    } 
    else 
    { 
     Label1.Visible = true; 
     Label1.Text = "Stock Successfully Removed!"; 
    } 
    con.Close(); 
    GridView1.DataBind(); 
    Label1.Visible = true; 
    Label1.Text = "Stock Successfully Removed!"; 

} 
+0

私はそれをよりよく説明するので、私はテキストボックスに30を入力し、入手可能な在庫が25である場合、 "ERROR:NOT ENOUGH STOCK"と表示されるようにラベルが必要です。ユーザー検証エラーです。これはより意味をなさないことを願っています。私は初心者です。 –

+0

まあ、アイデアは上記のコードとほとんど同じです。私はただ一つ変更するだろう:ButtonClickに関数を接続するのではなく、テキストボックスのTextChangedイベントを使うだろう。 基本的に: 1.ユーザーが値を変更するたびに、十分な在庫があることをDBでテストします。 2.もしそうなら、問題ありません。 3.表示しない場合は、エラーメッセージを表示します(送信ボタンも無効にします)。 4.ユーザーがボタンをクリックした場合(再度確認する必要はありません)、DBを更新するだけです(前と同じ)。 これが役に立ちます。 –

関連する問題