powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как генерировать последовательные числа? (типа счетчика в Access, нужно для Oracle)
9 сообщений из 9, страница 1 из 1
Как генерировать последовательные числа? (типа счетчика в Access, нужно для Oracle)
    #33239404
Kroket
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!
БД и приложение переводим из Access в Oracle.
В Access есть тип данных счетчик, а в Oracle нет. На форуме Oracle дают советы использовать для этого тригерры, в которых всю эту бодягу писать для каждой таблицы. Но что-то не очень хочется огород городить.
Как-то давно сталкивался с описанием (где не помню) о функции, которая генерит уникальные номера в зависимости от системной даты, времени и вероятность выдачи одного и того же числа очень низка.
Никто не в курсе этого или может есть еще какой-то вариант?
...
Рейтинг: 0 / 0
Как генерировать последовательные числа? (типа счетчика в Access, нужно для Oracle)
    #33239483
LeonM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если не обяательно целое число, то
Код: plaintext
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.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
'LbUuid

Private Type Uuid
    data1 As Long
    data2 As Integer
    data3 As Integer
    data4( 7 ) As Byte
End Type

Private Declare Function CoCreateGuid Lib "ole32" (ByVal pg As Long) As Long
Private Declare Function UuidToString Lib "Rpcrt4" Alias "UuidToStringA" (ByVal pg As Long, ps As Long) As Long
Private Declare Function RpcStringFree Lib "Rpcrt4" Alias "RpcStringFreeA" (ps As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal tgt As Long, ByVal src As Long, ByVal size As Long)

Private m_u As Uuid

Private Function Generate() As Boolean
    Generate = CoCreateGuid(VarPtr(m_u)) =  0 
End Function

Public Function Guid() As String
    Dim i As Integer
    Guid = ""
    If Generate() Then
        Guid = "{" & Hex(m_u.data1) & "-" & Hex(m_u.data2) & "-" & Hex(m_u.data3) & "-"
        For i =  0  To  7 
            Guid = Guid & Hex(m_u.data4(i))
        Next i
        Guid = Guid & "}"
    End If
End Function

Private Function StringToGuid(ByVal str As String) As Uuid
    Dim d( 2 ) As Integer, s As String, l As Long, i As Integer, g As Uuid
    On Error GoTo wrong
    StringToGuid.data1 =  0 
    StringToGuid.data2 =  0 
    StringToGuid.data3 =  0 
    For i =  0  To  7 
        StringToGuid.data4(i) =  0 
    Next i
    i =  0 
    l =  0 
    For i =  1  To Len(str)
        If Mid(str, i,  1 ) = "-" Then
            d(l) = i
            l = l +  1 
        End If
    Next i
    s = "&H" & Mid(str,  2 , d( 0 ) -  2 )
    g.data1 = CLng(s)
    s = "&H" & Mid(str, d( 0 ) +  1 , d( 1 ) - d( 0 ) -  1 )
    g.data2 = CInt(s)
    s = "&H" & Mid(str, d( 1 ) +  1 , d( 2 ) - d( 1 ) -  1 )
    g.data3 = CInt(s)
    For i =  0  To  7 
        s = "&H" & Mid(str, d( 2 ) +  1  + i *  2 ,  2 )
        g.data4(i) = CByte(s)
    Next i
    StringToGuid = g
wrong:
End Function
...
Рейтинг: 0 / 0
Как генерировать последовательные числа? (типа счетчика в Access, нужно для Oracle)
    #33239502
Melkiades
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и к чему огород городить? Есть же стандартная.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Private Declare Function CoCreateGuid Lib "ole32" (id As Any) As Long
Private Sub Form_Load()
    MsgBox "Generated GUID: " + CreateGUID
End Sub
Public Function CreateGUID() As String
    Dim id( 0  To  15 ) As Byte
    Dim Cnt As Long, GUID As String
    If CoCreateGuid(id( 0 )) =  0  Then
        For Cnt =  0  To  15 
            CreateGUID = CreateGUID + IIf(id(Cnt) <  16 , "0", "") + Hex$(id(Cnt))
        Next Cnt
        CreateGUID = Left$(CreateGUID,  8 ) + "-" + Mid$(CreateGUID,  9 ,  4 ) + "-" + Mid$(CreateGUID,  13 ,  4 ) + "-" + Mid$(CreateGUID,  17 ,  4 ) + "-" + Right$(CreateGUID,  12 )
    Else
        MsgBox "Error while creating GUID!"
    End If
End Function
...
Рейтинг: 0 / 0
Как генерировать последовательные числа? (типа счетчика в Access, нужно для Oracle)
    #33239537
Kroket
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем спасибо большое.
И вопрос насчет стандартной функции, а она всегда уникальные числа генерит или с какой степенью вероятности? И эти числа целые?
И что это за:
MsgBox "Error while creating GUID!" это в каких случаях ошибка выскакивает?
...
Рейтинг: 0 / 0
Как генерировать последовательные числа? (типа счетчика в Access, нужно для Oracle)
    #33239560
Melkiades
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KroketВсем спасибо большое.
И вопрос насчет стандартной функции, а она всегда уникальные числа генерит или с какой степенью вероятности? И эти числа целые?

C очень большой. Майкрософт сама ей пользуется. Вот только целые числа сгенерировать уникальными невозможно, имхо (если автоинкремент не использовать). Поэтому - не целые.
Kroket
И что это за:
MsgBox "Error while creating GUID!" это в каких случаях ошибка выскакивает?
Если функция CoCreateGuid ничего не сгенерировала
...
Рейтинг: 0 / 0
Как генерировать последовательные числа? (типа счетчика в Access, нужно для Oracle)
    #33239591
Kroket
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ясно, спасибо
...
Рейтинг: 0 / 0
Как генерировать последовательные числа? (типа счетчика в Access, нужно для Oracle)
    #33239613
Код: plaintext
 Поэтому - не целые.
целые-целые. даже не сомневайся. тока 128-битные
...
Рейтинг: 0 / 0
Как генерировать последовательные числа? (типа счетчика в Access, нужно для Oracle)
    #33244975
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А почему нельзя использовать объект SEQUENCE оракла?
Это - стандартная оракловая альтернатива счетчикам других СУБД.
Можно читать следующее значение перед вставкой записи в БД.
Код: plaintext
1.
2.
3.
4.
5.
   If rsSEQ.State = adStateOpen Then rsSEQ.Close
   rsSEQ.Open "SELECT МояСХЕМА.SEQ_ПКМоейТабилицы.NEXTVAL FROM DUAL" _
         , Conn1, adOpenForwardOnly, adLockReadOnly, adCmdText
   m_NextID = rsSEQ( 0 )
   rsSEQ.Close
   'Используем m_ID для вновь добавляемой записи
Можно прочитать только что вставленное занчение триггером (который естественно использует SEQUENCE)
Код: plaintext
1.
2.
3.
4.
5.
   If rsSEQ.State = adStateOpen Then rsSEQ.Close
   rsSEQ.Open "SELECT МояСХЕМА.SEQ_ПКМоейТабилицы.CURRVAL FROM DUAL" _
         , Conn1, adOpenForwardOnly, adLockReadOnly, adCmdText
   m_CurrID = rsSEQ( 0 )
   rsSEQ.Close
   'Используем m_ID например для определения значения внешнего ключа
...
Рейтинг: 0 / 0
Как генерировать последовательные числа? (типа счетчика в Access, нужно для Oracle)
    #33249345
Ander Borisov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
WorobjoffА почему нельзя использовать объект SEQUENCE оракла?

Послностью согласен. Только при CREATE SEQUENCE установить необходимое начальное значение.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как генерировать последовательные числа? (типа счетчика в Access, нужно для Oracle)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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