2016-10-04 110 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

我刚刚编辑了代码。在我的代码中放置了一个括号。请立即尝试 –