2013-03-13 3 views
1

Я работаю с MS Access, и хотел бы, как обновить correctly..here данных является кодом я использую на моей кнопке мыши события без везенияMS Access Обновление с добавлением

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 

данных на базе данных, которые я хочу, чтобы это было FTER обновление:

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

я верю, что моя команда является правильной, если не мое bad..there никакого другой, чем этот код на моем случае нажатия кнопки. есть идеи?

+1

Похоже, что столбец «Количество и цена» имеют тип текста. Не могли бы вы подтвердить это? – Steve

+0

Я отредактировал ваш заголовок. Пожалуйста, смотрите: «Если вопросы включают« теги »в их названиях?] (Http://meta.stackexchange.com/questions/19190/), где консенсус« нет, они не должны ». –

+0

FYI, ваши два 'OleDbCommand' и ваш' OleDbDataReader' должны находиться в 'использовании' блоков. –

ответ

1

Сначала вы должны быть уверены, что база данных полей Количество и цена оо числовой тип. Если они являются Text, тогда ваш запрос объединяет строковые значения, переданные как параметры, с строкой, присутствующей в столбце базы данных.

Во-вторых, когда вы передаете параметры с помощью AddWithValue, структура регистрирует тип данных для просмотра типа данных переданного значения. В вашем случае вы передаете строку, и механизм базы данных видит строку, которая будет конкатенирована с существующим значением. Вам необходимо преобразовать, прежде чем перейти к соответствующему типу данных.

Наконец, используйте все параметры параметризованного запроса для каждой вещи, которую вы передаете движку базы данных, особенно если переданное значение поступает из текстового поля ввода.

OleDbCommand cmd = new OleDbCommand("SELECT * FROM ItemTemp WHERE [email protected]", 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 [email protected], 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(); 
} 
+0

вы были просто немного позже поздно lol..и просто заметили, что ваш код выглядит чистым, во всяком случае есть ошибка в этой области, Parameters.AddWithValue ("@ iten", txtItemName.Text) ;, это должно быть @item, hehe..thanks;) –

+0

Вы, конечно, правы, исправлены – Steve

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)); 
+0

, что сделало бы трюк как ну .. – MethodMan