Что нового

[Данные, строки] неправильное извлечение файла из базы MYSQL

sergioz

Знающий
Сообщения
39
Репутация
5
Версия AutoIt: 3.

Описание:
программа сохраняет в и выгружает файл из MYSQL в таблицу с полем BLOB / MEDIUMBLOB.
текстовые файлы обрабатываются нормально.
*.EXE и *.DOC - выгружаются неправильно (меняется их размер)

Примечания:

Код:
;определение архитектуры для поиска в реестре драйвера
if @OSArch = 'X64' Then Local Const $reg_drv_path = 'HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ODBC\ODBCINST.INI\ODBC Drivers'
if @OSArch = 'X86' Then Local Const $reg_drv_path = 'HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\ODBC Drivers'

Local $sSubKey, $i=0, $sDriver
While @error = 0
   $i+=1
   $sSubKey = RegEnumval($reg_drv_path, $i)
   if StringInStr($sSubKey,'MySQL ODBC') And StringInStr($sSubKey,'Unicode Driver') Then $sDriver = $sSubKey
   if Stringlen($sSubKey)=0 Then ExitLoop
WEnd
;~ $sDriver='MySQL ODBC 5.3 Unicode Driver';если все хорошо то должно быть так
if Stringlen($sDriver)=0 Then
   MsgBox(16,"Ошибка!","не установлен коннектор к MySQL !")
   _Exit()
EndIf

Local $sDBServerIP = "127.0.0.1" ; IP адресс севера с MySQL
Local $sDBUsername = "test"        ; Имя пользователя для подключения к базе данных
Local $sDBPassword = "test"      ; Пароль
Local $sDatabase   = "logistic"      ; База Данных к которой будем подключаемся

; Подключаемся к Серверу
Global $MySQLConn = ObjCreate("ADODB.Connection")
$MySQLConn.Open("DRIVER="&$sDriver&";SERVER=" & $sDBServerIP & ";UID=" & $sDBUsername & ";PWD=" & $sDBPassword & ";PORT=3306"); Подключаемся к базе
$MySQLConn.Execute("CREATE DATABASE if not EXISTS logistic CHARACTER SET utf8 COLLATE utf8_general_ci ;")
$MySQLConn.Execute("USE "&$sDatabase&";");выбор базы
;~ делаем стартовые таблицы
$MySQLConn.Execute("CREATE TABLE IF NOT EXISTS logistic.documents (id int NOT NULL PRIMARY KEY auto_increment,name varchar(250),data BLOB) COLLATE='utf8_general_ci' ENGINE=InnoDB;")


;~ записываем файл в таблицу
Local $sFilePath = FileOpenDialog('выберите файл','','')
Local $hFileOpen = FileOpen($sFilePath, 0)
local $sFileRead = FileRead($hFileOpen)
FileClose($hFileOpen)

local $temp = "INSERT INTO logistic.documents (name, data ) VALUES ('"& $sFilePath & "','" &  StringToBinary($sFileRead) &"');"
$MySQLConn.Execute($temp);запрос с записью файла

$temp = "select * from logistic.documents ORDER BY id DESC LIMIT 1;";выбор последней записи
$temp =  $MySQLConn.Execute($temp)
$temp = $temp.Fields(2).Value;содежимое ячейки (файла)

$temp=BinaryToString($temp);бинарные данные записанные
$temp=BinaryToString($temp);содержимое файла

;~ сохраняем файл из базы
Local $sFilePath = FileSaveDialog('','','')
Local $hFileOpen = FileOpen($sFilePath, 2)
local $sFileRead = FileWrite($hFileOpen,$temp)
FileClose($hFileOpen)
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
1) Файлы нужно хранить на диске. а в базе путь к ним.
2) Файл особенно exe ну никак не может быть представлен строкой, и поэтому применение StringToBinary как и BinaryToString - глупость.
3) Для работы с базой использовать PDO
4) Вставка значений через конкатенацию строк - такая же глупость.
 
Верх