Конвертация Access в Mysql

deek

Новичок
Код:
  Set rst = CurrentProject.Connection.Execute("SELECT id, my_picture FROM my_table")
  Set stm = New ADODB.Stream

  While Not rst.EOF  
    myFileName = rst.Fields("id").Value & ".gif"
открываешь свою базу в Access, жмешь Alt+F11, в окне Project в контекстном меню выбираешь Insert -> Module, добавляешь код, затем нажимаешь Ctrl+G, в появившемся окне Immediate набираешь "ExportMyPictures", жмешь Enter и идешь пить кофе.

только не забудь включить галочку в Tools -> References -> Microsoft ActiveX Data Objects X.X Library

а почитать можно на яндексе/гугле. русскоязычных ресурсов по Access VBA навалом.
 

zaartix

Новичок
что-то ошибочку выдает после запуска, говорит, что user-defined type not defined
Как это так "выбранный пользователем тип не выбран"???
 

zaartix

Новичок
эта ошибка на строке:
Dim stm As ADODB.Stream, rst As ADODB.Recordset, myFileName As String
 

zaartix

Новичок
все галки повесил. Всего там щас висят 4 галки:
1. Visual basic for applications
2. Microsoft Access 9.0 Object Library
3. OLE Automation
4. Microsoft ActiveX Data Objects 2.1 library
 

zaartix

Новичок
наверняка он у меня ненашел какую-то библиотеку, или у меня она отключена...
 

zaartix

Новичок
deek, опять ошибка, говорит, что arguments are of wrong type, are out of acceptable range or are in conflict with one another.

строка.:
.Write rst.Fields("my_picture").Value
 

zaartix

Новичок
возможно, что ругается на пустое поле...
в my_picture совершенно не обязательно, что должен быть рисунок, его всмысле может и не быть...
 

deek

Новичок
измени запрос:

SELECT id, my_picture FROM my_table WHERE my_picture IS NOT NULL
 

zaartix

Новичок
спасибо, но в итоге получилось тоже самое, с чего и начиналось. Все файлы в самом начале кода содержат все тот-же мусор, что и был у меня после конвертации access2mysql.
может они как-то неправильно в самой базе акцеса лежат?
 

deek

Новичок
мда =)

почитай вот тут: http://www.experts-exchange.com/Databases/MS_Access/Q_20162285.html

комментарий в конце, там есть код, который сохраняет картинки не через ADODB.Stream.

перечитал я тут все с самого начала... а почему ты сразу не написал простенький скриптик, который пробежался бы по всем "кривым" файлам в директории, и не обрезал бы лишнее?
 

zaartix

Новичок
это так называемое "лишнее" ставит в поле сам акцесс, там всяческие его данные о каждой картинке (путь на компутере до нее и т.д.). Составить какой-нибудь регексп неполучится, т.к. там двоичный код, причем ничего фиксированного, никаких универсальных символов окончания настроек акцесса и в помине нету. А тот код, что в том линке расположен сохранит уже без этих акцессовских "прелестей"?
 

deek

Новичок
> никаких универсальных символов окончания настроек акцесса
зато есть заголовок начала картинки

> сохранит уже без этих акцессовских "прелестей"?
понятия не имею. мне подумалось, что ADODB.Stream уже достаточно, чтобы сохранить содержимое OLE-объекта (именно так картинки хранятся в акесе).
 

zaartix

Новичок
>зато есть заголовок начала картинки
Там не только гифы, к сожалению... Отслеживать по каким-либо заголовкам тоже неполучится... варианты форматов: gif, jpg, jpe (скорее всего может быть еще).
 

deek

Новичок
> Отслеживать по каким-либо заголовкам тоже неполучится...

до меня никак не доходит, в чем же такая сложность - распознать тип картинки и обрезать первые N байт.

PHP:
function truncate($fd, $trunc_size, $new_fname)
{	
	rewind($fd);
	fseek($fd, $trunc_size, SEEK_SET);
	$fn = fopen($new_fname, "wb");
	
	while(!feof($fd))
	{
		fwrite($fn, fread($fd, 4096));
	}
	fclose($fn);
}

define (BLOCK_SIZE,	16);

// заголовок jpeg, строчка "яШяа JFIF"
$jpeg_header = pack("c*", 0xFF, 0xD8, 0xFF, 0xE0, 0x00, 0x10, 0x4A, 0x46, 0x49, 0x46);
// заголовок gif, строчка "GIF89a"
$gif_header = pack("c*", 0x47, 0x49, 0x46, 0x38, 0x39, 0x61);
// заголовок png, строчка "‰PNG"
$png_header = pack("c*", 0x89, 0x50, 0x4E, 0x47);

$fname = "d:\\uknown_file_0";
$fd = fopen ($fname, "rb");
$file_header = fread ($fd, BLOCK_SIZE);

if ($pos = strpos($file_header, $jpeg_header)) // это JPEG
{
	truncate($fd, $pos, $fname.".jpg");
}
elseif ($pos = strpos($file_header, $gif_header)) // это GIF
{
	truncate($fd, $pos, $fname.".gif");
}
elseif ($pos = strpos($file_header, $png_header)) // это PNG
{
	truncate($fd, $pos, $fname.".png");
}
else // это что-то еще
{
	rename($fname, $fname."???");
}

fclose ($fd);
 

zaartix

Новичок
спасибо огроменное, я не знал, что все рисунки имеют свои заголовки.
 
Сверху