写真を撮ってwcfサービスに送信するWindowsPhoneアプリがあり、データベースに送信して、別のアプリ(Windowsフォームアプリ)がデータベースをチェックして画像を取得できるようにします。
データをバイト配列としてデータベースに追加していますが、値を確認すると、すべて同じ数値を示していますが、データがそこにあるため、機能しているようです。
ただし、そのデータを画像に変換しようとすると、パラメータが無効であるという例外がスローされます。私はこれを行う方法を探しましたが、私が見つけたもの(ここでも)は私がしていることを正確に示しています。だから私は何が悪いのかわかりません。
これがWindowsPhoneの私のコードです:
if (e.TaskResult == TaskResult.OK)
{
var bitImage = new BitmapImage();
bitImage.SetSource(e.ChosenPhoto);
//image is a Image Control in the form
ImageServiceClient client = new ImageServiceClient();
byte[] array;
using(var stream = new MemoryStream())
{
var btmMap = new WriteableBitmap(bitImage.PixelWidth, bitImage.PixelHeight);
// write an image into the stream
btmMap.SaveJpeg(stream, bitImage.PixelWidth, bitImage.PixelHeight, 0, 100);
array = stream.ToArray();
}
client.AddImageAsync(array);
}
最後の行は、次のようなwcfサービスのaddメソッドを呼び出します。
public void AddImage(byte[] array)
{
var con =
new MySqlConnection(
"server=instance11297.db.xeround.com;User Id=Admin;Password=nomoredrama2010;port=7692;database=capstone");
con.Open();
string h = array.Aggregate(h, (current, b) => current + b);
string text = "INSERT INTO images VALUES (''," + h + ")";
Console.WriteLine(text);
var command = new MySqlCommand(text, con);
var result = command.ExecuteReader();
result.Close();
}
渡された配列を直接使用するか、テキストに変換するかは問題ではないことに注意してください。どちらもデータベースに同じように表示されます。
そして最後に、これがすべてを送信しているアプリでは、私はこれを持っています:
var con =
new MySqlConnection(
"server=instance11297.db.xeround.com;User Id=Admin;Password=nomoredrama2010;port=7692;database=capstone");
con.Open();
string h = "";
string text = "select Image from images where ImageId=4";
var command = new MySqlCommand(text, con);
var dr = command.ExecuteReader();
var g = new byte[] {};
if(dr.Read())
g = (byte[])dr[0];
dr.Close();
var image = Image.FromStream(new MemoryStream(g));
pictureBox1.Image = image;
ただし、常に「var image = Image.FromStream(new MemoryStream(g));」で中断します。パラメータが無効であると言っています。
画像を取得すると大きな配列があることがわかりましたが、データベース内の配列は65バイトで、すべて57と表示されています。
画像の配列を完全に無視して、57バイトのうち65バイトに置き換えるのはなぜですか?
私は何が間違っているのですか?
** * ** * ** * ******編集**** ** * ** * ** * ** * ** * ** * ** * **** _ _ _ _
wcfアプリでデバッガーを有効にした後、ようやく何が問題だったのかがわかりました。 http://msdn.microsoft.com/en-us/library/ff649234.aspx(知らない人向け)
私もここを見ました:http://www.codeproject.com/Articles/9686/Save-An-Image-Into-SQL-Server-2000-Database
「あなたのSQLが間違っています」タイプのエラーをスローし、値を文字列に入れる代わりにaddingメソッドを使用するようにSQLステートメントを変更した理由を確認します。
それは最終的にそれを修正しました。nayoneの場合、動作するコードは次のようになります。他の人はこの問題に遭遇します。
public void AddImage(byte[] array)
{
var con =
new MySqlConnection("server=instance11297.db.xeround.com;User Id=Admin;Password=nomoredrama2010;port=7692;database=capstone");
con.Open();
string text = "INSERT INTO images (ImageId, Image) VALUES ('',@bytes)";
var command = new MySqlCommand(text, con);
command.Parameters.AddWithValue("@bytes", array);
command.ExecuteNonQuery();
con.Close();
}
やっと壁に頭をぶつけるのをやめることができます。:)