2016-10-04 109 views
0

我正在開發指紋系統。我要提交的指紋圖像以及諸如名字和姓氏數據庫中的其它數據,但它繼續顯示此異常: No mapping exists from object type System.Drawing.Bitmap to a known managed provider native type.在sql server 2014數據庫中保存指紋圖像

這裏是我最後的代碼:

public void btnSave_Click(object sender, EventArgs e) 
    { 
    @fname = txtfname.Text; 
    @lname = txtlname.Text; 
    byte[] @img1 = Encoding.UTF8.GetBytes(Convert.ToString(pictureBox1.Image));  
    con = new SqlConnection(@"Data Source=DESKTOP-400N4CL;Initial Catalog=test;Integrated Security=True"); 
    con.Open(); 
    cmd = new SqlCommand("INSERT INTO dbo.fingerp " + " (fname,lname,finprint) " + " VALUES(@fname,@lname,@img1)", con); 
    cmd.Parameters.AddWithValue("@fname", txtfname.Text); 
    cmd.Parameters.AddWithValue("@lname", txtlname.Text); 
    cmd.Parameters.AddWithValue("@img1", pictureBox1.Image); 
    cmd.ExecuteNonQuery(); 
    } 

我已經使用這種方法也是如此:

public static byte[] ImageToByte2(Image bmp) 
    { 
    byte[] img1 = new byte[0]; 
    using (MemoryStream stream = new MemoryStream()) 
     { 
     bmp.Save(stream, System.Drawing.Imaging.ImageFormat.Png); 
     stream.Close(); 
     img1 = stream.ToArray(); 
     } 
    return img1; 
    } 

與相同的錯誤。 任何援助請。

+0

請注意,數據庫類型「圖像」是不是一個位圖圖像本身,它是一個字節序列,基本上在這方面一個字節數組。 –

+0

另請注意,如果數據庫中的數據類型實際上是「IMAGE」,則應該使用「VARBINARY(MAX)」(可能)。 –

回答

0

您正在嘗試將PictureBox(其類型爲System.Drawing.Bitmap)的內容保存到需要二進制數據的數據庫字段中。

所以,問題是這一行:

cmd.Parameters.AddWithValue("@img1", pictureBox1.Image); 

它應該是

cmd.Parameters.AddWithValue("@img1", @img1); 

這是一個包含圖像數據的字節數組。

我還假設您的finprint列是BINARYVARBINARY類型。

+0

非常感謝。有效。 finprint是varbinary(max)。它已成功保存,但指紋字段爲不同的指紋節省了相同的值。它是否會像那樣?我怎樣才能讓它獨一無二? – Innoujata

+0

存儲在數據庫中的圖像數據取決於作爲參數傳遞給INSERT查詢的'@ img'變量的值,所以很可能在您的程序中存在一個錯誤。嘗試調試'ImageToByte2'方法並在執行查詢之前檢查'@ img'的內容。 – Alex

+0

我調試它,把「添加監視」和執行前的值爲空。我檢查數組的個別內容。他們仍然是一樣的。有什麼可能是錯的嗎? – Innoujata

0

SQL服務器期望文件流和ImageToByte2()方法實現中的邏輯錯誤。

此外,您正試圖傳遞一個位圖到數據庫,這將無法正常工作。

試試這個:

public void btnSave_Click(object sender, EventArgs e) 
{ 
@fname = txtfname.Text; 
@lname = txtlname.Text; 
byte[] @img1 = ImageToByte2(pictureBox1.Image); 
con = new SqlConnection(@"Data Source=DESKTOP-400N4CL;Initial Catalog=test;Integrated Security=True"); 
con.Open(); 
cmd = new SqlCommand("INSERT INTO dbo.fingerp " + " (fname,lname,finprint) " + " VALUES(@fname,@lname,@img1)", con); 
cmd.Parameters.AddWithValue("@fname", txtfname.Text); 
cmd.Parameters.AddWithValue("@lname", txtlname.Text); 
cmd.Parameters.AddWithValue("@img1", @img1); 
cmd.ExecuteNonQuery(); 
} 


public static byte[] ImageToByte2(Bitmap img) 
{ 
using (var stream = new MemoryStream()) 
{ 
img.Save(stream, System.Drawing.Imaging.ImageFormat.Bmp); 
return stream.ToArray(); 
} 
} 
+0

感謝您的及時回覆。行字節[] @ img1 = ImageToByte2(pictureBox1.Image);顯示錯誤下劃線imageToByte2名稱'ImageToByte2'在當前上下文中不存在如何更正請 – Innoujata

+0

我剛剛編輯了代碼。在我的代碼中放置了一個括號。請立即嘗試 –