1

Тема: JScript: хранение файлов в БД MS Access

Пример показывает простую технологию хранения произвольных файлов в базе Access 4.0 при помощи объекта ADODB.Stream. Ограничение на размер файла не установлено.

Чтобы поместить файл в базу данных, перетащите значок выбранного файла на значок или ярлык скрипта. Ярлык скрипта удобно разместить на Рабочем столе. Чтобы извлечь файл из базы данных, просто запустите этот скрипт без параметров. Появившийся диалог содержит список в формате "имя файла\\дата модификации". Выберите нужный файл и сохраните.

Для работы примера потребуется БД MS Access, которая находится во вложении этого поста. Файл БД должен находиться в одной папке со скриптом. Для работы примера потребуется библиотека svcsvc.dll.

//Без гарантий! Используете на свой страх и риск!
//---------------------------------------------------------------------------
//Скрипт реализует простую технологию хранения произвольных файлов
//в базе Access 4.0 при помощи объекта ADODB.Stream
//Ограничение на размер файла:пока не установлено.
//---------------------------------------------------------------------------
//    Lang.:JScript
//    ОС Win Me и выше
//    Используется вспомогательная библиотека svcsvc.dll
//---------------------------------------------------------------------------
//Чтобы поместить файл в базу данных,перетащите значок выбранного файла
//на значок или ярлык скрипта.Ярлык скрипта удобно разместить на Рабочем Столе.
//Чтобы извлечь файл из базы данных просто запустите этот скрипт без параметров.
//Появившийся диалог содержит список в формате 'имя файла\\дата модификации'
//Выберите нужный файл и сохраните. 
//---------------------------------------------------------------------------
//Определение констант и агрегатных объектов
//---------------------------------------------------------------------------
    var adTypeBinary=1
    //--------------------------------
    var adOpenDynamic=2
    var adOpenStatic=3
    //--------------------------------
    var adLockBatchOptimistic=4
    var adLockReadOnly=1
    //--------------------------------
    var adAffectCurrent=1
    var adSaveCreateOverWrite=2
//---------------------------------------------------------------------------
//Определение пути к базе данных
    var currentDir    =new String
    currentDir    =WScript.ScriptFullName.match(/.+\\/g)[0]
    currentDir    =currentDir.substring(0,currentDir.length-1)
    var currentBase    =currentDir+"\\filestore.mdb"


//---------------------------------------------------------------------------
    var wShell=WScript.CreateObject('WScript.Shell')
try
{
    var rset=WScript.CreateObject('ADODB.Recordset','rsetEvts_')
    var conn=WScript.CreateObject('ADODB.Connection','connEvts_')
    var strm=WScript.CreateObject('ADODB.Stream')
    var scrRun=WScript.CreateObject('Scripting.FileSystemObject')
}
catch(COMErr)
{
    erroHandler(COMErr)
}
//---------------------------------------------------------------------------
//Строка подключения для прямого соединения через поставщика 
//OLE DB Provider for ODBC drivers {MSDASQL}
//---------------------------------------------------------------------------
var cStr=        "Driver={Microsoft Access Driver (*.mdb)};"+    
               "DBQ="+currentBase+";"+    
            "DefaultDir="+currentDir+";"+    
            "ExtendedAnsiSQL=0;"+
            "FIL=MS Access;"+        
            "ImplicitCommitSync=Yes;"+
            "MaxBufferSize=4096;"+
            "MaxScanRows=5;"+
            "PageTimeout=5;"+
            "ReadOnly=0;"+
            "SafeTransactions=0;"+
            "Threads=3;"+
            "UserCommitSync=Yes"

//---------------------------------------------------------------------------
//Анализ входных аргументов

var args=WScript.Arguments
    if (args.Length)
        {
        var fileToPack=args.Item(0)
        packFileToDB(fileToPack)
        }
    else
        {
        extractFiles()
        }

//---------------------Область основных функций------------------------------


//---------------------------------------------------------------------------
//Добавление произвольного файла в базу данных
//---------------------------------------------------------------------------
function packFileToDB(fileToPack)
{
    try
    {
        //------------------------------------------------------------
        dateModified=scrRun.GetFile(fileToPack).DateLastModified
        //------------------------------------------------------------
        //Запись файла в поток
            strm.Open
            strm.Type=adTypeBinary
            strm.LoadFromFile(fileToPack)
        //------------------------------------------------------------
            conn.Open(cStr)
        //------------------------------------------------------------
        //Запись файла в базу данных
            rset.Open('SELECT * FROM filestore',conn,adOpenDynamic,adLockBatchOptimistic)
            rset.AddNew
            rset.Fields(0).Value=dateModified
            rset.Fields(1).Value=fileToPack
            rset.Fields(2).Value=strm.Read
            rset.UpdateBatch(adAffectCurrent)
        //------------------------------------------------------------
            rset.Close
            conn.Close
            strm.Close
    }
    catch(packFile_Error)
    {
        erroHandler(packFile_Error)
    }
    return
}
//---------------------------------------------------------------------------
//Извлечение файла из базы данных
//---------------------------------------------------------------------------
function extractFiles()
{
    try
    {
        //------------------------------------------------------------
            var servicePopUp=new ActiveXObject("Svcsvc.Service")
            var strArr=''
            var fileToRestore,_fileToRestore=new String
        //------------------------------------------------------------
        conn.Open(cStr)
        rset.Open('SELECT filestore.i,filestore.name FROM filestore',conn,adOpenStatic,adLockReadOnly)
        //------------------------------------------------------------
        if (!rset.EOF)
        { 
            rset.MoveFirst

            while (!rset.EOF)
            {
                strArr=strArr+rset.Fields(1).Value+'\\\\'+rset.Fields(0).Value+'\n'
                rset.MoveNext
            }
            rset.Close
            //----------------------------------------------------
            //Получение имени файла и даты модификации
            _fileToRestore=servicePopUp.SelectValue(strArr,'Выберите файл для восстановления',false)
                if (!_fileToRestore){conn.Close;WScript.Quit(-1)}

            fileToRestore=_fileToRestore.match(/.+\\\\/g)[0]

            dateModified=_fileToRestore.replace(fileToRestore,'')
            fileToRestore=fileToRestore.substring(0,fileToRestore.length-2)
        
            fileToSave=servicePopUp.SelectFile(1,fileToRestore,'Все файлы|*',0)
                if (!fileToSave){conn.Close;WScript.Quit(-1)}
            //----------------------------------------------------
            //Чтение данных и сохранение файла
            rset.Open("SELECT filestore.file FROM filestore WHERE filestore.name='"+fileToRestore+"' AND filestore.i='"+dateModified+"'",conn,adOpenStatic,adLockReadOnly)
            rset.MoveFirst
            //----------------------------------------------------
            strm.Open
            strm.Type=adTypeBinary
            strm.Write(rset.Fields(0).Value)
            strm.SaveToFile(fileToSave,adSaveCreateOverWrite)
            strm.Close
            rset.Close
        }
        //------------------------------------------------------------
        else
        {
            wShell.Popup('Нет файлов для извлечения!',0,'Извлечение данных',48)    
            rset.Close    
        }
        //------------------------------------------------------------
        conn.Close
    }
    catch(extractFiles_Error)
    {
        erroHandler(extractFiles_Error)
    }
    return
}

//---------------------Обработчики событий-----------------------------------

//---------------------------------------------------------------------------
    function connEvts_ConnectComplete(evt_EventStatus,evt_Err,evt_conn)
    {
    return wShell.Popup('Открытие сеанса соединения...\n'+evt_conn.ConnectionString.replace(/;/ig,'\n'),1,'Соединение с БД',64) 
    }
//---------------------------------------------------------------------------
    function connEvts_Disconnect(evt_EventStatus,evt_conn)
    {
    return wShell.Popup('Завершение сеанса соединения с БД...',1,'Соединение с БД',64) 
    }
//---------------------------------------------------------------------------
    function rsetEvts_FieldChangeComplete(cFields,Fields,Error,adStatus,pRecordset)
    {
    if (adStatus==1)
        {
        return wShell.Popup('Успешное добавление записи...',1,'Обновление поля...',64) 
        }
    }
//---------------------------------------------------------------------------
    function erroHandler(err)
    {
        wShell.Popup(    "Произошла ошибка.\n"+
                "Номер:        "+err.number+'\n'+
                "Описание:    "+err.description,0,'Произошла ошибка',48) 
        
        WScript.Quit(-1)
    }
//---------------------------------------------------------------------------
//Примечание:
//SQL-команда для создания таблицы filestore:
//CREATE TABLE filestore(i varchar,name varchar,file longbinary)
//где
//поле i содержит дату модификации файла,
//поле name содержит имя файла,
//поле file является контейнером для самого файла,
//---------------------------------------------------------------------------
//poltergeyst

Автор примера - Poltergeyst.
Примечание: пример может определиться антивирусными программами как вирус "HTML/ADODB.Exploit.Gen". Это неправда - никаких вирусов здесь нет.

Post's attachments

filestore.zip 5.9 kb, 498 downloads since 2007-12-16 

You don't have the permssions to download the attachments of this post.
Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.