2016-05-25 17 views
0

ユーザーがイメージを選択して後でSQLサーバーテーブルにアップロードできるアプリケーションを構築しようとしています。アップロードされたビットマップをバイト配列に変換してSQL Serverに格納

問題は、格納されたデータが不完全であるように見えることです。私はそれをオンラインコンバータ(すなわちhttp://www.lokowebdesign.com/imagetobinary/)に入れようとしましたが、認識された形式ではないことを示すエラーを受け取ります。

それがテーブルに格納されているように、データは次のようになります。ここでは

0xFFD8FFE000104A46494600010201006000600000FFEE000E41646F626500640000000001FFE10DDE4578696600004D4D002A000000080006013200020000001400000056013B00020000000B0000006A47460003000000010005000047490003000000010058000082980002000000160000007687690004000000010000008C 

は、いくつかの関連するコードスニペットです:

//テーブルの定義、グリッド

DataTable grid = new DataTable("Grid"); 
     grid.Columns.Add("ID", typeof(int)); 
     grid.Columns.Add("Description", typeof(String)); 
     grid.Columns.Add("Points", typeof(int)); 
     grid.Columns.Add("Score", typeof(List<int>)); 
     grid.Columns.Add("Current", typeof(int)); 
     grid.Columns.Add("Comments", typeof(List<String>)); 
     grid.Columns.Add("SelectedComment", typeof(int)); 
     grid.Columns.Add("SelectedCommentText", typeof(String)); 
     grid.Columns.Add("Category", typeof(int)); 
     grid.Columns.Add("SelectedScore", typeof(int)); 
     grid.Columns.Add("Image", typeof(byte[])); 

//レポート_詳細テーブル

insert = new SqlCommand("INSERT into dbo.report_details (reportID, itemID, points, comments, image) " + " VALUES (@reportID, @itemID, @points, @comments, @image)", con); 
      insert.Parameters.Add("@reportID", SqlDbType.Char, 5, "reportID"); 
      insert.Parameters.Add("@itemID", SqlDbType.Int, 5, "itemID"); 
      insert.Parameters.Add("@points", SqlDbType.Int, 4, "points"); 
      insert.Parameters.Add("@comments", SqlDbType.Text, 150, "comments"); 
      insert.Parameters.Add("@image", SqlDbType.Image, (int)Math.Pow(2, 20), "image"); 
ユーザが画像

private async void uploadImage(Object sender, RoutedEventArgs e) 
    { 
     Bitmap photo = null; 

     // this is for tablets 

try 
     { 
      capturePhoto capture = new capturePhoto(); 
      photo = await capture.getImage(); 


     } 
     catch (Exception ex) 
     { 

// this is what I am actually using for testing 

      OpenFileDialog fileDialog = new OpenFileDialog(); 

      if (fileDialog.ShowDialog() == true) 
      { 
       photo = (Bitmap)Bitmap.FromStream(fileDialog.OpenFile()); 
      } 

     } 

     DataRowView row = (DataRowView)itemGrid.CurrentItem; 
     ImageConverter converter = new ImageConverter(); 
     byte[] photoBytes = (byte[])converter.ConvertTo(photo, typeof(byte[])); ; 
     row["Image"] = photoBytes; 


    } 

    } 

を添付するボタンをクリックしたときに、私は本当に私が提供を望むと呼ばDataGridのバインドテーブルに基づいて

(データベース内)//更新report_details、グリッド

foreach (DataRow row in ds.Tables["Grid"].Rows) 
     { 

      DataRow reportDetailsRow = ds.Tables["Details"].NewRow(); 

      reportDetailsRow["reportID"] = id; 
      reportDetailsRow["itemID"] = row["ID"]; 
      reportDetailsRow["points"] = row["Current"]; 

      List<String> comments = (List<String>)row["Comments"]; 


      reportDetailsRow["comments"] = row["SelectedCommentText"]; 
      if (row["Image"] != null) 
      { 


       reportDetailsRow["image"] = row["Image"]; 
      } 

      ds.Tables["Details"].Rows.Add(reportDetailsRow); 

     } 

     detailsAdapter.Update(ds, "Details"); 
     tran.Commit(); 


    } 

//詳細は十分ですが、必要に応じてより多くを供給することができます。これは私にとって非常に厄介な問題ですので、私は本当にすべての指導を感謝します。本当にありがとう!

編集:私は、次を試してみましたが、同じ問題が残っている:

private async void uploadImage(Object sender, RoutedEventArgs e) 
     { 
      Bitmap photo = null; 

      try 
      { 
       capturePhoto capture = new capturePhoto(); 
       photo = await capture.getImage(); 


      } 
      catch (Exception ex) 
      { 
       OpenFileDialog fileDialog = new OpenFileDialog(); 

       if (fileDialog.ShowDialog() == true) 
       { 
        photo = (Bitmap)Bitmap.FromStream(fileDialog.OpenFile()); 
       } 

      } 

      DataRowView row = (DataRowView)itemGrid.CurrentItem; 
      // ImageConverter converter = new ImageConverter(); 
      // byte[] photoBytes = (byte[])converter.ConvertTo(photo, typeof(byte[])); ; 
      MemoryStream mem = new MemoryStream(); 
      using (mem) 
      { 
       photo.Save(mem, System.Drawing.Imaging.ImageFormat.Jpeg); 
       row["Image"] = mem.ToArray(); 
      } 
      // row["Image"] = photoBytes; 


     } 

     } 
+1

は、[このを見てみましょうMSDN](https://msdn.microsoft.com/en-us/library/4f5s1we0(v = vs.110).aspx)を参照してください。あなたの問題がどこにあるかを知るのに役立ちます – Hill

答えて

1

まず、this MSDN articleによると:

ntext型

テキスト、および画像データ型になりますMicrosoft SQL Serverの将来のバージョンで削除される予定です。新しい開発作業でこれらのデータ型を使用しないようにし、現在使用しているアプリケーションを変更することを計画します。代わりに、nvarchar(max)、varchar(max)、およびvarbinary(max)を使用してください。

私は画像の列の型といくつかの奇妙なフォーマットがあるかどうかわからないんだけど、あなたが投稿したサンプルデータは、それが無効な長さだということを除いて、ほとんど base64です。あなたがイメージを保存するためにあなたの編集に投稿されたコードので、この理論をテストするために、私には正しいようあなたがBASE64にあなたの画像を変換し、あなたがDBに見るものと比較できます。

var data = mem.ToArray(); 
var base64 = Convert.ToBase64(data); 
関連する問題