Проследить процесс записи BLOB (тела файла) в базу

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Проследить процесс записи BLOB (тела файла) в базу

Сообщение ALX_2002 » 25.09.2006 (Пн) 12:09

Доброго дня господа и возможно дамы. :roll:

Пришёл я к вам с вопросом.

Действия

Записываю файл в базу данных ACCESS. Тело файла в районе от 10 до 80 мегабайт.

Через AppendChunk добавляю данные.

Но после вызова метода UPDATE процесс сохранения в базу зависает.

Вопрос

Можно ли как нибудь процесс записи в базу сделать параллельным ? Так чтобы он продолжался "фоново" ? Или показать пользователю на прогрессбар с информацие о результате сохранения ?

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 25.09.2006 (Пн) 12:14

вообще-то акцесс не позволяет работать в ассинхронном режиме

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 25.09.2006 (Пн) 12:36

Позволяет. И коннектится, и запросы выполнять, и фетчить данные.
Lasciate ogni speranza, voi ch'entrate.

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 25.09.2006 (Пн) 13:07

:roll: Мммм господа. А посоветовать можете как же мне всё таки файло то лить не обламываясь ? :roll:

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 25.09.2006 (Пн) 14:24

позволяет то он позволяет, но все равно синхронно это делает :)

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 25.09.2006 (Пн) 14:26

или я чего то не помню, алибек просвяти пжл по данному вопросу (ассинхронность в акцессе) :?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 25.09.2006 (Пн) 14:27

Ну не знаю. Я все три действия делал и это был именно асинхронный режим.
Возможно, что заливать данные в базу он асинхронно не умеет, не знаю. Не доводилось как-то.

ALX_2002, попробуй создать ADODB.Command, указав заливаемый файл параметром и добавляя его по частям, а затем выполнить ADODB.Command.Execute adAsyncExecute.
Lasciate ogni speranza, voi ch'entrate.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 25.09.2006 (Пн) 14:29

Konst_One писал(а):или я чего то не помню, алибек просвяти пжл по данному вопросу (ассинхронность в акцессе) :?

Аксесовская база? Да легко.
Указываешь соответствующий флаг при подключении/выполнении/выборке, предварительно объявив коннекцию или рекордсет как WithEvents, и отлавливаешь в соответствующих событиях.
Lasciate ogni speranza, voi ch'entrate.

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 25.09.2006 (Пн) 14:32

MSDN
This example uses the AppendChunk and GetChunk methods to fill an image field with data from another record.

Код: Выделить всё
'BeginAppendChunkVB

    'To integrate this code
    'replace the data source and initial catalog values
    'in the connection string
   
Public Sub AppendChunkX()

    'recordset and connection variables
   Dim Cnxn As ADODB.Connection
   Dim strCnxn As String
   Dim rstPubInfo As ADODB.Recordset
   Dim strSQLPubInfo As String
    'record variables
   Dim strPubID As String
   Dim strPRInfo As String
   Dim lngOffset As Long
   Dim lngLogoSize As Long
   Dim varLogo As Variant
   Dim varChunk As Variant
   Dim strMsg As String
   
   Const conChunkSize = 100

   ' Open a connection
   Set Cnxn = New ADODB.Connection
   strCnxn = "Provider=sqloledb;Data Source=MyServer;Initial Catalog=Pubs;User Id=sa;Password=; "
   Cnxn.Open strCnxn
   
   ' Open the pub_info table with a cursor that allows updates
   Set rstPubInfo = New ADODB.Recordset
   strSQLPubInfo = "pub_info"
   rstPubInfo.Open strSQLPubInfo, Cnxn, adOpenKeyset, adLockOptimistic, adCmdTable
   
   ' Prompt for a logo to copy
   strMsg = "Available logos are : " & vbCr & vbCr
   Do While Not rstPubInfo.EOF
      strMsg = strMsg & rstPubInfo!pub_id & vbCr & _
         Left(rstPubInfo!pr_info, InStr(rstPubInfo!pr_info, ",") - 1) & _
         vbCr & vbCr
      rstPubInfo.MoveNext
   Loop
   
   strMsg = strMsg & "Enter the ID of a logo to copy:"
   strPubID = InputBox(strMsg)
   
   ' Copy the logo to a variable in chunks
   rstPubInfo.Filter = "pub_id = '" & strPubID & "'"
   lngLogoSize = rstPubInfo!logo.ActualSize
   Do While lngOffset < lngLogoSize
      varChunk = rstPubInfo!logo.GetChunk(conChunkSize)
      varLogo = varLogo & varChunk
      lngOffset = lngOffset + conChunkSize
   Loop
   
   ' Get data from the user
   strPubID = Trim(InputBox("Enter a new pub ID" & _
                            " [must be > 9899 & < 9999]:"))
   strPRInfo = Trim(InputBox("Enter descriptive text:"))

   ' Add the new publisher to the publishers table to avoid
   ' getting an error due to foreign key constraint
   Cnxn.Execute "INSERT publishers(pub_id, pub_name) VALUES('" & _
                  strPubID & "','Your Test Publisher')"
   
   ' Add a new record, copying the logo in chunks
   rstPubInfo.AddNew
   rstPubInfo!pub_id = strPubID
   rstPubInfo!pr_info = strPRInfo

   lngOffset = 0 ' Reset offset
   Do While lngOffset < lngLogoSize
      varChunk = LeftB(RightB(varLogo, lngLogoSize - lngOffset), _
         conChunkSize)
      rstPubInfo!logo.AppendChunk varChunk
      lngOffset = lngOffset + conChunkSize
   Loop
   rstPubInfo.Update
   
    ' Show the newly added data
   MsgBox "New record: " & rstPubInfo!pub_id & vbCr & _
      "Description: " & rstPubInfo!pr_info & vbCr & _
      "Logo size: " & rstPubInfo!logo.ActualSize

   ' Delete new records because this is a demo
   rstPubInfo.Requery
   Cnxn.Execute "DELETE FROM pub_info " & _
      "WHERE pub_id = '" & strPubID & "'"

   Cnxn.Execute "DELETE FROM publishers " & _
      "WHERE pub_id = '" & strPubID & "'"

    ' clean up
   rstPubInfo.Close
   Cnxn.Close
   Set rstPubInfo = Nothing
   Set Cnxn = Nothing

End Sub
'EndAppendChunkVB

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 25.09.2006 (Пн) 14:34

alibek

да вроде бы указывал и не раз, но все равно блокирует до завершения полной загрузки данных в рекордсет

может это у меня такой глюк, не знаю :cry:

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 25.09.2006 (Пн) 15:11

Насчет Fetch, там действительно, не сразу получается.
Но добиться асинхронной загрузки можно, просто нужно не трогать рекордсет, пока он не загрузится. Попробую поискать рабочий пример.
Lasciate ogni speranza, voi ch'entrate.

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 25.09.2006 (Пн) 15:14

Хм..... Как всё наварочено то :shock:

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 25.09.2006 (Пн) 15:43

alibek
было бы неплохо, а то у меня какой-то неприятный пробел в этом направлении знаний :)

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 25.09.2006 (Пн) 20:55

Вообщем, сегодня у нас на редкость паршивый диалап, поэтому сорри, обойдусь без аттачей.
Но если создать форму, положить на нее листбокс и подключить ADO, то можно посмотреть на поведение этого кода:
Код: Выделить всё
Option Explicit

Dim WithEvents c As ADODB.Connection
Dim WithEvents r As ADODB.Recordset

Private Sub c_ConnectComplete(ByVal pError As ADODB.Error, adStatus As ADODB.EventStatusEnum, ByVal pConnection As ADODB.Connection)
List1.AddItem "Connection_ConnectComplete"
End Sub

Private Sub c_ExecuteComplete(ByVal RecordsAffected As Long, ByVal pError As ADODB.Error, adStatus As ADODB.EventStatusEnum, ByVal pCommand As ADODB.Command, ByVal pRecordset As ADODB.Recordset, ByVal pConnection As ADODB.Connection)
List1.AddItem "Connection_ExecuteComplete"
List1.AddItem "First item: " & pRecordset.Fields(0).Value
List1.AddItem "RecordCount: " & pRecordset.RecordCount
End Sub

Private Sub Form_Click()
Debug.Print r.Fields(0)
r.MoveNext
End Sub

Private Sub Form_Load()
Set c = New ADODB.Connection
c.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\WORK\VBProgs\Totalizator\tdata.mdb"
Set r = New ADODB.Recordset
Set r.ActiveConnection = c
r.CursorLocation = adUseClient
List1.AddItem "* Prepared"
r.Open Source:="select * from [KLADR-ADR]", Options:=ADODB.ExecuteOptionEnum.adAsyncExecute Or ADODB.ExecuteOptionEnum.adAsyncFetchNonBlocking
List1.AddItem "* Executed"
End Sub

Private Sub r_FetchComplete(ByVal pError As ADODB.Error, adStatus As ADODB.EventStatusEnum, ByVal pRecordset As ADODB.Recordset)
List1.AddItem "Recordset_FetchComplete"
End Sub

Private Sub r_FetchProgress(ByVal Progress As Long, ByVal MaxProgress As Long, adStatus As ADODB.EventStatusEnum, ByVal pRecordset As ADODB.Recordset)
List1.AddItem "Recordset_FetchProgress" & " (" & Progress & "/" & MaxProgress & ")"
End Sub


KLADR-ADR -- достаточно большая таблица и вытяжка данных занимает пару минут, так что можно покликать по форме и убедится, что форма (текущий поток) не блокируется.


Можно также поискать по "*FetchProgress*". Что любопытно, там Konst_One уже давал совет насчет adAsyncFetchNonBlocking :)



vbskb_database vbskb_async vbskb_fetch vbskb_asyncfetch
Lasciate ogni speranza, voi ch'entrate.

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 26.09.2006 (Вт) 10:21

да, я уже это делал, но ты знаешь, кажется для акцесса именно сочетание флагов, которое ты привел только помогает:

Код: Выделить всё
Options:=ADODB.ExecuteOptionEnum.adAsyncExecute Or ADODB.ExecuteOptionEnum.adAsyncFetchNonBlocking


надо будет себе отметить этот нюанс. для других баз проходит и один флаг adAsyncFetchNonBlocking

во как :?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 26.09.2006 (Вт) 10:25

Видимо потому, что там клиент и сервер в одном флаконе.
Lasciate ogni speranza, voi ch'entrate.

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 26.09.2006 (Вт) 10:28

вполне могет быть

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 27.09.2006 (Ср) 8:59

Ух.... Мда... Отлично.... Только WithEvents в ASP нету.. :oops:

http://free.7host07.com/dbserver/test/

А вот для этого делаю :oops:

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 27.09.2006 (Ср) 10:37

ну так что тебе мешает сделать свою библиотеку DLL и подключить ее через COM+ и использовать как объект на странице ASP

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 27.09.2006 (Ср) 11:29

Ответ прост и банален - бесплатный хостинг, на котором я сделал эту весч не даст мне её зарегить :)

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 27.09.2006 (Ср) 11:40

может сменить хостинг стоит, раз делаешь такой сервис :wink:

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 27.09.2006 (Ср) 12:26

Неее... Не пойдёт :) Я халяву люблю. :D


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот, Majestic-12 [Bot] и гости: 38

    TopList