1

私はMSAccessを使用していますが、データを正しく更新する方法を教えてください。ボタンクリックイベントで使用するコードは次のとおりです。

OleDbCommand cmd = new OleDbCommand("SELECT * FROM ItemTemp WHERE ITEM='" + txtItemname.Text + "'", GetConnection());
OleDbDataReader reader = cmd.ExecuteReader();

//check if this item exist on the table ItemTemp
if (reader.HasRows == true)
{
    // item exists, do below action
    OleDbCommand cmde = new OleDbCommand("UPDATE ItemTemp SET QUANTITY=QUANTITY + @QUANTITY, PRICE=PRICE + @PRICE WHERE ITEM='" + txtItemname.Text + "'", GetConnection());
    cmde.Parameters.AddWithValue("@QUANTITY", txtItemquantity.Value); //numericupdown control
    cmde.Parameters.AddWithValue("@PRICE", txtItemprice.Text); //textbox control
    cmde.ExecuteNonQuery();
}

更新前のデータベース上のデータ:

ID    |    ITEM    |    QUANTITY    |    PRICE
1     |    ITEM1   |        1       |    400

更新後のデータベース上のデータ:

ID    |    ITEM    |    QUANTITY    |    PRICE
1     |    ITEM1   |       11       |    400400

更新後にデータベースにデータを追加します。

ID    |    ITEM    |    QUANTITY    |    PRICE
1     |    ITEM1   |        2       |    800

私は私のコマンドが私の悪いものではないにしても正しいと信じています..私のボタンクリックイベントにはこのコード以外はありません。何か案は?

4

2 に答える 2

1

まず、データベースフィールドのQuantityとPriceがoo数値タイプであることを確認する必要があります。それらがテキストの場合、クエリはパラメータとして渡された文字列値をデータベース列に存在する文字列と連結します。

次に、AddWithValueを使用してパラメーターを渡すと、フレームワークは渡された値のデータ型を確認するためにデータ型を推測します。あなたの場合、文字列を渡すと、データベースエンジンは、既存の値に連結される文字列を認識します。適切なデータ型に渡す前に変換する必要があります

最後に、データベースエンジンに渡すすべてのものに対して、特に渡される値が入力テキストボックスからのものである場合は、常にパラメーター化されたクエリを使用します。

 OleDbCommand cmd = new OleDbCommand("SELECT * FROM ItemTemp WHERE ITEM=@item", GetConnection());
 cmd.Parameters.AddWithValue("@item", txtItemName.Text);
 OleDbDataReader reader = cmd.ExecuteReader();

 //check if this item exist on the table ItemTemp
 if (reader.HasRows == true)
 {
     OleDbCommand cmde = new OleDbCommand("UPDATE ItemTemp SET QUANTITY=QUANTITY + @QUANTITY," + 
     "PRICE=PRICE + @PRICE WHERE ITEM=@item, GetConnection());
     cmde.Parameters.AddWithValue("@QUANTITY", Convert.ToInt32(txtItemquantity.Value)); 
     cmde.Parameters.AddWithValue("@PRICE", Convert.ToDecimal(txtItemprice.Text)); 
     cmde.Parameters.AddWithValue("@item", txtItemName.Text);
     cmde.ExecuteNonQuery();
 }
于 2013-03-13T20:50:50.563 に答える
1

わかりました、それは今行われているようです。私はただ変える

cmde.Parameters.AddWithValue("@QUANTITY", txtItemquantity.Value); //numericupdown control
cmde.Parameters.AddWithValue("@PRICE", txtItemprice.Text); //textbox control

これに

cmde.Parameters.AddWithValue("@QUANTITY", Convert.ToInt32(txtItemquantity.Value));
cmde.Parameters.AddWithValue("@PRICE", Convert.ToInt32(txtItemprice.Text));
于 2013-03-13T20:47:41.450 に答える