Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Есть "чужая" база, но как вытащить данные  [new]
meola
Member

Откуда:
Сообщений: 322
Вообщем в таблице базы есть поле типа image, в котором как я понимаю хранятся бинарные данные, запаковынные в zip-архив, поскольку следующее поле в этой таблице называется ZipVersion и во всех строках содержит одно и тоже значение 1.0-6. Можно ли каким-нибудь способом вытащить этот архив из какой-нибудь записи?
8 ноя 11, 13:08    [11563158]     Ответить | Цитировать Сообщить модератору
 Re: Есть "чужая" база, но как вытащить данные  [new]
Glory
Member

Откуда:
Сообщений: 104751
meola
Можно ли каким-нибудь способом вытащить этот архив из какой-нибудь записи?

Командой select, как и другие данные
8 ноя 11, 13:15    [11563208]     Ответить | Цитировать Сообщить модератору
 Re: Есть "чужая" база, но как вытащить данные  [new]
meola
Member

Откуда:
Сообщений: 322
Glory
meola
Можно ли каким-нибудь способом вытащить этот архив из какой-нибудь записи?

Командой select, как и другие данные

Вот что на выходе этой команды:

К сообщению приложен файл. Размер - 13Kb
8 ноя 11, 14:23    [11563775]     Ответить | Цитировать Сообщить модератору
 Re: Есть "чужая" база, но как вытащить данные  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 35396
Блог
В SSMS есть выбор Result to Grid/Text/File.
Попробуйте последний вариант.
8 ноя 11, 14:25    [11563798]     Ответить | Цитировать Сообщить модератору
 Re: Есть "чужая" база, но как вытащить данные  [new]
yaltagrad
Member

Откуда: АР Крым
Сообщений: 3
Критик
В SSMS есть выбор Result to Grid/Text/File.
Попробуйте последний вариант.

Что-то не получается ничего, может не так что делаю?
8 ноя 11, 14:43    [11563911]     Ответить | Цитировать Сообщить модератору
 Re: Есть "чужая" база, но как вытащить данные  [new]
Chippollino.01
Member

Откуда: изнемагаю
Сообщений: 35527
еще можно через bcp

bcp "SELECT DataBlock FROM Table WHERE ID=1" queryout C:\MyFile.zip -N -T -f C:\x.fmt

где x.fmt текстовый файл

8.0
1
1 SQLIMAGE 0 0 "" 1 DataBlock ""
8 ноя 11, 14:46    [11563940]     Ответить | Цитировать Сообщить модератору
 Re: Есть "чужая" база, но как вытащить данные  [new]
Chippollino.01
Member

Откуда: изнемагаю
Сообщений: 35527
или через sp_OACreate

/*
--посмотреть настройку сервера на разрешение работы с OLE
EXEC sp_configure 'Ole Automation Procedures';
GO
--если не покажет - разрешить показывать
sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
--если 0 то установить 1
sp_configure 'Ole Automation Procedures', 1;
GO
RECONFIGURE;
GO
--вернуть настройки обратно
sp_configure 'Ole Automation Procedures', 0;
sp_configure 'show advanced options', 0;
RECONFIGURE;
*/

DECLARE @Size int, @Pos int,@BufSize int ,@HR int
		,@Buffer varbinary(4096), @Stream int
		,@FileName varchar(2048)
		 
DECLARE @FilePath varchar(1024)='C:\' --у учетки сервера должен быть доступ к этой папке
--Создать ADODB.Stream
EXEC @HR = sp_OACreate 'ADODB.Stream',@Stream OUT 
--Установить свойства
EXEC @HR = sp_OASetProperty @Stream,'Type',1 -- binary 
EXEC @HR = sp_OASetProperty @Stream,'Mode',3 -- write|read 

		SELECT @Pos = 0, @Size = DATALENGTH(DataBlock)  ,@FileName=@FilePath+'MyFile.zip'
		FROM MyTable
		--WHERE --тут условие по отбору конкретной строки 

		EXEC @HR = sp_OAMethod @Stream,'Open' 

		WHILE @Pos < @Size 
		BEGIN 
			SET @BufSize = CASE WHEN @Size - @Pos < 4096 THEN @Size - @Pos ELSE 4096 END 

			SELECT @Buffer = SUBSTRING(DataBlock ,@Pos+1, @BufSize) 
			FROM MyTable
			--WHERE --тут условие по отбору конкретной строки 
			EXEC @HR = sp_OAMethod @Stream, 'Write', NULL, @Buffer 

			SET @Pos = @Pos + @BufSize 
		END 

		--adSaveCreateNotExist 1 
		--adSaveCreateOverWrite 2 
		EXEC @HR = sp_OAMethod @Stream, 'SaveToFile',Null,@FileName,2
		EXEC @HR = sp_OAMethod @Stream, 'Close'

EXEC @HR = sp_OADestroy @Stream
8 ноя 11, 14:54    [11564002]     Ответить | Цитировать Сообщить модератору
 Re: Есть "чужая" база, но как вытащить данные  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
meola,

Можно попробовать точно узнать, что хранится в поле image.

select 
image_name AS [NAME],
DATALENGTH(image_file) AS [SIZE],
SUBSTRING(image_file, 0, 5) as [SIGNATURE],
[FILETYPE] =
case SUBSTRING(image_file, 0, 5)
when 0xFFD8FFE0 then 'JPEG'
when 0xFFD8FFE1 then 'JPEG'
when 0x47494638 then 'GIF'
when 0x424D7801 then 'BMP'
-- можно продолжать
else 'неизвестен' end
from dbo.t_images
4351377
Для того, чтобы дополнить эту таблицу форматами RAR, ZIP и т.д.
создайте тестовую таблицу и запишите туда файл RAR. Затем посмотрите первые 4х байта.
8 ноя 11, 15:37    [11564391]     Ответить | Цитировать Сообщить модератору
 Re: Есть "чужая" база, но как вытащить данные  [new]
meola
Member

Откуда:
Сообщений: 322
trew
meola,

Можно попробовать точно узнать, что хранится в поле image.

select 
image_name AS [NAME],
DATALENGTH(image_file) AS [SIZE],
SUBSTRING(image_file, 0, 5) as [SIGNATURE],
[FILETYPE] =
case SUBSTRING(image_file, 0, 5)
when 0xFFD8FFE0 then 'JPEG'
when 0xFFD8FFE1 then 'JPEG'
when 0x47494638 then 'GIF'
when 0x424D7801 then 'BMP'
-- можно продолжать
else 'неизвестен' end
from dbo.t_images
4351377
Для того, чтобы дополнить эту таблицу форматами RAR, ZIP и т.д.
создайте тестовую таблицу и запишите туда файл RAR. Затем посмотрите первые 4х байта.

Вот что получилось на выходе:

К сообщению приложен файл. Размер - 54Kb
8 ноя 11, 16:18    [11564788]     Ответить | Цитировать Сообщить модератору
 Re: Есть "чужая" база, но как вытащить данные  [new]
meola
Member

Откуда:
Сообщений: 322
Chippollino.01
или через sp_OACreate

/*
--посмотреть настройку сервера на разрешение работы с OLE
EXEC sp_configure 'Ole Automation Procedures';
GO
--если не покажет - разрешить показывать
sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
--если 0 то установить 1
sp_configure 'Ole Automation Procedures', 1;
GO
RECONFIGURE;
GO
--вернуть настройки обратно
sp_configure 'Ole Automation Procedures', 0;
sp_configure 'show advanced options', 0;
RECONFIGURE;
*/

DECLARE @Size int, @Pos int,@BufSize int ,@HR int
		,@Buffer varbinary(4096), @Stream int
		,@FileName varchar(2048)
		 
DECLARE @FilePath varchar(1024)='C:\' --у учетки сервера должен быть доступ к этой папке
--Создать ADODB.Stream
EXEC @HR = sp_OACreate 'ADODB.Stream',@Stream OUT 
--Установить свойства
EXEC @HR = sp_OASetProperty @Stream,'Type',1 -- binary 
EXEC @HR = sp_OASetProperty @Stream,'Mode',3 -- write|read 

		SELECT @Pos = 0, @Size = DATALENGTH(DataBlock)  ,@FileName=@FilePath+'MyFile.zip'
		FROM MyTable
		--WHERE --тут условие по отбору конкретной строки 

		EXEC @HR = sp_OAMethod @Stream,'Open' 

		WHILE @Pos < @Size 
		BEGIN 
			SET @BufSize = CASE WHEN @Size - @Pos < 4096 THEN @Size - @Pos ELSE 4096 END 

			SELECT @Buffer = SUBSTRING(DataBlock ,@Pos+1, @BufSize) 
			FROM MyTable
			--WHERE --тут условие по отбору конкретной строки 
			EXEC @HR = sp_OAMethod @Stream, 'Write', NULL, @Buffer 

			SET @Pos = @Pos + @BufSize 
		END 

		--adSaveCreateNotExist 1 
		--adSaveCreateOverWrite 2 
		EXEC @HR = sp_OAMethod @Stream, 'SaveToFile',Null,@FileName,2
		EXEC @HR = sp_OAMethod @Stream, 'Close'

EXEC @HR = sp_OADestroy @Stream

Благодарю, файл получился, но при попытке его извлечь из архива вылетает сообщение, что архив поврежден или имеет неизвестный формат, похоже файл не zip архива, интересно узнать какого
8 ноя 11, 16:22    [11564817]     Ответить | Цитировать Сообщить модератору
 Re: Есть "чужая" база, но как вытащить данные  [new]
meola
Member

Откуда:
Сообщений: 322
trew
meola,

Можно попробовать точно узнать, что хранится в поле image.

select 
image_name AS [NAME],
DATALENGTH(image_file) AS [SIZE],
SUBSTRING(image_file, 0, 5) as [SIGNATURE],
[FILETYPE] =
case SUBSTRING(image_file, 0, 5)
when 0xFFD8FFE0 then 'JPEG'
when 0xFFD8FFE1 then 'JPEG'
when 0x47494638 then 'GIF'
when 0x424D7801 then 'BMP'
-- можно продолжать
else 'неизвестен' end
from dbo.t_images
4351377
Для того, чтобы дополнить эту таблицу форматами RAR, ZIP и т.д.
создайте тестовую таблицу и запишите туда файл RAR. Затем посмотрите первые 4х байта.

Судя по тому, что для каждой строки значение поля SIGNATURE разное, то походу в поле хранится не архив, а что-то другое
8 ноя 11, 16:41    [11564995]     Ответить | Цитировать Сообщить модератору
 Re: Есть "чужая" база, но как вытащить данные  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
meola,

select 
SUBSTRING(img1, 0, 5) as SIGNATURE,
FILETYPE =
case SUBSTRING(img1, 0, 5)
when 0xFFD8FFE0 then 'JPEG'
when 0xFFD8FFE1 then 'JPEG-1'
when 0x47494638 then 'GIF'
when 0x424D7801 then 'BMP'
when 0x52617221 then 'RAR'
when 0x504B0304 then 'ZIP'
when 0x4D5A5000 then 'SFX-exe'
when 0xD0CF11E0 then 'DOC'
when 0x73737373 then 'txt'

-- можно продолжать
else 'неизвестен' end
from AB_Image


Нужно СОЗДАТЬ ТАБЛИЦУ тестовую, и закидывать туда файлы разного формата.
INSERT INTO AB_Image(descr1, img1)
SELECT  'txt',* FROM OPENROWSET(BULK N'C:\rrtt.txt', SINGLE_BLOB) rs
8 ноя 11, 16:55    [11565112]     Ответить | Цитировать Сообщить модератору
 Re: Есть "чужая" база, но как вытащить данные  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
select * from AB_Image
8 ноя 11, 16:56    [11565125]     Ответить | Цитировать Сообщить модератору
 Re: Есть "чужая" база, но как вытащить данные  [new]
meola
Member

Откуда:
Сообщений: 322
trew
meola,

select 
SUBSTRING(img1, 0, 5) as SIGNATURE,
FILETYPE =
case SUBSTRING(img1, 0, 5)
when 0xFFD8FFE0 then 'JPEG'
when 0xFFD8FFE1 then 'JPEG-1'
when 0x47494638 then 'GIF'
when 0x424D7801 then 'BMP'
when 0x52617221 then 'RAR'
when 0x504B0304 then 'ZIP'
when 0x4D5A5000 then 'SFX-exe'
when 0xD0CF11E0 then 'DOC'
when 0x73737373 then 'txt'

-- можно продолжать
else 'неизвестен' end
from AB_Image


Нужно СОЗДАТЬ ТАБЛИЦУ тестовую, и закидывать туда файлы разного формата.
INSERT INTO AB_Image(descr1, img1)
SELECT  'txt',* FROM OPENROWSET(BULK N'C:\rrtt.txt', SINGLE_BLOB) rs

Это понятно, но опять же повторюсь, что ДЛЯ КАЖДОЙ записи значение первых четырех байтов в поле - типа IMAGE - меняется, т.е. сам посуди там явно не архив, иначе бы первые четыре байта каждой строки (если бы там были данные в архиве, н-р, типа zip) были бы одинаковы........Там скорее всего какой-то текстовый формат, поскольку прога производителя, которая туда данные пишет, она же из выводит в виде таблицы(грида) на форме, полагаю в поле даже не графический файл хранится, а вот какой - пока не знаю(((
9 ноя 11, 10:04    [11567523]     Ответить | Цитировать Сообщить модератору
 Re: Есть "чужая" база, но как вытащить данные  [new]
Chippollino.01
Member

Откуда: изнемагаю
Сообщений: 35527
значит первые 4 байта содержат размер файла
посмотри что содержится дальше
если найдешь устойчивые сигнатуры
с фиксированным отступом (4-8...x байт)
значит это и есть заголовок файла
чел мог заливать имидж через самопальный контрол снабжая служебной инфой
например инкапсулировать размер и название файла...
9 ноя 11, 10:58    [11567850]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить