powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / А как сразу получить значее счетчика при добавлении записи в таблицу БД
19 сообщений из 19, страница 1 из 1
А как сразу получить значее счетчика при добавлении записи в таблицу БД
    #38135453
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Использую такую процедуру для добавления записи в таблицу:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Public Sub AddLogStr_BD(str_data As GeneralLog) 'добавление новой записи в the_table
  Dim SQLInfo As SQL_data
    
  'запись новой строчки в таблицу the_table
  SQLInfo = PrepareRecordLog(str_data)
  If (Len(SQLInfo.SQL_fields) > 0) And (Len(SQLInfo.SQL_values) > 0) Then
    'добавление записи
    adoConn.BeginTrans
    adoConn.Execute "INSERT INTO the_table (" & SQLInfo.SQL_fields & _
     ") VALUES(" & SQLInfo.SQL_values & ")"
    adoConn.CommitTrans
  End If
End Sub



str_data,SQLInfo - мои типы, не суть
Вопрос в чем:
В таблице есть еще поле ID (счетчик), кот. назначается автоматически (и заранее неизвестно).
Я хочу переделать эту процедуру в функцию так чтоб
возвращалось RS!ID
для добаленной записи.
Возможно ли вернуть RS!ID сразу без повторного обращения типа
Код: vbnet
1.
2.
  Set RS = adoConn.Execute _
                      ("SELECT TOP 1 * FROM the_table  WHERE ...)
...
Рейтинг: 0 / 0
А как сразу получить значее счетчика при добавлении записи в таблицу БД
    #38135496
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я только так пока придумал, но это с доп.запросом, не знаю насколько хорошо:


Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
Public Function AddLogStr_BD(str_data As GeneralLog) As Long 'добавление новой записи в the_table
  Dim SQLInfo As SQL_data
  Dim RS As ADODB.Recordset
    
  'запись новой строчки в таблицу audio_out
  SQLInfo = PrepareRecordLog(str_data)
  If (Len(SQLInfo.SQL_fields) > 0) And (Len(SQLInfo.SQL_values) > 0) Then
    'добавление записи
    adoConn.BeginTrans
    adoConn.Execute "INSERT INTO the_table (" & SQLInfo.SQL_fields & _
     ") VALUES(" & SQLInfo.SQL_values & ")"
    adoConn.CommitTrans
    
    my_JRO.RefreshCache adoConn
    Set RS = adoConn.Execute _
     ("SELECT TOP 1 ID FROM the_table ORDER BY ID DESC") 'последняя запись -максимальное значение индеса
    If RS.EOF = False Then 'если запись существует
      AddLogStr_BD = RS!id
    End If
    'уничтожение объекта RS
    RS.Close
    Set RS = Nothing
  End If
End Function


Вряд ли что-то перекрестится, т.к. только один exe работает с этой таблицей на добавление.
...
Рейтинг: 0 / 0
А как сразу получить значее счетчика при добавлении записи в таблицу БД
    #38135608
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77при добавлении записи в таблицу БДв какую СУБД?
...
Рейтинг: 0 / 0
А как сразу получить значее счетчика при добавлении записи в таблицу БД
    #38135616
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

Access, с другими не работаю.
Я так понял из других постов всякие SCOPE_IDENTITY не прокатят.
Если мой код нормальный и не имеет потенциальных проблем, то я его и оставлю.

Смысл в том, что при возникновении события кот. добавляется в log я
1) Добавляю строку в таблицу БД
2) Шлю SendMessage WM_COPYDATA "exe-шнику", кот. эту таблицу на ListView отображает (чтоб на ходу добавить в отображение эту одну строчку)

И в ListView тоже есть column ID, а естественно этот ID заранее не известен.
...
Рейтинг: 0 / 0
А как сразу получить значее счетчика при добавлении записи в таблицу БД
    #38135714
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Переделайте процедуру на работу через рекордсет. Тогда вместо
Код: vbnet
1.
adoConn.Execute "UPDATE..."

станет доступно
Код: vbnet
1.
2.
3.
4.
adoRS.AddNew
adoRS!Field=Value
adoRS.Update
newID = adoRS!ID
...
Рейтинг: 0 / 0
А как сразу получить значее счетчика при добавлении записи в таблицу БД
    #38135718
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaПеределайте процедуру на работу через рекордсет.Чтобы это заработало нужно adUseCliend, adOpenStatic, adLockBatchOptimistic.
...
Рейтинг: 0 / 0
А как сразу получить значее счетчика при добавлении записи в таблицу БД
    #38135852
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А мож ТС-а это устроит...
...
Рейтинг: 0 / 0
А как сразу получить значее счетчика при добавлении записи в таблицу БД
    #38136742
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyAkinaПеределайте процедуру на работу через рекордсет.Чтобы это заработало нужно adUseCliend, adOpenStatic, adLockBatchOptimistic.
Мне так делать не хочется.
Код: vbnet
1.
adoConn.Execute "INSERT INTO 


а также
Код: vbnet
1.
Set RS = adoConn.Execute      ("SELECT 


проверено временем.
Хотя и не в этой комбинации.

Посему если моя
Public Function AddLogStr_BD(
не вызывает явных нареканий,
то я бы так и оставил.
Т.е. сойдет или не сойдет?

Все записи в таблицу осуществляются из кода одной формы

Но это может происходить "по событию" (например закончился телефонный вызов)
Код: vbnet
1.
2.
3.
4.
5.
6.
Public Sub HandleMessages(ByVal Ptr As Long)
...
  Select Case MesType
    Case OpalIndCallCleared:
       AddLog (call info)
       AddLog (call recording)


Либо принудительно (например пользователь решил прекратить запись телефонного разговора)
Код: vbnet
1.
2.
Private Sub CommandStopRecord_Click()
       AddLog (call recording)



В любом случае как итог вызывается функция AddLogStr_BD приведенная выше.

Код что я сделал сразу после добавления записи выдает максимальный индекс причем с гарантией что в БД все обновилось и запись добавленная первым запросом точно учитывается.
Я так понимаю одновременного исполнения 2-х функций AddLogStr_BD (т.е. ситуация когда кто-то другой сделал еще одну запись между первым и вторым запросом) логически исключена.
...
Рейтинг: 0 / 0
А как сразу получить значее счетчика при добавлении записи в таблицу БД
    #38136913
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Т.е. сойдет или не сойдет?Тебе нужно наше мнение или в чем-то нас убедить? Мнение мы высказали. И оно тоже проверено временем, никаким иным способом id лично я не получал, ибо он наиболее правильный.

Дмитрий77Я так понимаю одновременного исполнения 2-х функций AddLogStr_BD (т.е. ситуация когда кто-то другой сделал еще одну запись между первым и вторым запросом) логически исключена.Как раз наоборот, если клиентов несколько, между insert и select теоретически может произойти еще один insert, и тогда вернется чужой id. Но если клиент один, то можно на это забить.

Еще хороший выход не использовать счетчик, а генерировать id самостоятельно и использовать в качестве него guid.
...
Рейтинг: 0 / 0
А как сразу получить значее счетчика при добавлении записи в таблицу БД
    #38137012
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyТебе нужно наше мнение или .
Мне нужно знать что ТЕОРЕТИЧЕСКИ исключено и описанное здесь
AntonariyКак раз наоборот, если клиентов несколько, между insert и select теоретически может произойти еще один insert, и тогда вернется чужой id. Но если клиент один, то можно на это забить.
не соответствует довольно подробно описанному мною конкретному применению:
Дмитрий77только один exe работает с этой таблицей на добавление

Все записи в таблицу осуществляются из кода одной формы
Но это может происходить "по событию" (например закончился телефонный вызов)...
Либо принудительно (например пользователь решил прекратить запись телефонного разговора)
...
при том что
В любом случае как итог вызывается функция AddLogStr_BD приведенная выше.
Т.е. да, exe-шник кот. имеет право добавлять записи один и не может быть запущен более одного экземпляра.

AntonariyЕще хороший выход не использовать счетчик, а генерировать id самостоятельно и использовать в качестве него guid.
Я не хочу ничего менять, меня устраивает "автосчетчик".
Ну, в предыдущей подобной реализации я этот ID никак не использовал в ListView.
Сейчас решил добавить (хотя колонка ID в Listview по умолчанию скрыта) -на всякий случай.
Смысл этого ID в ListView -чтобы по записи в Listview быстро обратиться к нужной записи в БД, например для получения значения какого-либа поля, не хранимого в ListView.
На тек. момент я не уверен понабится ли мне это вообще, но проще добавить сразу, чем потом делать такое добавление по диагонали, чего-то упустив при правке кода.
...
Рейтинг: 0 / 0
А как сразу получить значее счетчика при добавлении записи в таблицу БД
    #38137021
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вопрос я задал в надежде на то что существует конструкция позволяющая сделать

Код: vbnet
1.
2.
    Set RS = adoConn.Execute ("INSERT INTO the_table ... ЧТО-ТО ЧТО Я НЕ ЗНАЮ...")"
    ID = RS!ID


и кто-нибудь подсказал бы что is есть это ЧТО-ТО ЧТО Я НЕ ЗНАЮ.
...
Рейтинг: 0 / 0
А как сразу получить значее счетчика при добавлении записи в таблицу БД
    #38137125
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ясно.

Просто было странно услышать от тебя подобный вопрос, твой уровень определенно выше уровня этого вопроса. На этом уровне вполне можешь положиться на собственное мнение. :)
...
Рейтинг: 0 / 0
А как сразу получить значее счетчика при добавлении записи в таблицу БД
    #38137138
Gwa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,
А разве запрос select @@identity as LastId
после Insert ... не даёт нужного значения ?
...
Рейтинг: 0 / 0
А как сразу получить значее счетчика при добавлении записи в таблицу БД
    #38137178
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GwaДмитрий77,
А разве запрос select @@identity as LastId
после Insert ... не даёт нужного значения ?В аксессе не дает.
...
Рейтинг: 0 / 0
А как сразу получить значее счетчика при добавлении записи в таблицу БД
    #38137181
qwerty112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AntonariyGwaДмитрий77,
А разве запрос select @@identity as LastId
после Insert ... не даёт нужного значения ?В аксессе не дает.
даёт
http://www.sql.ru/faq/faq_topic.aspx?fid=214 Q8
...
Рейтинг: 0 / 0
А как сразу получить значее счетчика при добавлении записи в таблицу БД
    #38137183
Gwa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyGwaДмитрий77,
А разве запрос select @@identity as LastId
после Insert ... не даёт нужного значения ?В аксессе не дает.
Это неправда..
Я пользуюсь этим приёмом на БД Access и он прекрасно работает
...
Рейтинг: 0 / 0
А как сразу получить значее счетчика при добавлении записи в таблицу БД
    #38137189
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну надо же...
Наверное моя инфа возрастом с 97й аксесс.
...
Рейтинг: 0 / 0
А как сразу получить значее счетчика при добавлении записи в таблицу БД
    #38137212
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наверное Диме надо было тогда вопрос в Аксессе задать - быстрей бы получил правильный ответ
...
Рейтинг: 0 / 0
А как сразу получить значее счетчика при добавлении записи в таблицу БД
    #38137219
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gwa запрос select @@identity as LastId
после Insert ... не даёт нужного значения ?

Да вот так работает:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
Public Function AddLogStr_BD(str_data As GeneralLog) As Long 'добавление новой записи в the_table
  Dim SQLInfo As SQL_data
  Dim RS As ADODB.Recordset
    
  'запись новой строчки в таблицу the_table
  SQLInfo = PrepareRecordLog(str_data)
  If (Len(SQLInfo.SQL_fields) > 0) And (Len(SQLInfo.SQL_values) > 0) Then
    'добавление записи
    adoConn.BeginTrans
    adoConn.Execute "INSERT INTO the_table (" & SQLInfo.SQL_fields & _
     ") VALUES(" & SQLInfo.SQL_values & ")"
    adoConn.CommitTrans
    
    Set RS = New ADODB.Recordset
    RS.Open "SELECT @@identity as cou", adoConn
    If RS.EOF = False Then 'если запись существует
      AddLogStr_BD = RS!cou
    End If
    'уничтожение объекта RS
    RS.Close
    Set RS = Nothing
    
'    my_JRO.RefreshCache adoConn
'    Set RS = adoConn.Execute _
'     ("SELECT TOP 1 ID FROM the_table ORDER BY ID DESC") 'поледняя запись -максимальное значение индеса
'    If RS.EOF = False Then 'если запись существует
'      AddLogStr_BD = RS!id
'    End If
'    'уничтожение объекта RS
'    RS.Close
'    Set RS = Nothing
  End If
End Function



2 вопроса:
1) Я сделал как вы сказали. Но не напутал ли ничего? В смысле местоположения adoConn.BeginTrans и adoConn.CommitTrans
Не помню зачем они нужны, но кажется чтобы база обновлялась без задержек.
2) А в чем преимущество данного метода над моим закомментированным? Мне кажется, что если клиент не один (ну, у меня он один), то и здесь никто (в теории) не помешает вклиниться между первой и второй частью.

AntonariyНаверное моя инфа возрастом с 97й аксесс
Мне честно на Access как таковой наплевать.
Но помню что при переходе с 97-го на 2000-й лет 12 тому назад пришлось ездить за диском SP5 на горбушку и это была большая проблема. Но я сам так и не уехал дальше 2000-го офиса - привык и все.

Базу используемую при разработке я создаю в Access 2000.
Но при инсталляции программа создает базу самостоятельно через ADOX, в моих постах эдак 2-х годичной давности отражено как я это делаю.
Но тут ряд наблюдений.
Было несколько раз когда я просил клиентов скинуть базу для понимания проблемы (не с самой базой, а чтоб понять какие иероглифы он напихал в значения таблиц и т.п.).
И если клиент вдруг перед тем как БД скинуть ее открывал в своем модном Access 2010 и т.п., то я эту базу у себя в Access2000 открыть уже не мог. Но при этом моя программа продолжает нормально работать с этой "обновленной" БД, как на компьютере клиента, так и на моем.
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / А как сразу получить значее счетчика при добавлении записи в таблицу БД
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]