Как я могу получить код для вставки столько идентификаторов, сколько необходимо? - PullRequest
0 голосов
/ 03 февраля 2012

Когда пользователь заполняет форму, он / она может заполнить до 5 записей одновременно.

Если пользователь завершает 1 запись, идентификатор увеличивается на 1.

Однакокогда пользователь завершает более 1 записи, мы ожидаем, что идентификатор будет увеличиваться на столько записей, сколько пользователь завершил.

Например, предположим, что пользователь с идентификатором 2516 завершает 3 записи, мы ожидаем увидетьчто-то вроде:

ID    User
1      2516
2      2516
3      2516

Если другой пользователь с идентификатором 4874 завершит 2, мы будем:

ID    User           
 4    4874
 5    4874

и т. д.

Вместо этого значение идентификатора равноувеличение на 1 независимо от того, сколько новых записей вводит один конкретный пользователь.

Я знаю, что это основано на приведенном ниже коде.

Не могли бы вы помочь мне исправить это так, чтобы значение увеличивалосьосновано на том, сколько записей отправляет конкретный пользователь.

Мы не хотим использовать идентификатор для его увеличения.

Ваша помощь, как обычно, высоко ценится.

sql += "INSERT INTO Emp (UserSequence, employee_id, charity_code, check_amt, chcknum, one_time, bi_weekly, cash, donate_choice, date_stamp) "
                sql += "VALUES ((select isNull(max(UserSequence), 0) + 1, '" & Replace(employee_idLabel.Text, "'", "''") & "','" & Replace(dedval.SelectedValue, "'", "''") & "','" & Replace(chckval.Text, "'", "''") & "','" & Replace(chcknumval.Text, "'", "''") & "','" & Replace(onetimeval.Text, "'", "''") & "','" & multival.Text & "','" & Replace(cashval, "'", "''") & "','" & Replace(donatechoice.SelectedItem.Value, "'", "''") & "','" & Replace(datestamp, "'", "''") & "');"

Ответы [ 3 ]

2 голосов
/ 03 февраля 2012

Посмотрите, как сделать столбец ID столбцом IDENTITY .Это автоматически назначит каждой строке инкрементный идентификатор, и вам не нужно беспокоиться об этом самостоятельно (т. Е. Вам даже не нужно указывать столбец в операторе вставки).1006 *

Попытка самостоятельно поддерживать инкрементные идентификаторы, скорее всего, приведет к боли, особенно когда несколько пользователей пытаются вставить одновременно.

1 голос
/ 03 февраля 2012

ну это скорее ваша бизнес-логика.Я бы порекомендовал вам следующую структуру

create table myTable (
    int UserId not null,
    int myTableId int identity(1,1) primary key,
    int UserSequence int not null
)

и вставлял такие операторы следующим образом.

insert into myTable (UserId, UserSequence) values 
(10, (select isNull(max(UserSequence), 0) + 1 from myTable where UserId=10))

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

EDIT

Кстати, ваш VB.Code выглядит очень громоздким.

  1. Не использовать конкатенации строк.Это небезопасно.(Лучшее исключение в случае неправильного SQL, в худшем случае инъекция SQL)
  2. Просто взгляните на ORM.Это в значительной степени справится с большой нагрузкой sql для вас.Лично я предлагаю вам Entity Framework.

С ORM ваш код будет выглядеть примерно так:

Dim dc As New MyDatabaseContext
Dim records = dc.Recors.Where(Function(x) x.UserId = 10)
Dim last as Integer = 0
If records.Count > 0 Then last = records.Max(Function(x) x.UserSequence)
Dim instance As New Record With {
    .UserId = 10,
    .UserSequence = last + 1
}
dc.Records.Add(instance)
dc.SaveChanges()
0 голосов
/ 03 февраля 2012

этот код небезопасен, что если другой процесс выполняется между вашим SELECT и INSERT? Вы можете сделать это в том же кадре с SQL:

INSERT INTO table EMP (ID, ...) VALUES ( (SELECT MAX(ID)+1 FROM EMP), ...);

Конечно, если вы можете использовать поле автоинкремента / последовательности, вам не нужно беспокоиться об идентификаторах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...