Тема: 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". Это неправда - никаких вирусов здесь нет.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.