Member 13760471 Ответов: 2

Sql server:как вычесть 2 столбца и сохранить результат в следующей строке


у меня есть таблицы следующим образом:
Apply_ID Name Days_Applied Balance(по умолчанию=12)
1 Милтон 1 11
2 Милтон 2 9

Когда пользователь(milton) впервые подает заявку, баланс со значением по умолчанию 12 дней вычитается на "Days_Applied" в этом случае 1, который оставляет баланс на уровне 11. Когда тот же пользователь подает заявку снова(Apply_ID =2), баланс 11 вычитается из значения Days_Applied и становится 9 и так далее.
Моя проблема заключается в том, что поскольку l сделал баланс со значением по умолчанию 12, баланс вычитает значение по умолчанию 12-Days_Applied и показывает результаты, как показано ниже:

Apply_ID Имя Days_Applied Баланс
1 Милтон 1 11
2 Милтон 2 10

Что я уже пробовал:

l have this sql query:
("UPDATE applications SET Balance = Balance-Days_Applied WHERE Apply_ID = '" & listBoxApplications.SelectedItem & "'")

l am selecting the application from a list box.

Richard Deeming

Ваш код уязвим для SQL-инъекция[^]. НИКОГДА используйте конкатенацию строк для построения SQL-запроса. ВСЕГДА используйте параметризованный запрос.

Все, что вы хотели знать о SQL-инъекции (но боялись спросить) | Трой Хант[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? | Обмен Стеками Информационной Безопасности[^]
Шпаргалка по параметризации запросов | OWASP[^]

Using cmd As New SqlCommand("UPDATE applications SET Balanace = Balance - Days_Applied WHERE Apply_ID = @ApplyID", connection)
    cmd.Parameters.AddWithValue("@ApplyID", listBoxApplications.SelectedItem)
    
    connection.Open()
    cmd.ExecuteNonQuery()
End Using

2 Ответов

Рейтинг:
13

Christiaan van Bergen

Баланс столбца-это согласованное значение. Это не то, что вы обычно храните в строке деталей. В противном случае, всякий раз, когда вы добавляете или обновляете одну строку, вам нужно будет обновить все строки для (в данном случае) Milton, чтобы показать правильный баланс.

Почему бы не сделать таблицу с приложениями:

CREATE TABLE [Applications] (Apply_ID int, [Name] nvarchar(500), Days_Applied int)
Затем создайте представление для баланса или отдельную таблицу для баланса.
CREATE VIEW [View_Balance]
AS
select [Name], 12-SUM(Days_Applied) from Applications
Group BY [Name]
GO
Теперь вы можете использовать это представление для отображения текущего баланса на одного пользователя. Если вы решите иметь отдельную таблицу для балансов, вам нужно будет обновлять эту таблицу после каждой вставки или обновления таблицы [приложения].


Рейтинг:
0

Member 13760471

Спасибо Кристиан он работал, я смог создать представление


Richard Deeming

Если вы хотите ответить на решение, нажмите кнопку "есть вопрос или комментарий?" кнопка под этим решением.

НЕ опубликуйте свой ответ как новое "решение".