Я работаю над личным проектом для компании, в которой я работаю, чтобы контролировать уровень запасов, чтобы практиковать мой С#.
Я хочу, чтобы мое приложение выполняло поиск в tblJuiceStock, нашло соответствующий FlavorID тому, что вводит пользователь, и обновило запас этой записи с помощью запроса UPDATE SET.
public void InsertJuiceStockWithCheck()
{
using (OleDbConnection conn = new OleDbConnection())
{
conn.ConnectionString = ConnectionString;
conn.Open();
string tblJuiceStockCheck = "SELECT FlavourID, Quantity FROM tblJuiceStock";
OleDbCommand cmdCheck = new OleDbCommand(tblJuiceStockCheck, conn);
OleDbDataAdapter daCheck = new OleDbDataAdapter(cmdCheck);
DataTable dtCheck = new DataTable();
daCheck.Fill(dtCheck);
foreach (DataRow row in dtCheck.Rows)
{
if ((int)row["FlavourID"] == fID)
{
int currentQty = (int)row["Quantity"];
int updatedQty = currentQty + qty;
string tblJuiceStockExisting = @"UPDATE tblJuiceStock
SET Quantity = @newquantity
WHERE FlavourID = @flavourID";
OleDbCommand cmdJuiceStockExisting = new OleDbCommand(tblJuiceStockExisting, conn);
cmdJuiceStockExisting.Parameters.AddWithValue("@flavourID", fID);
cmdJuiceStockExisting.Parameters.AddWithValue("@newquantity", updatedQty);
cmdJuiceStockExisting.ExecuteNonQuery();
matchFound = true;
break;
}
}
if (!matchFound)
{
string tblJuiceStockNew = "INSERT INTO tblJuiceStock (FlavourID, Quantity, MinStockPOS) VALUES (@fID, @quantity, @minstock)";
OleDbCommand cmdJuiceStockNew = new OleDbCommand(tblJuiceStockNew, conn);
cmdJuiceStockNew.Parameters.AddWithValue("@fID", fID);
cmdJuiceStockNew.Parameters.AddWithValue("@quantity", qty);
cmdJuiceStockNew.Parameters.AddWithValue("@minstock", amt);
cmdJuiceStockNew.ExecuteNonQuery();
}
}
}
Обратите внимание: этот запрос отлично работает в Access, когда я заменяю параметры одинаковыми значениями. Кроме того, с помощью точек останова я определил, что параметры имеют правильные значения, присвоенные им переменные получены в другом методе, все методы вызываются в событии кнопки отправки.
Однако значение Quantity в TblJuiceStock остается прежним.
Я прочитал об этом, я использую именованные параметры в нескольких других командах oledb в своем приложении, и это работает нормально. Например, если (!matchfound) содержит команду oledb, использующую именованные параметры, и этот запрос работает нормально.
Мои извинения за заявление. Когда я использую OleDb против MsSql, он жалуется. Признаюсь, я никогда не пробовал это против MsAccess.





После некоторого времени возни с ответом было просто. OLEDB работает с именованными параметрами, но вы должны объявить их, если вы их не объявите, они используют позиционирование параметров для их сопоставления.
Моя проблема заключалась в том, что в строке запроса у меня сначала был @newquantity, а затем @flavourID, тогда как при добавлении параметров я сначала добавлял @flavourID, а затем @newquantity.
Я думаю, что OleDbConnection требует
?для параметров в строке Sql, а не для именованных