![]() |
![]() |
![]() |
|
Чтение файлов из таблцы 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
|
????? ?????????¬
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |