2013-04-05 64 views
3

我搜索了很多,並嘗試了各種方法,但無法解決這個問題。 我需要將圖像保存到mysql文件。從MySQL檢索中等blob只返回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 2013-04-05 07:00:48

+0

@ jordanhill123我已經添加分貝樣品以及 – DevT 2013-04-05 07:05:09

回答

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,new MySqlParameter(「@ buffer」,buffer));'。 (重複所有值以防止SQL注入攻擊。) – hangy 2013-04-05 07:52:49

2

你把你的二進制數據轉換成字符串將其寫入到數據庫,這不管用。嘗試按照您發佈的示例URL中的方法,使用@parameter傳遞數據blob。

2

你是不是INSERT正確荷蘭國際集團的數據。你INSERT聲明全文:

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

爲了話,你不使用參數化查詢,插入BLOB數據 - 這不可能很好地工作。

您必須使用參數化查詢。你可以在MySQL documentation找到工作示例(滾動到C#示例)。