:: Visual Foxpro, Foxpro for DOS
Загрузка файлов на SQL (BLOB в IMAGE)
hztp_serg
Автор

Сообщений: 577
Откуда: Хмельницкий
Дата регистрации: 19.06.2007
Отправляю фалы на MS SQL Server 2005:
LOCAL m.lcFile, lcImage, lcFilename, m.lnCon
PRIVATE lwFilebody
m.lcDSNLess = ;
"Driver=SQL Server;" + ;
"SERVER=NT3;" + ;
"DBMSSOCN=TCP/IP;" + ;
"UID=AppAdmin;" + ;
"PWD=***;" + ;
"DATABASE=master;" + ;
"APP="
m.lnCon = SQLStringconnect(m.lcDSNLess)
SQLSETPROP(m.lnCon,"DispWarnings",.T.)
m.lcFile = "d:\archiv\MAT_ZVIT\t1081a.DBF"
IF !FILE(m.lcFile)
RETURN .F.
ENDIF
CREATE CURSOR CurImage (image BLOB)
lcImage=FILETOSTR(m.lcFile)
INSERT INTO CurImage (image) VALUES (lcImage)
lwFilebody = CurImage.image
m.lcCommand = [INSERT INTO DDOC..doc_tmp (flname, filesize, filebody) VALUES ('] + ALLTRIM(m.lcFile) + [', DATALENGTH(?lwFilebody), ?lwFilebody)]
SQLEXEC(m.lnCon, lcCommand)
в результате получается, что файлы маленького размера доходят нормально, а побольше - в поле image пусто.
[attachment 33180 blob_to_image.jpg]
прошу вашей помощи. Где собака зарыта?
Ratings: 0 negative/0 positive
Re: Загрузка файлов на SQL (BLOB в IMAGE)
PaulWist

Сообщений: 14618
Дата регистрации: 01.04.2004
1. Вместо IMAGE перейти на varbinary(max)

2.
lcImage=FILETOSTR(m.lcFile)

имеет ограничение в 16М (не всегда, иногда больше)

3. Для загрузки большого файла в курсор использовать APEEND MEMO FROM, и затем по схеме как в твоём коде.


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: Загрузка файлов на SQL (BLOB в IMAGE)
hztp_serg
Автор

Сообщений: 577
Откуда: Хмельницкий
Дата регистрации: 19.06.2007
Поменял в SQL-таблице тип поля на VARBINARY(max). Делаю загрузку dbf-фала размером 29,3 Мб:
LOCAL m.lcFile, lcImage, lcFilename, m.lnCon
PRIVATE lwFilebody
m.lcDSNLess = ;
"Driver=SQL Server;" + ;
"SERVER=NT3;" + ;
"DBMSSOCN=TCP/IP;" + ;
"UID=AppAdmin;" + ;
"PWD=adm;" + ;
"DATABASE=master;" + ;
"APP="
m.lnCon = SQLStringconnect(m.lcDSNLess)
SQLSETPROP(m.lnCon,"DispWarnings",.T.)
m.lcFile = "d:\archiv\MAT_ZVIT\tab10150.DBF"
IF !FILE(m.lcFile)
RETURN .F.
ENDIF
CREATE CURSOR CurImage (filebody BLOB)
SELECT CurImage
APPEND BLANK
APPEND MEMO filebody FROM (m.lcFile) OVERWRITE
lwFilebody = CurImage.filebody
m.lcCommand = [INSERT INTO DDOC..doc_tmp (flname, filesize, filebody) VALUES ('] + ALLTRIM(m.lcFile) + [', DATALENGTH(?lwFilebody), ?lwFilebody)]
SQLEXEC(m.lnCon, lcCommand)
в результате на сервере получаю вместо 29,3 Мб только 16,7 Мб:
[attachment 33184 blob_to_image001.jpg]
как победить?
Ratings: 0 negative/0 positive
Re: Загрузка файлов на SQL (BLOB в IMAGE)
hztp_serg
Автор

Сообщений: 577
Откуда: Хмельницкий
Дата регистрации: 19.06.2007
Получилось добиться желаемого результата путём замены:
m.lcFile = "d:\archiv\MAT_ZVIT\tab10150.DBF"
CREATE CURSOR CurImage (filebody BLOB)
SELECT CurImage
APPEND BLANK
APPEND MEMO filebody FROM (m.lcFile) OVERWRITE
lwFilebody = CurImage.filebody
m.lcCommand = [INSERT INTO DDOC..doc_tmp (flname, filesize, filebody) VALUES ('] + ALLTRIM(m.lcFile) + [', DATALENGTH(?lwFilebody), ?lwFilebody)]
SQLEXEC(m.lnCon, lcCommand)
на
m.lcFile = "d:\archiv\MAT_ZVIT\tab10150.DBF"
lwFilebody = CAST (Filetostr(m.lcFile) AS Blob)
m.lcCommand = [INSERT INTO DDOC..doc_tmp (flname, filesize, filebody) VALUES ('] + ALLTRIM(m.lcFile) + [', DATALENGTH(?lwFilebody), ?lwFilebody)]
SQLEXEC(m.lnCon, lcCommand)
Буду благодарен за поправку, если что не так.
Ratings: 0 negative/0 positive
Re: Загрузка файлов на SQL (BLOB в IMAGE)
PaulWist

Сообщений: 14618
Дата регистрации: 01.04.2004
m.lcFile = "d:\archiv\MAT_ZVIT\tab10150.DBF"
lwFilebody = CAST (Filetostr(m.lcFile) AS Blob)
m.lcCommand = [INSERT INTO DDOC..doc_tmp (flname, filesize, filebody) VALUES ('] + ALLTRIM(m.lcFile) + [', DATALENGTH(?lwFilebody), ?CAST (CurImage.lwFilebody AS Blob))]
SQLEXEC(m.lnCon, lcCommand)


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: Загрузка файлов на SQL (BLOB в IMAGE)
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Зачем блоб в блоб кастовать?


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Загрузка файлов на SQL (BLOB в IMAGE)
PaulWist

Сообщений: 14618
Дата регистрации: 01.04.2004
Igor Korolyov
Зачем блоб в блоб кастовать?

ААА, наследие драйвера MySQL


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: Загрузка файлов на SQL (BLOB в IMAGE)
hztp_serg
Автор

Сообщений: 577
Откуда: Хмельницкий
Дата регистрации: 19.06.2007
Если запускать без CAST
m.lcFile = "d:\archiv\MAT_ZVIT\tab10150.DBF"
lwFilebody = Filetostr(m.lcFile)
m.lcCommand = [INSERT INTO DDOC..doc_tmp (flname, filesize, filebody) VALUES ('] + ALLTRIM(m.lcFile) + [', DATALENGTH(?lwFilebody), ?lwFilebody)]
SQLEXEC(m.lnCon, lcCommand)
то получаю ошибку от SQL - "Operand type clash: text is incompatible with varbinary(max)".
Последний вариант с CAST рабочий.
Ratings: 0 negative/0 positive
Re: Загрузка файлов на SQL (BLOB в IMAGE)
hztp_serg
Автор

Сообщений: 577
Откуда: Хмельницкий
Дата регистрации: 19.06.2007
Изменение типа поля с IMAGE на VARBINARY(max):
ALTER TABLE docums1
ALTER COLUMN filebody VARBINARY(max)
на живой таблице с данными, не приведёт к потери данных?
Ratings: 0 negative/0 positive
Re: Загрузка файлов на SQL (BLOB в IMAGE)
ssa

Сообщений: 13007
Откуда: Москва
Дата регистрации: 23.03.2005
hztp_serg
Изменение типа поля с IMAGE на VARBINARY(max):
ALTER TABLE docums1
ALTER COLUMN filebody VARBINARY(max)
на живой таблице с данными, не приведёт к потери данных?
Изменение типа обычно не приводит к потере данных. Но что мешает проверить на временной таблице?

------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: Загрузка файлов на SQL (BLOB в IMAGE)
hztp_serg
Автор

Сообщений: 577
Откуда: Хмельницкий
Дата регистрации: 19.06.2007
На временной проверил, всё прошло без потерь. Решил лишний раз спросить для спокойствия души.
Ratings: 0 negative/0 positive
Re: Загрузка файлов на SQL (BLOB в IMAGE)
hztp_serg
Автор

Сообщений: 577
Откуда: Хмельницкий
Дата регистрации: 19.06.2007
Все-таки команда FILETOSTR с большими файлами не работает. Файл размером 409 Мб ещё преобразует, а уже - 470 Мб выдаёт ошибку:

[attachment 33189 blob_to_image002.jpg]

правильное альтернативное решение это APPEND MEMO FROM?
Ratings: 0 negative/0 positive
Re: Загрузка файлов на SQL (BLOB в IMAGE)
hztp_serg
Автор

Сообщений: 577
Откуда: Хмельницкий
Дата регистрации: 19.06.2007
Нужна ваша помощь. При попытке поместить dbf-файл, размером 740 Мб - 3286031 записей, в BLOB-поле курсора:

m.lcFile = "d:\archiv\MAT_ZVIT\table_arch402w.dbf"
IF !FILE(m.lcFile)
RETURN .F.
ENDIF
CREATE CURSOR CurImage (filebody BLOB)
SELECT CurImage
APPEND BLANK
APPEND MEMO filebody FROM (m.lcFile)

а потом обратно получить dbf-файл:

COPY MEMO CurGetDoc.filebody TO (m.lcFile)

то в результате, размер dbf-файла уменьшается до 17,6 Мб и к-во записей получатся 9626 вместо 3286031. Что я не правильно делаю. Как я могу отправить файл на SQL, если у меня на фоксе такая ерунда получается? Помогите разобраться.
Ratings: 0 negative/0 positive
Re: Загрузка файлов на SQL (BLOB в IMAGE)
hztp_serg
Автор

Сообщений: 577
Откуда: Хмельницкий
Дата регистрации: 19.06.2007
Тут разобрался, ошибка в имени курсора была. Сейчас работает. Запись в курсор:

m.lcFile = "d:\archiv\MAT_ZVIT\table_arch402w_.dbf"
CURSORSETPROP("MapBinary",.T.,0)
CREATE CURSOR CurBlob (filebody BLOB)
SELECT CurBlob
APPEND BLANK
APPEND MEMO filebody FROM (m.lcFile)

чтение с курсора:

m.lcFile = "d:\archiv\MAT_ZVIT\table_arch402w.dbf"
COPY MEMO CurBlob.filebody TO (m.lcFile)

Осталось только на SQL передать. Пока не получается.
Ratings: 0 negative/0 positive
Re: Загрузка файлов на SQL (BLOB в IMAGE)
hztp_serg
Автор

Сообщений: 577
Откуда: Хмельницкий
Дата регистрации: 19.06.2007
Сделал на SQL хранимую процедуру:

CREATE PROCEDURE DocTmp_ins
@FLNAME VARCHAR(80),
@FLBODY VARBINARY(MAX)
AS
INSERT INTO DDOC..doc_tmp (flname, filesize, filebody) VALUES (@FLNAME, DATALENGTH(@FLBODY), @FLBODY)

с фокса передаю в ХП параметры:

LOCAL m.lcFile, lcFilename, m.lnCon
SET PROCEDURE TO utils
m.lcDSNLess = ;
"Driver=SQL Server;" + ;
"SERVER=NT3;" + ;
"DBMSSOCN=TCP/IP;" + ;
"UID=AppAdmin;" + ;
"PWD=adm;" + ;
"DATABASE=master;" + ;
"APP="
m.lnCon = SQLStringconnect(m.lcDSNLess)
SQLSETPROP(m.lnCon,"DispWarnings",.T.)
m.lcFile = "d:\archiv\MAT_ZVIT\table_arch402w_.dbf"
CURSORSETPROP("MapBinary",.T.,0)
CREATE CURSOR CurBlob (filebody BLOB)
SELECT CurBlob
APPEND BLANK
APPEND MEMO filebody FROM (m.lcFile)
m.lcCommand = [EXEC DDOC..DocTmp_ins ] + NULLIF(m.lcFile) + [, ?CurBlob.filebody]
SQLEXEC(m.lnCon, m.lcCommand)

в результате ошибка:

[attachment 33191 blob_to_image003.jpg]

пробовал использовать драйвер SQL Server Native Client 11.0, получаю другу ошибку:

[attachment 33192 blob_to_image004.jpg]

пока вариантов нет. Буду благодарен за помощь.
Ratings: 0 negative/0 positive
Re: Загрузка файлов на SQL (BLOB в IMAGE)
PaulWist

Сообщений: 14618
Дата регистрации: 01.04.2004
1. На какой команде валится ошибка?

2. На сервере TCP/IP протокол разрешен?

3. Ну в БД master писать не надо, лучше сделать пользовательскую

4. Права на ХП DocTmp_ins у AppAdmin на exec есть?

5. Что вернёт select @@version


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: Загрузка файлов на SQL (BLOB в IMAGE)
hztp_serg
Автор

Сообщений: 577
Откуда: Хмельницкий
Дата регистрации: 19.06.2007
PaulWist
1. На какой команде валится ошибка?
2. На сервере TCP/IP протокол разрешен?

3. Ну в БД master писать не надо, лучше сделать пользовательскую

4. Права на ХП DocTmp_ins у AppAdmin на exec есть?

5. Что вернёт select @@version

Ошибка происходит на выполнении SQLEXEC
TCP/IP протокол разрешен
В строке соединения указываю базу master, а когда передаю SQL-команду, то к объектам обращаюсь через имя_БД..имя_объекта
Права на EXEC DDOC..DocTmp_ins у AppAdmin есть
@@version возвращает:
Microsoft SQL Server 2005 - 9.00.5000.00 (Intel X86) Dec 10 2010 10:56:29 Copyright (c) 1988-2005 Microsoft Corporation Workgroup Edition on Windows NT 5.2 (Build 3790: Service Pack 2)
Выполняю тот-же код, но с другой таблицей, размером 550 байт, всё проходит без ошибок. Размер таблицы, с которой вываливается ошибка, составляет 740 Мб.
Ratings: 0 negative/0 positive
Re: Загрузка файлов на SQL (BLOB в IMAGE)
hztp_serg
Автор

Сообщений: 577
Откуда: Хмельницкий
Дата регистрации: 19.06.2007
Пробовал скидывать dbf-файлы разных размеров, от меньших до больших, с помощью драйверов SQL Server и SQL Server Native Client 11.0. Получилась такая картина:

[attachment 33195 blob_to_image005.jpg]

в результате, с помощью драйвера SQL Server (версия 6.01 от 21.11.2010), файл размером 65.5 Мб отправлен, а уже отправка файла размером 99.5 Мб, выдала ошибку, которая указана выше. С использованием драйвера SQL Server Native Client 11.0 (от 15.08.2017), удалось отправить файл размером 252.5 Мб, а уже отправка файла с размером 367 Мб, закончилась ошибкой, указаной выше. Вопрос остаётся открытым. Как отправлять файлы любых размеров в поле VARBINARY(MAX)?
Получать их обратно, я думаю, проблем не должно быть.
Ratings: 0 negative/0 positive
Re: Загрузка файлов на SQL (BLOB в IMAGE)
PaulWist

Сообщений: 14618
Дата регистрации: 01.04.2004
Попробуй изменить размер пакета (network packet size (B)) со стандартного 4096 до 9192, или больше кратно 4096.


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: Загрузка файлов на SQL (BLOB в IMAGE)
of63

Сообщений: 25254
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Я в этом ничего не понимаю, но, поинтересуюсь, нет ли в SQL-скрипте драйвера опции, чтобы добавлять в Мемо-поле кусками (как в фоксе) ? Тогда можно донаполнять малыми дозами.

Доб. Под Мемо имею ввиду VARCHAR-ы, под добавлением в фоксе - APPEND MEMO MemoFieldName FROM FileName
Может если написать правильный UPDATE, то можно добавить за несколько раз до любого кол. ГБайтов



Исправлено 1 раз(а). Последнее : of63, 06.05.20 19:27
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 17 (Гостей: 17)

© 2000-2024 Fox Club 
Яндекс.Метрика