1

写真を撮って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();
    }

やっと壁に頭をぶつけるのをやめることができます。:)

4

1 に答える 1

1

このようなものを使用する必要があります。

//--- バッファ内のデータを読み取り、ms2 に書き込む ---

メモリストリーム ms2 = 新しいメモリストリーム();

ms2.Write(b, 0, b.長さ);

//---PictureBox コントロールに読み込む---

pictureBox2.Image = 新しいビットマップ (ms2);

于 2012-04-16T23:16:47.143 に答える