2016-10-04 12 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; 
    } 

同じエラーです。 助けpls。

+0

を、それが基本的には、この文脈でのバイト配列のバイトのシーケンスです。 –

+0

また、データベースのデータ型が実際に「イメージ」である場合は、代わりに(おそらく)「VARBINARY(MAX)」を使用する必要があります。 –

答えて

0

PictureBox(タイプはSystem.Drawing.Bitmap)の内容をバイナリデータが必要なデータベースフィールドに保存しようとしています。

だから、問題は、この行です:

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

そして、それはあなたのイメージデータを含むバイト配列である

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

でなければなりません。

また、finprintの列がBINARYまたはVARBINARYのタイプであるとします。

+0

ありがとうございます。出来た。 finprintはvarbinary(max)です。それは正常に保存されましたが、フィンプリントフィールドは、個々のフィンガープリントごとに同じ値を保存しています。それはそうであると思われますか?どのように私はそれをユニークなplsにすることができますか? – Innoujata

+0

DBに格納されている画像データは、 'INSERT'クエリにパラメータとして渡される' @ img'変数の値に依存します。プログラムにバグがある可能性が最も高いです。 'ImageToByte2'メソッドをデバッグし、クエリが実行される前に' @ img'の内容を確認してください。 – Alex

+0

私はそれをデバッグし、 "add watch"と実行前の値をnullにしました。配列の個々の内容をチェックします。彼らはまだ同じです。何が間違っている可能性があります? – 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); show error underlining imageToByte2名前 'ImageToByte2'は現在のコンテキストに存在しませんどのように修正しますか – Innoujata

+0

コードを編集しました。括弧が私のコードに間違って配置されました。今すぐ試してください –

関連する問題