Организация хранилища файлов. Размещение файла в базе данных.   

Ниже приведен текст функции глобального модуля, выполняещей размещение файла в таблице базы данных:

Функция глЗаписатьФайлВБазу(ИмяФайла) Экспорт
    Перем Соединение, СтрокаКоннекта, Выборка, ЗапросАДО;
    Перем Текст;
    Если МонопольныйРежим()=1 Тогда
        Предупреждение("Невозможно выполнить запрос в монопольном режиме!",10);
        //Действия
        Возврат 0;
        //********
    КонецЕсли;
    Соединение=СоздатьОбъект("ADODB.Connection");
    СтрокаКоннекта="driver={SQL Server};server="+глСервер+";uid=sa;pwd="+глПароль+";Database="+глБазаДанных;
    Попытка
        Соединение.Open(СтрокаКоннекта);
    Исключение
        Предупреждение("Невозможно установить соединение с базой данных!");
        //Действия
        Возврат 0;
        //********
    КонецПопытки;
    Выборка=СоздатьОбъект("ADODB.Recordset");
    Выборка=Соединение.Execute("SELECT MAX(Number) FROM pics",,ПараметрыАДО.Получить("adCmdText"));
    Если Выборка.EOF()=0 Тогда
        ТекНомерСтроки=Выборка.Fields(0).Value;
        Если ПустоеЗначение(ТекНомерСтроки)=1 Тогда
            ТекНомерСтроки=0;
        КонецЕсли;
    Иначе
        ТекНомерСтроки=0;
    КонецЕсли;
    Выборка.Close();
    Если ФС.СуществуетФайл(ИмяФайла)=0 Тогда
        Возврат 0;
    КонецЕсли;
    Текст=СоздатьОбъект("Текст");
    ВремКаталог=КаталогВременныхФайлов();
    ИмяФайлаФормы=КаталогПользователя()+"z.frm";
    ИмяФайлаПустышки=ВремКаталог+"z.txt";
    ИмяФайлаРезультата=КаталогПользователя()+"my.rez";
    ИмяФайлаАрхива=ВремКаталог+"zzz.rar";
    //Пустышка
    Если ФС.СуществуетФайл(ИмяФайлаПустышки)=1 Тогда
        Текст.Открыть(ИмяФайлаПустышки);
    КонецЕсли;
    Текст.Очистить();
    Текст.Добавитьстроку("Тест");
    Текст.Записать(ИмяФайлаПустышки);
    //Архивирование
    КомандаСистемы("c:rar.exe a -m5 -md4096 -ep "+ИмяФайлаАрхива+" "+ИмяФайла);
    РазмерФайла=0;
    ФС.АтрибутыФайла(ИмяФайлаАрхива,РазмерФайла,,,,,);
    //Форма
    Если ФС.СуществуетФайл(ИмяФайлаФормы)=1 Тогда
        Текст.Открыть(ИмяФайлаФормы);
    КонецЕсли;
    Текст.Очистить();
    Текст.ДобавитьСтроку("8.0");
    Текст.ДобавитьСтроку("2");
    Текст.ДобавитьСтроку("1 SQLINT 0 4 """" 1 Number """"");
    Текст.ДобавитьСтроку("2 SQLIMAGE 0 "+РазмерФайла+" """" 2 Picture """""+РазделительСтрок);
    Текст.Записать(ИмяФайлаФормы);
    //Слияние
    КомандаСистемы("copy /B /Y "+ИмяФайлаПустышки+"+"+ИмяФайлаАрхива+" "+ИмяФайлаРезультата);
    ЗапросАДО=СоздатьОбъект("ADODB.Command");
    ЗапросАДО.ActiveConnection=Соединение;
    ЗапросАДО.CommandTimeout=60;
    ТекстЗапроса="BULK INSERT sertificat.dbo.pics FROM '"+ИмяФайлаРезультата+"' WITH(FORMATFILE = '"+ИмяФайлаФормы+"')";
    //Сообщить(ТекстЗапроса);
    ЗапросАДО.CommandText=ТекстЗапроса;
    ЗапросАДО.Execute();
    Если ФС.СуществуетФайл(ИмяФайлаФормы)=1 Тогда
        ФС.УдалитьФайл(ИмяФайлаФормы);
    КонецЕсли;
    Если ФС.СуществуетФайл(ИмяФайлаПустышки)=1 Тогда
        ФС.УдалитьФайл(ИмяФайлаПустышки);
    КонецЕсли;
    Если ФС.СуществуетФайл(ИмяФайлаАрхива)=1 Тогда
        ФС.УдалитьФайл(ИмяФайлаАрхива);
    КонецЕсли;
    Если ФС.СуществуетФайл(ИмяФайлаРезультата)=1 Тогда
        ФС.УдалитьФайл(ИмяФайлаРезультата);
    КонецЕсли;
    Выборка=Соединение.Execute("SELECT MAX(Number) FROM pics",,ПараметрыАДО.Получить("adCmdText"));
    Если Выборка.EOF()=0 Тогда
        НовНомерСтроки=Выборка.Fields(0).Value;
    Иначе
        НовНомерСтроки=0;
    КонецЕсли;
    Выборка.Close();
    Соединение.Close();
    ЗапросАДО="";
    Выборка="";
    Соединение="";
    Если ТекНомерСтроки=НовНомерСтроки Тогда
        ЗаписьЖурналаРегистрации(ИмяФайла,"Файлы","Ошибка при помещении файла в базу",,5);
        Возврат 0;
    ИначеЕсли ТекНомерСтроки<НовНомерСтроки Тогда
        ЗаписьЖурналаРегистрации(ИмяФайла+" (заархивирован) "+РазмерФайла+" байт.","Файлы","Файл успешно размещен в базе",,3);
        Возврат НовНомерСтроки;
    КонецЕсли;
КонецФункции
//________________________________________________________
ПараметрыАДО=СоздатьОбъект("СписокЗначений");
ПараметрыАДО.ДобавитьЗначение("adCmdText",1);
ПараметрыАДО.ДобавитьЗначение("adCmdTable",2);
ПараметрыАДО.ДобавитьЗначение("adCmdStoredProc",4
);

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

Обратите внимание: в данном примере считается что архиватор «rar.exe» находится на диске «С:»

Вернуться к статье "Организация хранилища файлов внутри базы данных 1C+MS-SQL"