purebasic.info

PureBasic forum
Текущее время: Сб окт 20, 2018 8:31 pm

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 31 ]  На страницу 1, 2, 3  След.
Автор Сообщение
СообщениеДобавлено: Пн янв 05, 2015 7:55 pm 
Не в сети
студент
Аватар пользователя

Зарегистрирован: Вс янв 04, 2015 6:47 pm
Сообщений: 4
Откуда: Украина
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
В справке к пурику можно найти такой пример
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  UseSQLiteDatabase()
 
  Filename$ = OpenFileRequester("Choose a file name", "PureBasic.sqlite", "*.sqlite|*.sqlite", 0)
 
  If CreateFile(0, Filename$)
    Debug "Database file created"
    CloseFile(0)
  EndIf
 
  If OpenDatabase(0, Filename$, "", "")
    Debug "Connected to PureBasic.sqlite"
    If DatabaseUpdate(0, "CREATE TABLE info (test VARCHAR(255));")
      Debug "Table created"
    EndIf
  EndIf
 



Кто может чем ещё поделиться?


Вложения:
Комментарий к файлу: Ещё пример по этой теме.
База данных.rar [223 KiB]
Скачиваний: 169
Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вт янв 06, 2015 11:59 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Пт янв 27, 2012 7:12 pm
Сообщений: 880
Откуда: Кустанай
Благодарил (а): 27 раз.
Поблагодарили: 13 раз.
Пункты репутации: 7
Ну а что именно интересует?
В принципе я её расшарил довольно плотно, почти всё сумел, единственное, я не нашёл способа запаролить базу, но она паролится только в новых версиях, или покупать что то надо, точно не помню.
В гугле весь язык запросов есть, самое сложное, что я делал, это запись массива в базу, не по одному элементу, а сразу кучей, до 500 элементов, а всё остальное просто, если база грамотно составлена.
Обращайся, поможем, чем сможем. :!:

_________________
Детям нельзя в интернет. От детей интернет тупеет.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вт янв 06, 2015 8:08 pm 
Не в сети
ассистент
Аватар пользователя

Зарегистрирован: Пт дек 05, 2014 11:48 pm
Сообщений: 15
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
Пункты репутации: 0
Код:
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
Global Button_0
EnableExplicit
 
UseSQLiteDatabase()
 
#AdressDB = 0
#frm_Main = 0
 
Enumeration ; Gadgets
  #gad_Panel
  #gad_ListAnschrift
  #gad_Container
  #gad_strName
  #gad_strVorname
  #gad_strStrasse
  #gad_strPLZ
  #gad_strOrt
  #gad_strTelefon
  #gad_btnHinzufuegen
  #gad_btnAendern
  #gad_btnLoeschen
  #gad_btnSortieren
  #Button_0
  #Button_1
  #Window_1
EndEnumeration
Declare CreateFormMain()
Declare DatenSatzHinzufuegen()
Declare DatenSatzAendern()
Declare DatenSatzLoeschen()
Declare ListFuellen()
 
Define db_name.s = GetTemporaryDirectory() + "Adr.db"
Define SQL.s
 
; Мы проверяем , существует ли ужеDB , если нет,пусто DB создан .
If FileSize(db_name) <= 0
  If CreateFile(0, db_name)
    CloseFile(0)
    If OpenDatabase(#AdressDB, db_name, "", "")
      ; Мы создаем адреса таблицы , этозаявление SQL :
      ; " CREATE TABLE table_name ( имя поля [Тип ] имя_поля [ TYPE] , ...) " отвечает
      ; Тип поля , как правило, дополнительно на SQLite, так что мы , как правило, опускать это тоже.
      ; Исключением из этого правила являетсяуникальный идентификатор иBLOB. Это всегда типа INTEGER, или BLOB
      ; Синтаксис для поля ID : имя_поля INTEGER PRIMARY KEY AUTOINCREMENT
      ; Рекомендуется, чтобызаявление SQL разделить на несколько строк.
      SQL = "CREATE TABLE adressen (id INTEGER PRIMARY KEY AUTOINCREMENT,"
      SQL + " name, vorname, strasse, plz, ort, telefon, notizen, fotodata BLOB, fotosize INTEGER)"
     
      ; Если мы нужен результат , мы используем: обновление базы данных (ID , SQL заявление)
      ; в противном случае запроса базы данных ( ID , SQL заявление ), который мы увидим позже.
      If DatabaseUpdate(#AdressDB, SQL) = #False
        Debug DatabaseError()
        End
      EndIf
    Else
      Debug DatabaseError()
      End
    EndIf
  Else
    Debug db_name + " не может быть создан."
    End
  EndIf
Else ; База данных уже существует и открыт.
  If OpenDatabase(#AdressDB, db_name, "", "") = #False
    Debug DatabaseError()
    End
  EndIf
EndIf
 
; После того как мы открыли нашу базу данных (будь то пустой или уже с содержимым )
; мы создаем первый главное окно
 
CreateFormMain()
 
Define i
 
; Теперь наша ListIconGadget заполняется данными
ListFuellen()
 
; Вот и начинается наша MainLoop .
Repeat
  Select WaitWindowEvent()
 
    Case #PB_Event_CloseWindow
      CloseDatabase(#AdressDB)
      Break
     
    Case #PB_Event_Gadget
      Select EventGadget()
 
        Case #gad_ListAnschrift
          Select EventType()
            Case #PB_EventType_Change
              i = GetGadgetState(#gad_ListAnschrift)
              If i > -1
                SetGadgetText(#gad_strName, GetGadgetItemText(#gad_ListAnschrift, i, 1))
                SetGadgetText(#gad_strVorname, GetGadgetItemText(#gad_ListAnschrift, i, 2))
                SetGadgetText(#gad_strStrasse, GetGadgetItemText(#gad_ListAnschrift, i, 3))
                SetGadgetText(#gad_strPLZ, GetGadgetItemText(#gad_ListAnschrift, i, 4))
                SetGadgetText(#gad_strOrt, GetGadgetItemText(#gad_ListAnschrift, i, 5))
                SetGadgetText(#gad_strTelefon, GetGadgetItemText(#gad_ListAnschrift, i, 6))
              Else
                SetGadgetText(#gad_strName, "")
                SetGadgetText(#gad_strVorname, "")
                SetGadgetText(#gad_strStrasse, "")
                SetGadgetText(#gad_strPLZ, "")
                SetGadgetText(#gad_strOrt, "")
                SetGadgetText(#gad_strTelefon, "")                
              EndIf
          EndSelect
        Case #gad_btnHinzufuegen ; Добавьте запись
          DatenSatzHinzufuegen()
       
        Case #gad_btnAendern
          If GetGadgetState(#gad_ListAnschrift)  > -1
            DatenSatzAendern()
          Else
            MessageRequester("SQLite Справка", "Пожалуйста, выберите  запись для обновления !")
          EndIf
         
        Case #gad_btnLoeschen
          If GetGadgetState(#gad_ListAnschrift)  > -1
            DatenSatzLoeschen()
          Else
            MessageRequester("SQLite Справка", "Пожалуйста, выделите  запись для удаления !")
          EndIf
         
        Case #gad_btnSortieren
          ListFuellen()
      EndSelect
  EndSelect
ForEver
End
 
Procedure ListFuellen()
  ; Теперь наш ListIconGadget заполняется данными
  ; Для этой целизаявление SQL SELECT несет ответственность. * Соответствует всем и после из определения таблицы
  ; ORDER BY имя поля обеспечивает сортировку !
  Protected itemtext.s, i
 
  ClearGadgetItems(#gad_ListAnschrift)
 
  If DatabaseQuery(#AdressDB, "SELECT * FROM adressen ORDER BY name")
    While NextDatabaseRow(#AdressDB)
      itemtext = GetDatabaseString(#AdressDB, 0) ; наш скрытый уникальный идентификатор,
      For i = 1 To 6 ; Имя и телефон !
        itemtext + #LF$ + GetDatabaseString(#AdressDB, i)
      Next
      AddGadgetItem(#gad_ListAnschrift, -1, itemtext)
    Wend
    FinishDatabaseQuery(#AdressDB); Эта функция всегда выполняется для запроса !
  Else
    Debug DatabaseError()
  EndIf
EndProcedure
 
Procedure DatenSatzHinzufuegen()
  Protected.s SQL, id, name, vorname, strasse, plz, ort, telefon, itemtext
 
  name = GetGadgetText(#gad_strName)
  vorname = GetGadgetText(#gad_strVorname)
  strasse = GetGadgetText(#gad_strStrasse)
  plz = GetGadgetText(#gad_strPLZ)
  ort = GetGadgetText(#gad_strOrt)
  telefon = GetGadgetText(#gad_strTelefon)
 
  ; Этозаявление SQL : " INSERT INTO ... " отвечает !
  SQL = "INSERT INTO adressen (name, vorname, strasse, plz, ort, telefon) "
  SQL + "VALUES ('"
  SQL + name + "','"
  SQL + vorname + "','"
  SQL + strasse + "','"
  SQL + plz + "','"
  SQL + ort + "','"
  SQL + telefon + "')"
 
  If DatabaseUpdate(#AdressDB, SQL) ; Введите в БД .
    ; Теперь нам нужен автоматически созданный идентификатор , чтобы ввести его в нашем списке
    If DatabaseQuery(#AdressDB, "SELECT last_insert_rowid()")
      NextDatabaseRow(#AdressDB)
      id = GetDatabaseString(#AdressDB, 0)
      FinishDatabaseQuery(#AdressDB)
     
      itemtext = id + #LF$ + name + #LF$ + vorname + #LF$ + strasse + #LF$ + plz + #LF$ + ort + #LF$ + telefon
      AddGadgetItem(#gad_ListAnschrift, -1, itemtext)
    EndIf
  Else
    Debug DatabaseError()
  EndIf
EndProcedure
 
Procedure DatenSatzAendern()
  Protected.s SQL, id, name, vorname, strasse, plz, ort, telefon, itemtext
  Protected item
 
  name = GetGadgetText(#gad_strName)
  vorname = GetGadgetText(#gad_strVorname)
  strasse = GetGadgetText(#gad_strStrasse)
  plz = GetGadgetText(#gad_strPLZ)
  ort = GetGadgetText(#gad_strOrt)
  telefon = GetGadgetText(#gad_strTelefon)
 
  ; Определите ID выбранной записи
  item = GetGadgetState(#gad_ListAnschrift)
  id = GetGadgetItemText(#gad_ListAnschrift, item, 0)
 
  ; Чтобы изменить , мы используем SQL заявление: " UPDATE table_name SET "
  SQL = "UPDATE adressen SET "
  SQL + "name = '" + name + "',"
  SQL + "vorname = '" + vorname + "',"
  SQL + "strasse = '" + strasse + "',"
  SQL + "plz = '" + plz + "',"
  SQL + "ort = '" + ort + "',"
  SQL + "telefon = '" + telefon + "' "
  SQL + "WHERE id = " + id
 
  If DatabaseUpdate(#AdressDB, SQL) = #False
    Debug DatabaseError()
  Else
    SetGadgetItemText(#gad_ListAnschrift, item, name, 1)
    SetGadgetItemText(#gad_ListAnschrift, item, vorname, 2)
    SetGadgetItemText(#gad_ListAnschrift, item, strasse, 3)
    SetGadgetItemText(#gad_ListAnschrift, item, plz, 4)
    SetGadgetItemText(#gad_ListAnschrift, item, ort, 5)
    SetGadgetItemText(#gad_ListAnschrift, item, telefon, 6)
  EndIf
EndProcedure
 
Procedure DatenSatzLoeschen()
  Protected.s SQL, id
  Protected item
 
  item = GetGadgetState(#gad_ListAnschrift)
  id = GetGadgetItemText(#gad_ListAnschrift, item, 0)
  SQL = "DELETE FROM adressen WHERE id = " + id
 
  If DatabaseUpdate(#AdressDB, SQL) = #False
    Debug DatabaseError()
  Else
    RemoveGadgetItem(#gad_ListAnschrift, item)
  EndIf
EndProcedure
 
Procedure CreateFormMain()
  Protected ListIconFlags = #PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect
  CompilerIf #PB_Compiler_OS = #PB_OS_Windows
    ListIconFlags | #PB_ListIcon_AlwaysShowSelection
  CompilerEndIf
  OpenWindow(0,200,305,640,416,"База",#PB_Window_SystemMenu| #PB_Window_MinimizeGadget| #PB_Window_MaximizeGadget)
  SetWindowColor(0, RGB(37,162,254))
  PanelGadget(#gad_Panel, 0, 0, 640, 415)
  AddGadgetItem(#gad_Panel, -1, "Выделить")
 
 
      ListIconGadget(#gad_ListAnschrift, 5, 5, GetGadgetAttribute(#gad_Panel, #PB_Panel_ItemWidth) - 10, GetGadgetAttribute(#gad_Panel, #PB_Panel_ItemHeight) - 10, "id", 1, ListIconFlags)
      ; Первый столбец управляет уникальный идентификатор и не видно !
      AddGadgetColumn(#gad_ListAnschrift, 1, "Имя", 95)
      AddGadgetColumn(#gad_ListAnschrift, 2, "Фамилия", 95)
      AddGadgetColumn(#gad_ListAnschrift, 3, "Адрес", 160)
      AddGadgetColumn(#gad_ListAnschrift, 4, "Дом", 45)
      AddGadgetColumn(#gad_ListAnschrift, 5, "место", 125)
      AddGadgetColumn(#gad_ListAnschrift, 6, "Телефон", 90)
      CloseGadgetList()
      ;***************************************************************************
     
      OpenWindow(1,200,200,640,80,"Dialogfenster",#PB_Window_SystemMenu| #PB_Window_MinimizeGadget| #PB_Window_MaximizeGadget)
     
  ContainerGadget(#gad_Container, 5, 20, 630, 60)
  StringGadget(#gad_strName, 5, 0, 95, 25, "")
  SetGadgetColor(#gad_strName, #PB_Gadget_FrontColor,RGB(0,0,255))
  SetGadgetColor(#gad_strName, #PB_Gadget_BackColor,RGB(242,252,186))
 
  StringGadget(#gad_strVorname, 100, 0, 95, 25, "")
  StringGadget(#gad_strStrasse, 195, 0, 160, 25, "")
  StringGadget(#gad_strPLZ, 355, 0, 45, 25, "")
  StringGadget(#gad_strOrt, 400, 0, 125, 25, "")
  StringGadget(#gad_strTelefon, 525, 0, 95, 25, "")
  ButtonGadget(#gad_btnHinzufuegen, 5, 30, 100, 25, "Добавить")
  ButtonGadget(#gad_btnAendern, 115, 30, 80, 25, "Обновить")
  ButtonGadget(#gad_btnLoeschen, 205, 30, 80, 25, "Удалить")
  ButtonGadget(#gad_btnSortieren, 540, 30, 80, 25, "Сортировать")
  CloseGadgetList()
 
EndProcedure
End
 


_________________
Нечево сказать Молчи!


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Сб мар 14, 2015 10:44 am 
Не в сети
док

Зарегистрирован: Ср фев 08, 2012 10:39 am
Сообщений: 131
Откуда: Красноярск
Благодарил (а): 7 раз.
Поблагодарили: 1 раз.
Пункты репутации: 0
Отмечусь по поводу SQLite из личного опыта (он может быть ошибочным и не претендует на истину), т.к. уже с десяток недоприложений сделал с поддержкой этой чудесной СУБД. Но напишу не в разряде алгоритмизации, т.к. там всё просто, а в области особенностей этой чудесной СУБД, глядишь может кто и обойдёт мои грабли заочно:

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

2. Соединение с БД периодически надо переподключать, в противном случае в памяти после каждого запроса собирается "мусор", что приводит к необоснованному росту приложения. Это критично, если приложение работает без остановки.

3. Скорость. Вот тут я недавно был просто шокирован. Не важно какие индексы строить. запись в БД ооооочень долгая. При чём скорость ни как не зависит от первичного ключа. Вот временные результаты по заполнению БД всего 150 записями.

Цитата:
; Результаты с типом индекса COLLATE BINARY ASC на кол-ве строк 150 (млсек)
; Запись без индекса - 43265
; Запись с ним - 45250
; Чтение без индекса - 0
; Четение с ним - 16
;
; Результаты с типом индекса COLLATE NOCASE ASC на кол-ве строк 150 (млсек)
; Запись без индекса - 41781
; Запись с ним - 51516
; Чтение без индекса - 0
; Четение с ним - 15
;
; Результаты с типом индекса COLLATE BINARY DESC на кол-ве строк 150 (млсек)
; Запись без индекса - 44391
; Запись с ним - 57218
; Чтение без индекса - 0
; Четение с ним - 16
;
; Результаты с типом индекса COLLATE NOCASE DESC на кол-ве строк 150 (млсек)
; Запись без индекса - 50843
; Запись с ним - 51829
; Чтение без индекса - 15
; Четение с ним - 0
;
; Что-то новое!!!!!
; Результаты с типом индекса COLLATE RTRIM ASC на кол-ве строк 150 (млсек)
; Запись без индекса - 49625
; Запись с ним - 54265
; Чтение без индекса - 0
; Четение с ним - 16

Вот код, которым это всё делал (только менял индексы)

Код:
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
 
Procedure d_SQLite_Start2()
        Protected lTextQuery.s
        Protected lCount.l
        Protected lFileName.s
       
        Protected lIndex.l
        Protected Dim UIDs.l(#D_SQLITE_NumItem)
       
        Protected lTime1.l, lTime2.l, lTime3.l, lTime4.l
        Protected lTmp.l
       
        UseSQLiteDatabase()
       
        ; Подготовка базы
        ;=================]
        lFileName = "TestSQLite.bds"
        ; Пересоздание базы
        If CreateFile(0, lFileName)
                CloseFile(0)
        EndIf
       
        If Not OpenDatabase(0, lFileName, "", "")
                Debug "Err"
                ProcedureReturn
;     If DatabaseUpdate(0, "CREATE TABLE info (test VARCHAR(255));")
;       Debug "Table created"
;     EndIf
  EndIf
 
  ; Создание 2-х таблиц
  lTextQuery = "CREATE TABLE Test1 (PK INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE, UID VARCHAR(19), Data1 VARCHAR, Data2 VARCHAR, Data3 INTEGER);"
        If Not DatabaseUpdate(0, lTextQuery)
                Debug "Err"
        EndIf
 
  lTextQuery = "CREATE TABLE Test2 (PK INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE, UID VARCHAR(19), Data1 VARCHAR, Data2 VARCHAR, Data3 INTEGER);"
        If Not DatabaseUpdate(0, lTextQuery)
                Debug "Err"
        EndIf
 
;       lTextQuery = "CREATE INDEX idx_Test2 ON Test2 (PK COLLATE BINARY ASC);"
;       lTextQuery = "CREATE INDEX idx_Test2 ON Test2 (PK COLLATE NOCASE ASC);"
;       lTextQuery = "CREATE INDEX idx_Test2 ON Test2 (PK COLLATE BINARY DESC);"
;       lTextQuery = "CREATE INDEX idx_Test2 ON Test2 (PK COLLATE NOCASE DESC);"
        lTextQuery = "CREATE INDEX idx_Test2 ON Test2 (PK COLLATE RTRIM ASC);"
        If Not DatabaseUpdate(0, lTextQuery)
                Debug "Err"
        EndIf
 
       
       
       
       
       
  ; Наполнеие таблиц
  ;==================
 
  lTime1 = ElapsedMilliseconds()
  For lCount=0 To #D_SQLITE_NumItem
        lTextQuery = "INSERT INTO Test1(UID, Data1, Data2, Data3) VALUES ('12" + Str(lCount) + "', 'dsf', 'wert', 23);"
        If Not DatabaseUpdate(0, lTextQuery)
                Debug "Err: " + DatabaseError()
        EndIf
  Next lCount
  lTime1 = ElapsedMilliseconds() - lTime1
 
  lTime2 = ElapsedMilliseconds()
  For lCount=0 To #D_SQLITE_NumItem
        lTextQuery = "INSERT INTO Test2(UID, Data1, Data2, Data3) VALUES ('32" + Str(lCount) + "', 'vbnvb', '43gg65', 31);"
        If Not DatabaseUpdate(0, lTextQuery)
                Debug "Err: " + DatabaseError()
        EndIf
  Next lCount
  lTime2 = ElapsedMilliseconds() - lTime2
 
 
 
 
  ; Выборка данных
  ;================
 
  lTextQuery = "Select PK FROM Test1"
  lIndex = 0
  If DatabaseQuery(0, lTextQuery)
        While NextDatabaseRow(0)
                UIDs(lIndex) = GetDatabaseLong(0, 0)
                lIndex = lIndex + 1
        Wend
        FinishDatabaseQuery(0)
  EndIf
  lTime3 = ElapsedMilliseconds()
  For lIndex=0 To #D_SQLITE_NumItem
        If UIDs(lIndex)
                lTextQuery = "Select PK FROM Test1 WHERE PK='" + UIDs(lIndex) + "'"
                  If DatabaseQuery(0, lTextQuery)
                        While NextDatabaseRow(0)
                                lTmp = GetDatabaseLong(0, 0)
                        Wend
                        FinishDatabaseQuery(0)
                  EndIf
        EndIf
  Next lIndex
  lTime3 = ElapsedMilliseconds() - lTime3
 
 
  lTextQuery = "Select PK FROM Test2"
  lIndex = 0
  If DatabaseQuery(0, lTextQuery)
        While NextDatabaseRow(0)
                UIDs(lIndex) = GetDatabaseLong(0, 0)
                lIndex = lIndex + 1
        Wend
        FinishDatabaseQuery(0)
  EndIf
  lTime4 = ElapsedMilliseconds()
  For lIndex=0 To #D_SQLITE_NumItem
        If UIDs(lIndex)
                lTextQuery = "Select PK FROM Test2 WHERE PK='" + UIDs(lIndex) + "'"
                  If DatabaseQuery(0, lTextQuery)
                        While NextDatabaseRow(0)
                                lTmp = GetDatabaseLong(0, 0)
                        Wend
                        FinishDatabaseQuery(0)
                  EndIf
        EndIf
  Next lIndex
  lTime4 = ElapsedMilliseconds() - lTime4
 
 
 
 
  ; Итоговое сообщение
  ;====================
  lTextQuery = "Создание без индекса: " + Str(lTime1) + Chr(10) + "Создание с индексом: " + Str(lTime2)
  lTextQuery = lTextQuery + Chr(10) + "Чтение без индекса: " + Str(lTime3) + Chr(10) + "Чтение с индексом: " + Str(lTime4)
  MessageRequester("Результат", lTextQuery)
 
EndProcedure
 



И это не особенность PB, это именно особенность SQLite, т.к. менеджере запросов от сторонних разраб-ов показатели абсолютно те же самые.
В общем вот такая вот беда(((

4. Чтобы не гадать как составить и отладить запрос рекомендую из личного опыта использовать менеджер от сторонних разрабов:
sqlitestudio_2.1.3 - Более лёгкий простой менеджер. Очень быстро. удобно и наглядно в нём отлаживается запрос. Также там-же можно поглядеть как формируются таблицы и индексы. чтобы не изобретать велосипеда.
sqlitestudio_3_0_2 - Это тоже самое, что и предыдущий, но он излишне перенасыщен всякими ненужностями. Он более тяжёлый в работе (хотя бы только из-за одного только оформления), но по своему тоже нужный. Например. тут наглядно показаны все индексы СУБД.

Примечание:
В текущем проекте отказался от SQLite в пользу файловых вариантов для локальной части работы по причинам из описанных. Но ещё раз отмечу, это только мой личный опыт и он никак не претендует на истину.

(ах да, совсем забыл, особая благодарность примерам от Пётр и прочих гуру в PB)

_________________
Уважай других, чтобы уважали тебя


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Сб мар 14, 2015 10:01 pm 
Не в сети
профессор

Зарегистрирован: Вс июн 10, 2012 8:18 am
Сообщений: 1294
Благодарил (а): 60 раз.
Поблагодарили: 49 раз.
Пункты репутации: 14
strange2007 писал(а):
2. Соединение с БД периодически надо переподключать, в противном случае в памяти после каждого запроса собирается "мусор", что приводит к необоснованному росту приложения. Это критично, если приложение работает без остановки.

С SQL плотно работал только на андроиде, но думаю от этого принцип работы не меняется - открыл базу, прочитал/записал, закрыл. Постоянно держат открытой не надо.

strange2007 писал(а):
; Запись без индекса - 43265
; Запись с ним - 45250

Что-то слишком много :shock:
У меня твой код максимум 18 секунд выдавал, но и это слишком много.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пн мар 16, 2015 4:57 am 
Не в сети
док

Зарегистрирован: Ср фев 08, 2012 10:39 am
Сообщений: 131
Откуда: Красноярск
Благодарил (а): 7 раз.
Поблагодарили: 1 раз.
Пункты репутации: 0
Цитата:
Постоянно держат открытой не надо.

Опять же на открытие БД уходит очень много времени.

Цитата:
Что-то слишком много

Это относительное измерение, а не абсолютное. Самое важное то, что чтение от записи отличается на столько. Это очень важная информация, особенно для новичков.

_________________
Уважай других, чтобы уважали тебя


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пн мар 16, 2015 7:43 am 
Не в сети
профессор

Зарегистрирован: Вс июн 10, 2012 8:18 am
Сообщений: 1294
Благодарил (а): 60 раз.
Поблагодарили: 49 раз.
Пункты репутации: 14
strange2007 писал(а):
Опять же на открытие БД уходит очень много времени.

Как много? Если три секунды на 10000 коннектов много, то надо оптимизировать функцию или всю программу.

Код:
1
2
3
4
5
6
7
8
9
lFileName.s = "TestSQLite.bds"
UseSQLiteDatabase()
time = GetTickCount_()
For i=0 To 10000
OpenDatabase(0, lFileName, "", "")
CloseDatabase(0)
Next
 t.d = (GetTickCount_() - time)/1000
MessageRequester("",  "Время " + t)




strange2007 писал(а):
Самое важное то, что чтение от записи отличается на столько

Ты просто не умеешь ее готовить :). 10000 записей за ~500мс.

Код:
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
#D_SQLITE_NumItem = 10000
Global lFileName.s = "TestSQLite2.db"
UseSQLiteDatabase()
 
 
Procedure d_SQLite_Start2()
        Protected lTextQuery.s
        Protected lCount.l
       ; Protected lFileName.s
       
        Protected lIndex.l
        Protected Dim UIDs.l(#D_SQLITE_NumItem)
       
        Protected lTime1.l, lTime2.l, lTime3.l, lTime4.l
        Protected lTmp.l
       
       
     ;   UsePostgreSQLDatabase()
        ; Подготовка базы
        ;=================]
       
        ; Пересоздание базы
        If CreateFile(0, lFileName)
                CloseFile(0)
        EndIf
       
        If Not OpenDatabase(0, lFileName, "", "")
                Debug "Err"
                ProcedureReturn
;     If DatabaseUpdate(0, "CREATE TABLE info (test VARCHAR(255));")
;       Debug "Table created"
;     EndIf
  EndIf
 
  ; Создание 2-х таблиц
 
 
  lTextQuery = "CREATE TABLE Test1 (PK INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE, UID VARCHAR(19), Data1 VARCHAR, Data2 VARCHAR, Data3 INTEGER);"
        If Not DatabaseUpdate(0, lTextQuery)
                Debug "Err"
        EndIf
       
       
       
       
  lTextQuery = "CREATE TABLE Test2 (PK INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE, UID VARCHAR(19), Data1 VARCHAR, Data2 VARCHAR, Data3 INTEGER);"
        If Not DatabaseUpdate(0, lTextQuery)
                Debug "Err"
        EndIf
 
;       lTextQuery = "CREATE INDEX idx_Test2 ON Test2 (PK COLLATE BINARY ASC);"
;       lTextQuery = "CREATE INDEX idx_Test2 ON Test2 (PK COLLATE NOCASE ASC);"
;       lTextQuery = "CREATE INDEX idx_Test2 ON Test2 (PK COLLATE BINARY DESC);"
;       lTextQuery = "CREATE INDEX idx_Test2 ON Test2 (PK COLLATE NOCASE DESC);"
        lTextQuery = "CREATE INDEX idx_Test2 ON Test2 (PK COLLATE RTRIM ASC);"
        If Not DatabaseUpdate(0, lTextQuery)
                Debug "Err"
        EndIf
 
     
       
       
       
       
  ; Наполнеие таблиц
  ;==================
 
        lTime1 = ElapsedMilliseconds()
        DatabaseUpdate(0, "Begin Transaction")
  For lCount=0 To #D_SQLITE_NumItem
        lTextQuery = "INSERT INTO Test1(UID, Data1, Data2, Data3) VALUES ('12" + Str(lCount) + "', 'dsf', 'wert', 23);"
        If Not DatabaseUpdate(0, lTextQuery)
                Debug "Err: " + DatabaseError()
        EndIf
      Next lCount
      DatabaseUpdate(0, "Commit")
  lTime1 = ElapsedMilliseconds() - lTime1
 
  lTime2 = ElapsedMilliseconds()
  DatabaseUpdate(0, "Begin Transaction")
  For lCount=0 To #D_SQLITE_NumItem
        lTextQuery = "INSERT INTO Test2(UID, Data1, Data2, Data3) VALUES ('32" + Str(lCount) + "', 'vbnvb', '43gg65', 31);"
        If Not DatabaseUpdate(0, lTextQuery)
                Debug "Err: " + DatabaseError()
        EndIf
  Next lCount
  lTime2 = ElapsedMilliseconds() - lTime2
  DatabaseUpdate(0, "Commit")
 
 
 
  ; Выборка данных
  ;================
 
  lTextQuery = "Select PK FROM Test1"
  lIndex = 0
  If DatabaseQuery(0, lTextQuery)
        While NextDatabaseRow(0)
                UIDs(lIndex) = GetDatabaseLong(0, 0)
                lIndex = lIndex + 1
        Wend
        FinishDatabaseQuery(0)
  EndIf
  lTime3 = ElapsedMilliseconds()
  For lIndex=0 To #D_SQLITE_NumItem
        If UIDs(lIndex)
                lTextQuery = "Select PK FROM Test1 WHERE PK='" + UIDs(lIndex) + "'"
                  If DatabaseQuery(0, lTextQuery)
                        While NextDatabaseRow(0)
                                lTmp = GetDatabaseLong(0, 0)
                        Wend
                        FinishDatabaseQuery(0)
                  EndIf
        EndIf
  Next lIndex
  lTime3 = ElapsedMilliseconds() - lTime3
 
 
  lTextQuery = "Select PK FROM Test2"
  lIndex = 0
  If DatabaseQuery(0, lTextQuery)
        While NextDatabaseRow(0)
                UIDs(lIndex) = GetDatabaseLong(0, 0)
                lIndex = lIndex + 1
        Wend
        FinishDatabaseQuery(0)
  EndIf
  lTime4 = ElapsedMilliseconds()
  For lIndex=0 To #D_SQLITE_NumItem
        If UIDs(lIndex)
                lTextQuery = "Select PK FROM Test2 WHERE PK='" + UIDs(lIndex) + "'"
                  If DatabaseQuery(0, lTextQuery)
                        While NextDatabaseRow(0)
                                lTmp = GetDatabaseLong(0, 0)
                        Wend
                        FinishDatabaseQuery(0)
                  EndIf
        EndIf
  Next lIndex
  lTime4 = ElapsedMilliseconds() - lTime4
 
 
 
 
  ; Итоговое сообщение
  ;====================
  lTextQuery = "Создание без индекса: " + Str(lTime1) + Chr(10) + "Создание с индексом: " + Str(lTime2)
  lTextQuery = lTextQuery + Chr(10) + "Чтение без индекса: " + Str(lTime3) + Chr(10) + "Чтение с индексом: " + Str(lTime4)
  MessageRequester("Результат", lTextQuery)
 
EndProcedure
 
 
d_SQLite_Start2()
 



Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пн мар 16, 2015 7:56 am 
Не в сети
док

Зарегистрирован: Ср фев 08, 2012 10:39 am
Сообщений: 131
Откуда: Красноярск
Благодарил (а): 7 раз.
Поблагодарили: 1 раз.
Пункты репутации: 0
Цитата:
Ты просто не умеешь ее готовить :). 10000 записей за ~500мс.

Основная мысль, это разница между чтением и записью, а не в том у кого какая дисковая подсистема. Или я не правильно что-то понял?

_________________
Уважай других, чтобы уважали тебя


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пн мар 16, 2015 8:11 am 
Не в сети
профессор

Зарегистрирован: Вс июн 10, 2012 8:18 am
Сообщений: 1294
Благодарил (а): 60 раз.
Поблагодарили: 49 раз.
Пункты репутации: 14
strange2007 писал(а):
Основная мысль, это разница между чтением и записью, а не в том у кого какая дисковая подсистема. Или я не правильно что-то понял?

Тут дисковая система ни причем. У меня вот такой результат на 10к записей, т.е. чтение от записи отличается в другую сторону - пишется в разы быстрее, и значительно отличается от твоих результатов. И это больше подходит к твоему третьему пункту про долгую запись.
Цитата:
Создание без индекса: 448
Создание с индексом: 338
Чтение без индекса: 1272
Чтение с индексом: 1182


зы:
strange2007 писал(а):
Или я не правильно что-то понял?

Я код слегка поправил.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пн мар 16, 2015 9:49 am 
Не в сети
док

Зарегистрирован: Ср фев 08, 2012 10:39 am
Сообщений: 131
Откуда: Красноярск
Благодарил (а): 7 раз.
Поблагодарили: 1 раз.
Пункты репутации: 0
Охтыж какой я не внимательный то. Чудотранзакции такие волшебные? Неужели в них секрет? Учту, спасибо

_________________
Уважай других, чтобы уважали тебя


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пн мар 16, 2015 3:42 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1699
Откуда: Алматы
Благодарил (а): 15 раз.
Поблагодарили: 46 раз.
Пункты репутации: 5
а в кратце, своими словами, что это за базы всякие и с чем их едят? нечто такое, типа ексель файла - вечно запущенного, в который куча пользователей пишет и читает разные графы?

можно на такой сикуэль аналог 1с предприятия забабахать?


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пн мар 16, 2015 7:59 pm 
Не в сети
PureBasic Coder
Аватар пользователя

Зарегистрирован: Чт ноя 10, 2011 10:50 am
Сообщений: 4049
Откуда: Ростов-на-Дону
Благодарил (а): 70 раз.
Поблагодарили: 81 раз.
Пункты репутации: 24
Нет, БД не вечно запущена, это просто файл. В базе есть таблицы. В таблицах хранятся данные... ну да, можно сказать как в экселе. И таблицы могут быть связаны между собой

_________________
Пурик - лучший язык программирования


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пн мар 16, 2015 10:36 pm 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 618
Благодарил (а): 2 раз.
Поблагодарили: 34 раз.
Пункты репутации: 9
База это хранилище в виде файла на физическом носителе различных данных,
управление ею происходит через драйвер(запись как я понимаю всё в символьном виде)а доступ к ней как локальный так и удалённый ,бывает база для работы временная(в памяти). базу можно редактировать,производить другие действия например разрешать доступ пользователям(в этой не знаю) и т.д.:roll:
В 1с пишут что тоже используют её вроде бы.(вроде бы данные контрагентов хранят?)


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вт мар 17, 2015 12:42 am 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 618
Благодарил (а): 2 раз.
Поблагодарили: 34 раз.
Пункты репутации: 9
strange2007 писал(а):
Цитата:
Ты просто не умеешь ее готовить :). 10000 записей за ~500мс.

Основная мысль, это разница между чтением и записью, а не в том у кого какая дисковая подсистема. Или я не правильно что-то понял?

Можно ли создать аналог с помощью базы,запись такого количества эаписей и извлечение их в массив с такой же скоростью :?: :roll:
Код:
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
 
DisableDebugger
Global Dim a.a(0)
Global Dim b.a(0)
Global Dim c.c(0)
 
Procedure DB_Init()
  Protected File.l
  If FileSize("GestionContacts5.sqlite")< 0;если нет такого файла
    File = CreateFile(#PB_Any, "GestionContacts5.sqlite");Создаём пустой файл
    If File
      ;WriteStringFormat(File, #PB_Unicode) ; Запись в файл специальной метки, сообщающей что кодировка Unicode
      CloseFile(File);если успешно создан закрываем
    EndIf
  EndIf  
EndProcedure
Procedure DB_zapis()
  lTime1 = ElapsedMilliseconds()
 
 
  Protected filesize.l
  ;
   ReadFile(1,"GestionContacts5.sqlite",#PB_File_SharedRead)
   filesize = Lof(1)
   Protected *memm=AllocateMemory(filesize+4*10000);10000записей
   ReadData(1,*memm,filesize);прочитать данные в память
   CloseFile(1)
   ;
   ;
   poly=MemorySize(*memm)/4
   
   For i=0 To 40000-4 Step 4
   PokeA(*memm+i,5)
   PokeA(*memm+i+1,34)
   PokeC(*memm+i+2,100)
   Next
   
  If CreateFile(1,"GestionContacts5.sqlite",#PB_File_SharedWrite)
   WriteData(1,*Memm,filesize+4*10000)
   CloseFile(1)
  EndIf
  FreeMemory(*memm)
 
  MessageRequester("Время записи",StrD((ElapsedMilliseconds()-lTime1)/1000)+ #CR$ + "количество записей= " + poly)
 
 
EndProcedure
Procedure DB_izvleshenie()
lTime1 = ElapsedMilliseconds()
 Protected filesize.l
   ReadFile(1,"GestionContacts5.sqlite",#PB_File_SharedRead)
   filesize = Lof(1)
  Protected *mem=AllocateMemory(filesize)
   ReadData(1,*mem,filesize);прочитать данные в память
 
     ;Количествоо полей в базе
     poly=MemorySize(*mem)/4
     ;
     ReDim a.a(poly)
     ReDim b.a(poly)
     ReDim c.c(poly)
     ;
     ;Debug poly;количество полей записи
     ;
 
     Protected i.i
     For i=0 To poly-1 Step 1
       ;data
       a(i)=PeekA(*mem+i*4)
       b(i)=PeekA(*mem+i*4+1)
       c(i)=PeekC(*mem+i*4+2)
       ;Debug  Str(a(i))+"."+Str(b(i))+"."+Str(c(i))
     Next
     
     
   CloseFile(1)
   FreeMemory(*mem)
MessageRequester("Время извлечения",StrD((ElapsedMilliseconds()-lTime1)/1000)+ #CR$ + "количество записей= " + poly)
EndProcedure
 
DB_Init()
DB_zapis()
DB_izvleshenie()
 


Чтоб удалить файл ищите поиском на диске. :D


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вт мар 17, 2015 6:40 am 
Не в сети
профессор

Зарегистрирован: Вс июн 10, 2012 8:18 am
Сообщений: 1294
Благодарил (а): 60 раз.
Поблагодарили: 49 раз.
Пункты репутации: 14
Сергейчик писал(а):
Можно ли создать аналог с помощью базы,запись такого количества эаписей и извлечение их в массив с такой же скоростью :?: :roll:

Не совсем понял, что ты хочешь сделать. Аналог чего?
Если хранить данные в базе, а потом из нее заполнять массив, то можно. Или ты про скорость базы?


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 31 ]  На страницу 1, 2, 3  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB