2013-04-05 2 views
3

Я искал много и пробовал различные методы, но не смог решить эту проблему. Мне нужно сохранить изображение в файл mysql.Извлечение среды blob из MySQL возвращает только 13 байтов

Я использовал ниже код для того, чтобы сохранить изображение в базе данных.

try 
{ 
    string location = @"C:\Users\test\Downloads\Photos\batman-greenscreen.jpg"; 

    FileStream fs = new FileStream(location, FileMode.Open, FileAccess.Read); 
    UInt32 fileLength = (UInt32)fs.Length; 
    byte[] buffer = new byte[fileLength]; 
    fs.Read(buffer, 0, (int)fileLength); 

    string sqlPhotoQuery = "INSERT INTO tab_photo VALUES('" + photo.PhotoId + "','" + photo.ProjectID + "','" + photo.Day + "','" + photo.Barcode + "','" + photo.Photoname + "','" + photo.PhotoXml + "','" + buffer + "','" + fileLength + "')"; 
    int result = MySqlHelper.ExecuteNonQuery(connectionString, sqlPhotoQuery); 
    if (result > 0) 
     return true; 
    else 
     return false; 
} 
catch (Exception e) 
{ 
    return false; 
} 

в этом файле длина изображения составляет 12428, saving values

, что я пытался для извлечения данных из базы данных:

Photo photo = new Photo(); 
try 
{ 
    string sqlQuery = "SELECT * FROM tab_photo where PhotoId='"+photoId+"'"; 
    MySqlDataReader rdr = MySqlHelper.ExecuteReader(connectionString, sqlQuery); 
    while (rdr.Read()) 
    { 
     photo.PhotoId = rdr.GetString("PhotoId"); 
     photo.ProjectID = rdr.GetString("ProjectID"); 
     photo.Day = rdr.GetInt32("Day"); 
     photo.Barcode = rdr.GetString("Barcode"); 
     photo.Photoname = rdr.GetString("Photoname"); 
     photo.PhotoXml = rdr.GetString("PhotoXml"); 

     MemoryStream ms; 
     UInt32 FileSize; 
     Bitmap outImage; 

     int fileSize = rdr.GetInt32(rdr.GetOrdinal("PhotoSize")); 
     byte[] rawData = new byte[fileSize]; 
     rdr.GetBytes(rdr.GetOrdinal("Photo"), 0, rawData, 0, (Int32)fileSize); 

     photo.imageByte = rawData; 

    } 
} 
catch (Exception e) 
{} 

но когда я получить файл, он получить только первые 13 байт. после этого его значение равно ноль и есть разница в значениях извлечения.

retrieve values

я следовал инструкции, указанные в Handling BLOB Data With Connector/Net.

согласно тому, что я изменил мои настройки следующим образом: MySql Workbench setting

это как сохраненные данные в базе данных data in DB

каковы причины того, что я не могу получить правильные значения? есть ли какие-либо проблемы при сохранении данных или извлечении данных или конфигурации базы данных?

+0

Как выглядят данные на стороне базы данных? Записывает ли оператор 'Insert' полный буфер' byte [] в базу данных? – jordanhill123

+0

@ jordanhill123 Я также добавил образец db – DevT

ответ

3

В базе данных данных не может быть данных. Объединяя буфера в строку запроса «System.Byte []» будет вставлена ​​в базу данных, так как оператор вставки будет в основном выглядеть

INSERT INTO tab_photo VALUES(...,'System.Byte[]', ...)"; 

использовать параметризованные запросы, как в примере, и вы должно быть хорошо.

Не просто объединяйте строки откуда-то в свои SQL-запросы. (И не поймайте и не проглотите все исключения в методе, подобном этому. Это делает его очень трудным для отладки в случае сбоя.)

+1

http://dev.mysql.com/doc/connector-net/en/connector-net-ref-mysqlclient-mysqlhelpermembers.html # connector-net-ref-mysqlclient-mysqlhelper-executenonquery-overload-2 объясняет это довольно хорошо. Вместо ', '" + buffer + "',', вы должны использовать ', @ buffer 'и называть его как' MySqlHelper.ExecuteNonQuery (connectionString, sqlPhotoQuery, новый MySqlParameter («буфер», буфер)). '. (Повторите, чтобы все значения были более безопасными для атак SQL-инъекций.) – hangy

2

Вы помещаете свои двоичные данные в строку, чтобы записать ее в db, что не будет работать. Попробуйте выполнить метод в URL-адресе примера, который вы опубликовали, для передачи данных blob с помощью @parameter.

2

Вы не правильно указали данные INSERT. Ваше INSERT заявления гласит:

string sqlPhotoInsert = "INSERT INTO tab_photo VALUES('" + ... 

В порядке словах, вы не используете параметризованный запрос для вставки данных BLOB - это не могло хорошо работать.

Вы должны использовать параметризованные запросы. Вы можете найти рабочий пример в MySQL documentation (прокрутите до C# пример).

Смежные вопросы