我有一个Windows手机应用程序拍照并将其发送到wcf服务,该服务将其发送到数据库,以便另一个应用程序(Windows窗体应用程序)可以检查数据库并获取图像 .
它将数据作为字节数组添加到数据库中,但是当我检查值时,它们都说相同的数字,但似乎它起作用,因为它们的数据存在 .
当我尝试将该数据转换为图像时,它会抛出一个异常,说该参数无效 . 我已经搜索了如何做到这一点,但我发现(甚至在这里)确切地说我正在做什么 . 所以我不确定是什么问题 .
这是我的Windows手机代码:
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错误”类型错误并更改了我的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();
}
我终于可以不停地靠在墙上 . :)
1 回答
你应该使用这样的东西 .
// ---读取缓冲区中的数据并写入ms2 ---
MemoryStream ms2 = new MemoryStream();
ms2.Write(b,0,b.Lenght);
// ---将它加载到PictureBox控件中---
pictureBox2.Image = new Bitmap(ms2);