Хранение файлов .doc .xls ... в БД (Access, SQL Server)

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
PLA
Новичок
Новичок
 
Сообщения: 33
Зарегистрирован: 08.04.2005 (Пт) 16:09
Откуда: Москва

Хранение файлов .doc .xls ... в БД (Access, SQL Server)

Сообщение PLA » 30.08.2005 (Вт) 11:01

В БД нужно хранить различные файлы из Office. Как это можно реализовать. И в принципе это возможно? Если нет, может, есть пример создания хранилище файлов с различными правами доступа.

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

Сообщение alibek » 30.08.2005 (Вт) 11:06

В СУБД есть BLOB-поля, в них можно хранить файлы.
Только это не рекомендуется. Обычно файлы храняться как файлы, а в БД храняться ссылки на них.
Lasciate ogni speranza, voi ch'entrate.

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 30.08.2005 (Вт) 11:22

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

На диске ты имеешь пермишны с точностью до файла (записи в таблице, если переходить к СУБД). В обычной же (классической) базе встроенные средства контролируют доступ с точностью до таблицы. Можно, конечно, поставить Огакул (скажем, восьмерку, но не ниже) и заюзать Oracle Label Security, но это настолько специфичная вещь, что ты к этому Ораклу навсегда привязанным оказываешься. Так что это не тру.
Поскольку заводить персональную таблицу для каждого юзера нереально, значит, тебе придется писать собственную систему контроля доступа - на основе вьюх (представлений) и табличных функций.

Далее. ЕМНИП, виндовый поиск по диску умеет искать текст внутри офисных документов (т.е. учитывает их прямо скажем непростой формат). В случае поиска по словам в БД ты можешь сразу же про все это спокойно забыть, и даже FTS (Full Text Search) тебе не поможет - SQL понятия не имеет о внутреннем формате данных в твоих полях с документами, поэтому искать будет втупую. С таким же успехом можно искать документ по фразе из-под голого ДОСа.

Скорее всего, это не все недостатки подобного способа хранения. В общем, я бы на твоем месте 10 раз подумал, а что ты, собственно, собрался выиграть от такого перехода.

PLA
Новичок
Новичок
 
Сообщения: 33
Зарегистрирован: 08.04.2005 (Пт) 16:09
Откуда: Москва

Сообщение PLA » 30.08.2005 (Вт) 11:30

BLOB-поля, это OLE-поля? Под словом ссылка подразумевается - путь файла или что?

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

Сообщение alibek » 30.08.2005 (Вт) 11:32

BLOB есть в MSSQL. В Access вместо него придется использовать OLE.
Да, полные пути к файлам.
Lasciate ogni speranza, voi ch'entrate.

PLA
Новичок
Новичок
 
Сообщения: 33
Зарегистрирован: 08.04.2005 (Пт) 16:09
Откуда: Москва

Сообщение PLA » 30.08.2005 (Вт) 11:45

Понял. Спасибо.
Таким образом с помощью клиентского модуля копируем на сервер нужный файл, а информацию о файле и прочие атрибуты записываем в БД.
Возникает вопрос (не совсем по БД).
Файлы должны хранится в каком-то защищенном месте (явно не видимой области с клиентского компьютера ). Как организовать доступ к этому месту. Возможно по паролю или разрешить только доступ данной проги. Какие варианты.

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

Сообщение alibek » 30.08.2005 (Вт) 11:59

Файлы будут храниться на сервере, сервер сам по себе должен являться защищенным местом.
Можно не организовывать доступ, а просто реализовать технологию передачи данных (файла) с сервера на клиента и управлять этим процессом будет сервер.
Lasciate ogni speranza, voi ch'entrate.

PLA
Новичок
Новичок
 
Сообщения: 33
Зарегистрирован: 08.04.2005 (Пт) 16:09
Откуда: Москва

Сообщение PLA » 30.08.2005 (Вт) 12:52

Как то тяжело организовать управление процессом посредством Сервера. Синхронизация клиентской проги с серверной прогой безумно трудная задача.
Задача чтобы с проги на любом компьютере сети можно было записать файл на сервер. А вот обратно его получить могли лишь определенные пользователи. Нужны варианты - например, можно ли организовать посредством VB кодирование файлов?, копирование файлов запароленую область ?, чтение из явно не видимой области?

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

Сообщение alibek » 30.08.2005 (Вт) 12:58

PLA писал(а):Задача чтобы с проги на любом компьютере сети можно было записать файл на сервер. А вот обратно его получить могли лишь определенные пользователи. Нужны варианты - например, можно ли организовать посредством VB кодирование файлов?, копирование файлов запароленую область ?, чтение из явно не видимой области?

Язык разработки клиентской стороны тут не причем.
Для решения этой задачи тебе надо задействовать серверные возможности.
У тебя будет хранимая процедура, принимающая файлы, и выдающая файлы. Последняя будет разграничивать доступ (либо можно разграничить доступ к самой хранимой процедуре).
Lasciate ogni speranza, voi ch'entrate.

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

Сообщение alibek » 30.08.2005 (Вт) 12:59

А вообще, обрати внимание на MS Shared Server.
Lasciate ogni speranza, voi ch'entrate.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 30.08.2005 (Вт) 13:30

PLA писал(а):Задача чтобы с проги на любом компьютере сети можно было записать файл на сервер. А вот обратно его получить могли лишь определенные пользователи. Нужны варианты - например, можно ли организовать посредством VB кодирование файлов?, копирование файлов запароленую область ?, чтение из явно не видимой области?


Можно просто помещать файлы в поля базы данных (именно файлы а не ссылки на них). AppendChunk и GetChunk в этом помогут.

Файлы большого размера (>200 байт) имеющие расширения doc, rtf, dbf, xml и подобные можно предварительно архивировать (ну и распаковывать при извлечении, соответственно). Само-собой что файлы jpg, rar, zip и подобные архивировать не нужно по определению.

По крайней мере именно так у меня хранила произвольные данные программа написанная еще где-то 10 лет назад. Точнее там были получаемые с филиалов по T-Mail-у различные входящие файлы (большей частью dbf-ки). Потом эти файлы раскидывались по каталогам программ, их могли запросить программисты и пр...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

PLA
Новичок
Новичок
 
Сообщения: 33
Зарегистрирован: 08.04.2005 (Пт) 16:09
Откуда: Москва

Сообщение PLA » 31.08.2005 (Ср) 14:31

Отлично! Идея с архивированием очень подходит. При этом, насколько я понимаю, можно архивировать с паролем и соответственно защита информации обеспечена. Одна проблема я не разу не сталкивался, как можно архивировать в VB. Может, есть пример или ссылка на пример с архивированием.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 31.08.2005 (Ср) 14:41

PLA писал(а):Отлично! Идея с архивированием очень подходит. При этом, насколько я понимаю, можно архивировать с паролем и соответственно защита информации обеспечена. Одна проблема я не разу не сталкивался, как можно архивировать в VB. Может, есть пример или ссылка на пример с архивированием.


Я использую обычный консольный архиватор и API-шную CreateProcess (Лично мне это больше нравится чем различные ActiveX и Dll для этой-же цели). Архиватор запускается невидимым (окно при этом не создается). По завершении работы имеем его ErrorLevel.

Код: Выделить всё
Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function GetExitCodeProcess Lib "kernel32" _
        (ByVal hProcess As Long, lpExitCode As Long) As Long
Public Declare Function WaitForSingleObject Lib "kernel32" _
        (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Public Declare Function CreateProcess Lib "kernel32" Alias "CreateProcessA" _
        (ByVal lpApplicationName As Long, _
        ByVal lpCommandLine As String, _
        ByVal lpProcessAttributes As Long, _
        ByVal lpThreadAttributes As Long, _
        ByVal bInheritHandles As Long, _
        ByVal dwCreationFlags As Long, _
        ByVal lpEnvironment As Long, _
        ByVal lpCurrentDirectory As String, _
        lpStartupInfo As STARTUPINFO, _
        lpProcessInformation As PROCESS_INFORMATION) As Long

' Запускает файл, возвращает True, если процесс создан успешено
' Параметры:    strCommandLine - командная строка
'               lngError       - номер ошибки
'               [varDebug]     - Если True, то создавать окно консоли
' Неконсольные программы запускаются только с varDebug = True :-(
Public Function StartFile(ByRef strCommandLine As String, _
        Optional ByRef bDebug As Boolean = False, _
        Optional ByRef strCurrentDirectory As Variant, _
        Optional ByRef hStdInput As Variant, _
        Optional ByRef hStdOutput As Variant, _
        Optional ByRef hStdError As Variant) As Long
    Const WAIT_FAILED = -1, INFINITE = -1, WAIT_TIMEOUT& = &H102&
    Const CREATE_NEW_CONSOLE = &H10, DETACHED_PROCESS = &H8
   
    Dim s As String, lngDebug As Long, lngError As Long, iWait As Long
    Dim lngStdInput As Long, lngStdOutput As Long, lngStdError As Long
    Dim usrPI As PROCESS_INFORMATION, usrSI As STARTUPINFO
   
    lngDebug = IIf(bDebug, CREATE_NEW_CONSOLE, DETACHED_PROCESS)
    usrSI.cb = Len(usrSI)
    If Not IsMissing(hStdInput) Then If hStdInput > 0 Then usrSI.hStdInput = hStdInput: usrSI.dwFlags = &H100
    If Not IsMissing(hStdOutput) Then If hStdOutput > 0 Then usrSI.hStdOutput = hStdOutput: usrSI.dwFlags = &H100
    If Not IsMissing(hStdError) Then If hStdError > 0 Then usrSI.hStdError = hStdError: usrSI.dwFlags = &H100
   
    If IsMissing(strCurrentDirectory) Then
        s = GetTempPath
    Else
        If Len(strCurrentDirectory) = 0 Then
            s = GetTempPath
        Else
            s = strCurrentDirectory
        End If
    End If
    If 1 = CreateProcess(0, strCommandLine, 0, 0, 1, _
            lngDebug, 0, s, usrSI, usrPI) Then
       
        iWait = WAIT_TIMEOUT
        Do
            iWait = WaitForSingleObject(usrPI.hProcess, 20)
            DoEvents
        Loop Until iWait <> WAIT_TIMEOUT
        If iWait = WAIT_FAILED Then
            CloseHandle usrPI.hProcess
            StartFile = -1
        Else
            GetExitCodeProcess usrPI.hProcess, lngError
            CloseHandle usrPI.hProcess
            If lngError <> 0 Then StartFile = lngError
        End If
    Else
        StartFile = -1
    End If
End Function


Использование - примерно так:

Код: Выделить всё
    s = "unzip.exe """ & sZipFile & """"
    If StartFile(s, , sTmpFolder) Then MsgBox "Ошибка распаковки: " & s
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 01.09.2005 (Чт) 8:55

Andrey Fedorov писал(а):Я использую обычный консольный архиватор и API-шную CreateProcess (Лично мне это больше нравится чем различные ActiveX и Dll для этой-же цели). Архиватор запускается невидимым (окно при этом не создается). По завершении работы имеем его ErrorLevel.


А какие преимущества использования внешних архиваторов по сравнению с соответстующими DLL?

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 01.09.2005 (Чт) 9:04

VVitafresh писал(а):А какие преимущества использования внешних архиваторов по сравнению с соответстующими DLL?


Самое крупное преимущество - гарантированная совместимость созданного архива ибо он создается оригинальным архиватором, с которым я и так работаю. Всяческие OCX и DLL зачастую создаются третими лицами и какого либо преимущества вообще не дают...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

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

Сообщение alibek » 01.09.2005 (Чт) 9:08

Andrey Fedorov писал(а):Самое крупное преимущество - гарантированная совместимость созданного архива ибо он создается оригинальным архиватором, с которым я и так работаю. Всяческие OCX и DLL зачастую создаются третими лицами и какого либо преимущества вообще не дают...

Сказки Венского леса.
unrar.ocx выпускается тем же разработчиком, который занимается WinRARом. Различные библиотеки для ZIP также выпускаются не самопальщиками. О всяческих портах с Linux на Windows (gzip, tgz) я и не говорю.
Lasciate ogni speranza, voi ch'entrate.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 01.09.2005 (Чт) 9:31

alibek писал(а):unrar.ocx выпускается тем же разработчиком, который занимается WinRARом.


Ладно, а что он мне реально даст по сравнению с обычным unrar.exe - ну хоть какое-то преимущество есть? И какой разработчик выпускает rar.ocx и 7z.ocx, к примеру???

alibek писал(а): Различные библиотеки для ZIP также выпускаются не самопальщиками. О всяческих портах с Linux на Windows (gzip, tgz) я и не говорю.


В свое время я искал архиватор для zip. По тестам не прошел ни один компонент - у каждого были какие-либо проблемы... Правда давно это было, с тех пор они обновились и стали лучше, но сейчас даже желания проверять нет ибо архивирование прекрасно идет и без них.

Единственным оправданием ocx-архиватора была бы его работа целиком в памяти, то есть я даю ему массив байт, и он мне возвращает уже массив архива, без создания каких-либо промежуточных файлов.
Ну и возможность распаковки массива в указанный каталог/файл и наоборот. Алгоритм архивации должен быть стандартным (то есть иметь аналог обычного Windows-архиватора), компрессия на уровне rar/7z, защита паролем. Желательно так-же наличие события позволяющего рисовать прогрессбар в моей программе и вообще работать асинхронно.

Ты знаешь такой ocx архиватора? Тогда покажи на него пальцем - с удовольствием пощупаю...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

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

Сообщение alibek » 01.09.2005 (Чт) 9:38

Для 7zip есть библиотеки, тут. Кроме того, есть куча библиотек, полностью совместимых с форматом ZIP, я в свое время пользовался парочкой библиотек, которые давали мне весь функционал и ни разу не сбойнули. Библиотеки с враппером я приаттачил (откуда взял уже не помню).
Для RAR я уже называл, там есть и библиотека, и OCX. И даже комплект для девелопера можно купить, если денег не жалко.
У вас нет доступа для просмотра вложений в этом сообщении.
Lasciate ogni speranza, voi ch'entrate.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 01.09.2005 (Чт) 9:46

alibek писал(а):Для 7zip есть библиотеки, тут. Кроме того, есть куча библиотек, полностью совместимых с форматом ZIP, я в свое время пользовался парочкой библиотек, которые давали мне весь функционал и ни разу не сбойнули.


Насколько я понимаю для 7z есть только обычные dll-ки...

Ты, кстати, так и не назвал пока ни одного преимущества ;)

alibek писал(а):Для RAR я уже называл, там есть и библиотека, и OCX. И даже комплект для девелопера можно купить, если денег не жалко.


В комплекте есть только unrar - библиотеки. Архивировать с ними невозможно. Может в комплекте девелопера и есть что для архивации, но денег явно жалко - тут я предпочту что-то свободно распространяемое. Или дам юзеру возможность работать с его архиватором - rar.exe (покупка легальной копии WinRar при этом будет на его совести).
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

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

Сообщение alibek » 01.09.2005 (Чт) 10:12

Andrey Fedorov писал(а):Насколько я понимаю для 7z есть только обычные dll-ки...
Ты, кстати, так и не назвал пока ни одного преимущества ;)

Обычные, в смысле Native? А чем они плохи?
О преимуществах я не говорил, я говорил об удобствах.
Например о том, что разархивация будет работать независимо от того, какой у юзера стоит консольный разархиватор и какой версии. А также о том, что совершенно необразованный юзер не будет звонить в суппорт и ему не придется три часа объяснять, где взять разархиватор, куда его скопировать и что для этого надо сделать.
Кроме того, для консольных архиваторов можно практически забыть о ProgressBar-е и прочей интерактивности с ним. При желании, конечно, можно перехватывать его вывод, анализировать и перерабатывать для себя. Но архиватор-компонент даст эту информацию уже в структурированном виде.
Lasciate ogni speranza, voi ch'entrate.


Вернуться в Базы данных

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

Сейчас этот форум просматривают: AhrefsBot, Google-бот и гости: 1

    TopList