Имя: Пароль:
1C
 
Чтение файлов из таблцы SQL
0 GreenHorse
 
07.04.10
15:24
Доброго времени суток.

мне надо забрать из таблицы SQL файлы (могут быть и рисунки и таблицы и текст). Ну и хотя бы сохранить их на куда-нибудь...

И вроде счастье рядом... Файлы сохраняются... и информация там какая-то есть..
Просто увидеть я ее не могу (картинки не открываются).... А текстовые данные идут в перемешку с кучей доп. символов... + видно доп. инфу о самом файле.

При использовании ADODB.Stream не заполняются атибуты Charset и LineSeparator... Может в этом дело?

Люди добрые, Помогите кто чем может!!!!
1 vde69
 
07.04.10
15:30
все зависит от того как данные записаны и в каком виде они там лежат, вот пример как из 7.7 можно хранить во внешней базе, только вот незадача, что 1с не понимает первые 31 символ (они не могут быть в строке 1с), от сюда всякие хитрости, может у тебя подобное?

http://infostart.ru/public/16687/
2 Sadovnikov
 
07.04.10
15:31
(0) Как забираешь-то?
3 vde69
 
07.04.10
15:32
(2) забирает вероятно через ADODB.Stream, но там подводных камней куча
4 GreenHorse
 
07.04.10
15:36
Может туплю.. но сначала забираю с помощью ADODB.RecordSet. Потом использую ADODB.Stream

Как везде написано:
StreamOut.Open();
StreamOut.Write(Data);  // Data -  COMSafeArray

StreamOut.SaveToFile(ИмяФайла, SaveOptionsEnum.adSaveCreateOverWrite);
StreamOut.Close();
5 GreenHorse
 
07.04.10
15:37
В таблице тип поля image - то есть <Binary>
6 Sadovnikov
 
07.04.10
15:41
(4)
         //Считаем результат из запроса
         Rez := SQLFetch(hstmt1);
         if Rez <> SQL_NO_DATA then
           begin
             StrSQLODBC := '';
             GetMem(RezStr,StrDlina);
             //постепенно будем считывать полученные данные
             While true do begin
               Rez := SQLGetData(hstmt1,1,SQL_C_DEFAULT,RezStr,StrDlina,@N);
               if Rez = SQL_NO_DATA then
                 break;
               MyMemStream.WriteBuffer(RezStr^,Min(N,StrDlina));
             end;
             SetGetTextODBC := '';
             MyMemStream.Seek(0,soFromBeginning);
             FreeMem(RezStr);
           end
7 GreenHorse
 
07.04.10
15:53
Очень много новых букв :-)

в описание функции SQLFetch написано:

"извлечение данных только в том случае, если поля результирующего набора
предварительно были связаны с переменными вызовом функции
SQLBindCol для каждого связываемого поля." Это как?
8 Sadovnikov
 
07.04.10
15:55
(7) Разумеется так.
9 Sadovnikov
 
07.04.10
15:55
+(8)
//Привяжем параметры
 for N:=1 to KolPar do
   begin
     Case ParamList[N-1].Tip of
       1: //Строка
         begin
           GetMem(ParamList[N-1].RezStr,ParamList[N-1].Dlina+1);
           Rez := SQLBindParameter(hstmt1, N, SQL_PARAM_INPUT, SQL_C_CHAR,
                           SQL_CHAR, ParamList[N-1].Dlina, 0, ParamList[N-1].RezStr,
                           ParamList[N-1].Dlina+1, @ParamList[N-1].IdPar);
         end;
       4: //Целое число
           Rez := SQLBindParameter(hstmt1, N, SQL_PARAM_INPUT, SQL_C_LONG,
                           SQL_INTEGER, 0, 0, @ParamList[N-1].RezInt, 0, @ParamList[N-1].IdPar);
       8: //Дробное число
           Rez := SQLBindParameter(hstmt1, N, SQL_PARAM_INPUT, SQL_C_DOUBLE,
                           SQL_DOUBLE, ParamList[N-1].Dlina, ParamList[N-1].Tochn,
                           @ParamList[N-1].RezDoub, 8, @ParamList[N-1].IdPar);
     end;
     if (Rez<>SQL_SUCCESS) And (Rez<>SQL_SUCCESS_WITH_INFO) then
       begin
         //Если что-то не получилось, вернем '##Ошибка##'
         TZInSQL:='##Ошибка##';

         //закроем курсор и освободим ресурсы
         SQLCloseCursor(hstmt1);
         SQLFreeHandle(SQL_HANDLE_STMT,hstmt1);
         SQLFreeHandle(SQL_HANDLE_STMT,hdbc1);

         exit;
       end;
   end;
10 GreenHorse
 
07.04.10
15:59
в возвращаемом массиве вроде все числа целые.....
а более близко к 1С-ке можно? плизззззз  0_0

Я так поняла мне рекомендовано пересмотреть подход к выборке данных.
11 Sadovnikov
 
07.04.10
16:01
(10) "а более близко к 1С-ке можно?" - неа... Сделал в ВК и пользую. И гемороюсь в 1С-ке...
12 vde69
 
07.04.10
16:03
(10) на 1с - нельзя получать (без особых выкрутас) нормально бинарные данные, по тому как строки 1с не понимают бинарные данные, об этом я писал в (1)
13 sapphire
 
07.04.10
16:05
// а так?
StreamOut.Type        = 1;
StreamOut.Open();
StreamOut.Write(Data);  // Data -  COMSafeArray

StreamOut.SaveToFile(ИмяФайла, SaveOptionsEnum.adSaveCreateOverWrite);
StreamOut.Close();
14 sapphire
 
07.04.10
16:05
(12) Чушь городите.
15 GreenHorse
 
07.04.10
16:06
(12) Только зарегистрировалась скачала...

Странно в 8-ке есть тип двоичные данные....  Она же понимает что считала.....
Только показать преобразовать возможно не дает...
16 GreenHorse
 
07.04.10
16:07
(13) Тип прописан... просто в отрывке не указала  .. соррри
17 GreenHorse
 
07.04.10
16:08
ой... преобразовать = преобразованное
18 sapphire
 
07.04.10
16:10
(12) Получаю архивы из SQL и всё работает.
(15) Ха. Так может не в потоке дело, а в коде 1С?
19 GreenHorse
 
07.04.10
16:11
(18) Весь код в студию?
20 vde69
 
07.04.10
16:13
(15) бинарные данные в 8.х - это специальный контейнер который заточен под работу с базой а не внешней SQL таблицей. Получить бинарные данные в этом обьекте можно только через временный файл.

(14) не чушь, я говорю что получить в 1с нельзя, но можно "мимо 1с" как в примере с ADODB.Stream, только 7.7 это не поддерживает :) приходится через скрипты... ну и потом размер бинарных данных может быть слишком большим, адо - рекомендует получать такие данные дампами
21 sapphire
 
07.04.10
16:13
(19) Касательно потока.
22 shuhard
 
07.04.10
16:14
(19) v8: Проблема с чтением бинарных данных из sql в 1с
...
Процедура КнопкаВыполнитьНажатие(Кнопка)
   Stream=Новый COMОбъект("ADODB.Stream");
   Stream.Type=1;
   Stream.Open();
   Stream.LoadFromFile("C:\БылЗвонок.bmp");
   Connection=Новый COMОбъект("ADODB.Connection");
   Connection.Open("Provider=SQLOLEDB.1; Data Source=NEXTGEN; Initial Catalog=MyBase; User ID=sa;");
   RecordSet=Новый COMОбъект("ADODB.Recordset");
   RecordSet.CursorLocation=3;
   RecordSet.LockType=2;
   Запрос="Select data from dbo.MyTable";
   RecordSet.Open(Запрос, Connection);
   Если RecordSet.RecordCount=0 Тогда
       RecordSet.AddNew();
   //    RecordSet.Fields(0).Value=1;


   Иначе
       RecordSet.MoveFirst();
   КонецЕсли;
   RecordSet.Fields("Data").Value=Stream.Read(-1);
   RecordSet.Update();
   Stream.Close();
КонецПроцедуры

Процедура ОсновныеДействияФормыd(Кнопка)
   Stream=Новый COMОбъект("ADODB.Stream");
   Stream.Type=1;
   Stream.Open();
   Connection=Новый COMОбъект("ADODB.Connection");
   Connection.Open("Provider=SQLOLEDB.1; Data Source=NEXTGEN; Initial Catalog=MyBase; User ID=sa;");
   RecordSet=Новый COMОбъект("ADODB.Recordset");
   RecordSet.CursorLocation=3;
   RecordSet.LockType=2;
   Запрос="Select data from dbo.MyTable";
   RecordSet.Open(Запрос, Connection);
   RecordSet.MoveFirst();
   Stream.Write(RecordSet.Fields("Data").Value);
   Stream.SaveToFile("c:\БылЗвонокВост.bmp");
   Stream.Close();
КонецПроцедуры
23 GreenHorse
 
07.04.10
16:16
В том то и дело... что я не могу загрузить из файла... есть только данные в Скуле

Data = Новый COMSafeArray(НаборЗаписейСКЛ.Fields("Data_").Value);    // двДанныеФайла   //СодержимоеМассив, "VT_UINT", СодержимоеМассив.Количество()
           
           StreamOut      = Новый COMОбъект("ADODB.Stream");                  
           
           StreamOut.Type = StreamTypeEnum.adTypeBinary;
           StreamOut.Mode = ConnectModeEnum.adModeReadWrite; //Нужны и чтение и запись.
           
           StreamOut.Open(); //Открыли на чтение и запись
           StreamOut.Write(Data);  //Data   двДанныеФайла

           StreamOut.SaveToFile(ИмяФайла, SaveOptionsEnum.adSaveCreateOverWrite); //"2" - перезапись файла //adSaveCreateNotExist   //, SaveOptionsEnum.adSaveCreateOverWrite
           StreamOut.Close();
24 sapphire
 
07.04.10
16:16
(20) Начнем с того, что изначально 1С не умеет читать чужие таблицы MS SQL только своими нативными методами без внешних объектов, а стало быть суждение (12) в рамках контекста (0) некорректно, ИМХО.
25 GreenHorse
 
07.04.10
16:16
StreamTypeEnum = Новый Структура("adTypeBinary, adTypeText", 1, 2);
   ConnectModeEnum = Новый Структура(
   "adModeRead, adModeReadWrite, adModeRecursive, adModeShareDenyNone,
   |adModeShareDenyRead, adModeShareDenyWrite, adModeShareExclusive,
   |adModeUnknown, adModeWrite", 1, 3, 4194304, 16, 4, 8, 12, 0, 2);
   SaveOptionsEnum = Новый Структура("adSaveCreateNotExist, adSaveCreateOverWrite", 1, 2);


Структуры параметров :-)
26 sapphire
 
07.04.10
16:18
StreamOut      = Новый COMОбъект("ADODB.Stream");                  
           
StreamOut.Type =1;
StreamOut.Open();
StreamOut.Write(НаборЗаписейСКЛ.Fields("Data_").Value);
StreamOut.SaveToFile(ИмяФайла);
27 sapphire
 
07.04.10
16:19
(25) Зачем нужно вот это?:
Data = Новый COMSafeArray(НаборЗаписейСКЛ.Fields("Data_").Value);
28 sapphire
 
07.04.10
16:20
И так, понятно что в (0) это COMSafeArray, и понятно почему так выглядит,
потому что Вы пишите не картинку, не данные, а ... массив.
29 GreenHorse
 
07.04.10
16:22
Я уже попробовала несколько вариантов....

Решила попробовать передавать не полученный массив, а созданный... причем разными методами.... (из другого массива например)

чем черт не шутит
30 sapphire
 
07.04.10
16:24
(29) Объясните толком, зачем Вам массив?
31 vde69
 
07.04.10
16:24
почитай про AppendChunk

его не зня сделали :)
32 sapphire
 
07.04.10
16:25
(31) Да ладно, думаешь там безразмерные сканы накладных? :)))
33 GreenHorse
 
07.04.10
16:25
(30) потому что я его таким из таблицы получаю.
34 GreenHorse
 
07.04.10
16:28
(31) Я сама не знаю что там.. но переносить около 30000 файлов вручную... жестоко... даже если это не я буду делать...

кусок полученного rtf (есть и такое)

###М#@#1Courier New#М#####-#######.###O###2
Ђ###-#######Ў### НБ возвращается в
бизнес#2#2#2#2#2#2#2#2#2#2#2#2#2#
35 shuhard
 
07.04.10
16:29
(29)[Я уже попробовала несколько вариантов...]
прогони (22) на сервер и обратно
если картинка будет цела, то дело в контейнере на сиквеле
36 vde69
 
07.04.10
16:29
(32) дело не в безразмерности, а в специльном механизме работы с бинарными данными.

надо юзить или потоки или лоскуты, а простой райд - по любому глючит
37 vde69
 
07.04.10
16:32
(34) как ты получила данный кусок?

что-то мне кажется, что там просто сжатие какое используется или еще чего...
38 shuhard
 
07.04.10
16:33
(35) + давным давно решал на Access задачку так:
Dim MyRst As ADODB.Recordset
Dim SqlStr As String
Dim Swop As Variant
Dim MyCanal As Long
If Not IsNull(Me![Sp_Corp].Column(0)) Then
SqlStr = "select * from TCorp where Corp_ID= " & Me![Sp_Corp].Column(0)
Set MyRst = New ADODB.Recordset
MyRst.Open SqlStr, CurrentProject.Connection, adOpenStatic, adLockReadOnly
If MyRst.RecordCount <> 0 Then
 Swop = MyRst.Fields("Inna").GetChunk(1000000)
 On Error Resume Next
 Kill "d:\out.pdf"
 MyCanal = FreeFile
 'Swop = 12345

 Open "d:\out.pdf" For Binary As #MyCanal
   Put #MyCanal, , Swop
   Close #MyCanal
Shell "C:\Program Files\Adobe\Acrobat 5.0\Reader\AcroRd32.exe /p /h d:\out.pdf", vbHide
End If
MyRst.Close
Set MyRst = Nothing
End If
39 GreenHorse
 
07.04.10
16:34
(35) То есть для чистоты эксперимента... самой его туда закинуть... и считать???
я правильно поняла?
40 vde69
 
07.04.10
16:37
(39) да закинь и считай.

еще чего на ум приходит - это различие кодировок, тогда получается похожая на (34) фигня. Бывает например при кривой установке сервера на никсах и работе виндовыми клиентами. Тогда в строке подключения нужно явно указывать кодировку
41 GreenHorse
 
07.04.10
16:38
(37) Как описала так и получила.... Ничего нового не делала...
У меня там файлы всех мастей и видов... картинки просто не открываются.. но судя по размеру непустые...
Много doc и rtf

Добыть файлы это ползадачи....  Потом их надо запихнуть в хранилише значений
42 shuhard
 
07.04.10
16:38
(39) верно поняла
можешь не картинку, а rtf

(37) + (35)

если данные на сиквеле хранит некое приложение, то мало извлечь BLOB, его надо обработать

многин приложение пишут свои хэдеры
43 GreenHorse
 
07.04.10
16:39
(40) Я сама на кодировку грешила... но русский он распознает... и судя по всему еще и описание шрифта видит
а в каком параметре можно указать кодировку???
44 GreenHorse
 
07.04.10
16:41
(42) Есть подозрение что это может быть Access только спросить сейчас не у кого...
у меня только таблицы от базы есть
45 shuhard
 
07.04.10
16:45
(44) Access это хорошо, готового кода море
http://sql.ru/forum/actualtopics.aspx?search=getchunk&submit=%CD%E0%E9%F2%E8&bid=4
46 GreenHorse
 
07.04.10
16:51
(45) Это конечно хорошо..... только не знаю как мне это поможет...
мне надо потом эти файлики по клиентам в базюке приаатачить...

у меня Access-а даже на компе нет
47 shuhard
 
07.04.10
16:56
(46) не отвлекайся
ты на сиквел и обратно rtf и bmp прокрутила ?
48 GreenHorse
 
07.04.10
17:05
(47) вставить вставила.... в первую попавшуюся запись.... не нашла ... исправила...
счаз достану и отрапортую
49 GreenHorse
 
07.04.10
17:07
(46) Все работает отлично...
50 GreenHorse
 
07.04.10
17:09
(42) и как его обрабатывать?
51 shuhard
 
07.04.10
17:13
(50) забавный вопрос
у тебя не идентифицированное приложения
52 sapphire
 
07.04.10
17:16
(51) А вдруг там файлики-то пожаты чем нить?
53 GreenHorse
 
07.04.10
17:16
это не вопрос. это крик души!!!

цитата:
"если данные на сиквеле хранит некое приложение, то мало извлечь BLOB, его надо обработать

многин приложение пишут свои хэдеры";

рассмотрим вариант с Access ... если есть идеи...
54 sapphire
 
07.04.10
17:18
(53) Если известно имя файла и тип, запиши и выложи для примера из выгрузки типа (26)
55 GreenHorse
 
07.04.10
17:21
сейчас что-нибудь изобразю..... только надо найти что-нибудь безобидное.... а то потом ругать будут...
56 sapphire
 
07.04.10
17:21
Еще можно предположить, что файлы могли быть банально зашифрованы.
57 GreenHorse
 
07.04.10
17:26
(54) файлик опенофиса подойдет?
58 sapphire
 
07.04.10
17:27
(57) Давай
59 GreenHorse
 
07.04.10
17:31
а на куда его выложить?
60 shuhard
 
07.04.10
17:32
(53) [рассмотрим вариант с Access ... если есть идеи]
топаешь на sql.ru и сушишь мозг Санычу
61 GreenHorse
 
07.04.10
17:37
(53) я и там нагадила... в смысле написала... но там глухо как в танке...
62 GreenHorse
 
07.04.10
17:38
(60) упс..
63 sapphire
 
07.04.10
17:39
(62) Ты не пробовала выяснить что за приложение хранит инфо в этой таблице для начала?
64 sapphire
 
07.04.10
17:40
А то окажется, что так какой-нить а-ля 1С-Архив или еще что нибудь одинесное с хранилищем значения....
65 GinGer
 
07.04.10
17:42
тут была статья о том как хранить файлы в отдельной таблице SQL (вне базы 1С)
http://www.softpoint.ru/article_id130.htm
66 shuhard
 
07.04.10
17:43
(61) халява кончилась
придется отстегнуть разработчику предыдущей системы
67 sapphire
 
07.04.10
17:44
(65) Это не то.
68 sapphire
 
07.04.10
17:44
(66) Да ладно, не глумись :)))
69 GreenHorse
 
07.04.10
17:45
Разработчик в отпуске.... Любимый ответ на любой вопрос у него "Это невозможно".
А я мучайся... воть
И все таки это Access
70 GreenHorse
 
07.04.10
17:45
Я сама над кем хошь поглумлюсь как только с этим вопросом разберусь...
71 sapphire
 
07.04.10
17:46
(69) Что Access?
72 shuhard
 
07.04.10
17:47
(69) [Любимый ответ на любой вопрос у него "Это невозможно". ]
правильный чел
бери пример
чё задаром анус рвать
73 shuhard
 
07.04.10
17:48
(71) Access при хранении данных на сиквеле "слегка" удлиняет BLOB
совсем немножко
74 GreenHorse
 
07.04.10
17:48
жалко мне их всех... да и интересно .. если чессно...
знания лишними не бывают...
75 shuhard
 
07.04.10
17:49
(74)[да и интересно]
пока кроме флюда на мисте твой вклад=NULL
76 sapphire
 
07.04.10
17:49
(74) Да ответь ты толком, что за прога хранит в этой гребаной таблице данные
77 sapphire
 
07.04.10
17:50
(75) Вах, зато барышня слово волшебное знает "SQL"....
78 GreenHorse
 
07.04.10
17:51
(75) ой может и нулл, но хоть поянтно в какое направление думать.. Вам всем респект..

(77) Я много каких слов знаю... могу помочь обогатить словарные запас
79 sapphire
 
07.04.10
17:51
(73) Ну если это VBA... то фиг знает что за объект храниться, тогда действительно массив, только надо понять в каком элементе храниться сам файл.
80 shuhard
 
07.04.10
17:51
(76) это MS Access
у юзера mdb
в mdb форма
в форме кнопка и контрол
к mdb приатачен сиквел

в контрол загружается картинка или rtf-на
кнопка нажимается, контейнер на сиквел записывается
81 sapphire
 
07.04.10
17:54
(80) А если пойти другим путем - приаттачить этот Access к SQL?
82 sapphire
 
07.04.10
17:56
(80) По логике, тогда, он должен вернуть "свои" таблицы в удобоваримом виде.
Я боюсь, что там что-то вроде объекта встроенного класса или структура
83 shuhard
 
07.04.10
18:08
(82) правильно боишься
у картинка хэдер
у rtf свой формат
84 sapphire
 
07.04.10
18:12
(83) Ну про форматы песни петь не надо - это и так ясно.
Или ты имеешь ввиду, что контейнер разный?
Т.е. используется, например ocx в качестве контейнера?
85 shuhard
 
07.04.10
18:22
(84) осх разные и контейнеры разные
86 sapphire
 
07.04.10
18:28
(85) Скорее всего штатные в системе
87 vde69
 
07.04.10
19:42
(80) а код аксеса глянуть надо и будет понятно :)
88 sapphire
 
07.04.10
19:43
(87) Может быть закрыт код.
89 vde69
 
07.04.10
19:47
(88) :)

я понимаю как например можно закрыть форму (сделать динамической из внешнего ресурса), но код в аксессе закрыть практически не реально :)
90 shuhard
 
07.04.10
19:48
(89) Access код для хранения картинки на сиквеле не нужен
91 vde69
 
07.04.10
19:50
(90) не нужен если нету секретов, может там потоковый архиватор или еще чего...
92 shuhard
 
07.04.10
19:52
(91) может, но судя по топику всё сделано в лоб
93 vde69
 
07.04.10
19:54
(92) тогда все просто, нужно юзать тот-же драйвер (аксесовский) из VB скрипта и отладчиком глянуть тот обьект который получим
94 vde69
 
07.04.10
19:54
(93) или на аксессе написать обработку сохранения файлов на диск
95 shuhard
 
07.04.10
20:00
(94) дык я ТС дал ссылку на Sql.ru, где есть код для выгрузки на диск средствами Access
96 GreenHorse
 
08.04.10
12:23
(93) А как провернуть креатифф с драйвером?
(95) Если не получится, то придется выгрузку из Access делать тому парню... а мне их потом прицеплять к контрагентам по какому либо признаку...
97 sn175
 
08.05.10
05:40
????? ?????????¬
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.