从数据库读取图片出错,帮帮忙(sqlserver2000)

猿敲月下码 2008-11-27 09:38:57
下面是我的代码:
   ds=c.Show_photo("1");//这句是将图片放在dataset中
byte[] pic =(byte[])ds.Tables[0].Rows[0].ItemArray[0];//取出图片并转换为byte[]数组
ShowData_Image(pic, pictureBox1);//调用方法,方法内容看下面



public void ShowData_Image(byte[] DI, PictureBox Ima) //方法在这里,显示数据库图片
{
byte[] buffer = DI;//这里就是上面的pic
MemoryStream ms = new MemoryStream(buffer);

Ima.Image = Image.FromStream(ms);//????运行到这里出错了,说是参数无效
}


数据库里图片类型是image的,我用分析器查了下有数据 是这样的形式:0xFFD8FFE000104A464946000101010000
应该是对的吧

这个怎么解决,大家帮帮忙,图片已经存进去了,没有错的,关键是取出的问题
...全文
184 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
猿敲月下码 2008-11-27
  • 打赏
  • 举报
回复
沉的好快
猿敲月下码 2008-11-27
  • 打赏
  • 举报
回复
数组里面的数据读出来是这个样子:255216255224016747073700111096
claymore1114 2008-11-27
  • 打赏
  • 举报
回复
先直接读 看行不行
SqlDataReader myDataReader= myCommand.ExecuteReader(CommandBehavior.CloseConnection);
Response.Clear();
Response.BinaryWrite((byte[])myDataReader["ImageData"]); //ImageData列名
alex_zs 2008-11-27
  • 打赏
  • 举报
回复
mark
huweiwo 2008-11-27
  • 打赏
  • 举报
回复
占座
猿敲月下码 2008-11-27
  • 打赏
  • 举报
回复
浮上去
skison 2008-11-27
  • 打赏
  • 举报
回复
最简单的办法 ,你先把buffer存到本地。再指定pictureBox的路径

猿敲月下码 2008-11-27
  • 打赏
  • 举报
回复
还是不行,弄不好午饭也不吃了
skison 2008-11-27
  • 打赏
  • 举报
回复
LZ数据,以及取数据的方式都是对的。
你可以测试下把那个buffer存到本地,图片是可以正常显示的。

问题在于Ima.Image = 不能这样指定。从流生成图,你没让他呈现出来。
PictureBox可以有2种方式指定Image:
1、pictureBox1.Image = Image.FromFile( url );//先存个临时文件,再指定。

2、如果非要是动态的,内存中的。先示例出一个Bitmap,再用Graphics用那个buffer画一个。

Bitmap bmp= new Bitmap(200, 100);
Graphics g= Graphics.FromImage(bmp);
g.DrawImage( image,Point );
pictureBox1.Image = bmp;




猿敲月下码 2008-11-27
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 dahai99007 的回复:]
你写进去的是什么格式的图片?
我试下.
[/Quote]

jpg的
猿敲月下码 2008-11-27
  • 打赏
  • 举报
回复
问题在这:
C# codepic = (byte[])ds.Tables[0].Rows[0].ItemArray[3];


通过一个数组来获取或设置此行的所有值!而不是,这行这列的值!
应该这样:
C# codepic=(byte[])ds.Tables[0].Rows[0]["图片列的列名"].ToString();

---------
都一样的吧,ds.Tables[0].Rows[0].ItemArray[0];这句就取出第0行,第0列的值
这跟 ds.Tables[0].Rows[0][0]应该是一样的

我只要读一张图片就行了

我试了你的方法还是参数错误
dahai99007 2008-11-27
  • 打赏
  • 举报
回复
你写进去的是什么格式的图片?
我试下.
猿敲月下码 2008-11-27
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wenyegood 的回复:]
byte[] pic =(byte[])ds.Tables[0].Rows[0].ItemArray[0];
这句应该就是byte[] pic =(byte[])ds.Tables[0].Rows[0][index];就行了
[/Quote]

这两句好像没什么区别...
dahai99007 2008-11-27
  • 打赏
  • 举报
回复
问题在这: 
C# codepic = (byte[])ds.Tables[0].Rows[0].ItemArray[3];


通过一个数组来获取或设置此行的所有值!而不是,这行这列的值!
应该这样:
C# codepic=(byte[])ds.Tables[0].Rows[0]["图片列的列名"].ToString();


ToString()的没这么写过,不知道行不行。
给你个例子参考下:

C# codeprivate void button1_Click(object sender, EventArgs e)
{

byte[] imagebytes = null;

//打开数所
SqlConnection con = new SqlConnection("server=(local);uid=sa;pwd=;database=db_05");
con.Open();
SqlCommand com = new SqlCommand("select top 1* from tb_01", con);
SqlDataReader dr = com.ExecuteReader();
while (dr.Read())
{
imagebytes = (byte[])dr.GetValue(1);
}
dr.Close();
com.Clone();
con.Close();
MemoryStream ms = new MemoryStream(imagebytes);
Bitmap bmpt = new Bitmap(ms);
pictureBox1.Image = bmpt;

}

参考下.

猿敲月下码 2008-11-27
  • 打赏
  • 举报
回复
2L还是不对:Bitmap bmp=new Bitmap(ms);//参数无效
dahai99007 2008-11-27
  • 打赏
  • 举报
回复
MemoryStream;
FromStream;
是不是这的问题呀?
2个流不是相同的流。
试下这样:
MemoryStream ms =new MemoryStream(buffer);
Bitmap bmp=new Bitmap(ms);
pictureBox.Image=bmp;
wenyegood 2008-11-27
  • 打赏
  • 举报
回复
byte[] pic =(byte[])ds.Tables[0].Rows[0].ItemArray[0];
这句应该就是byte[] pic =(byte[])ds.Tables[0].Rows[0][index];就行了
猿敲月下码 2008-11-27
  • 打赏
  • 举报
回复
可以了,问题找到了,不是这里的问题,而是我的一个方法写错了:
public string SaveImage(string id, byte[] p)//这个是将图片存进数据库的方法
{

DataBase db = new DataBase();//连接数据库

try
{
SqlParameter[] ps ={
db.MakeInParam("@id",SqlDbType.VarChar,5,id),
db.MakeInParam("@photo",SqlDbType.Binary,10000,p)//就是这里,本来这个10000的值是16,现在改10000就好了,原来是太小了不能显示
};
db.RunProc("Save_Image", ps);
return "0";
}
catch (Exception ee)
{
MessageBox.Show(ee.ToString());
return null;
}
finally
{
db.Close();
db = null;
}


总之是谢谢大家了
Chawind 2008-11-27
  • 打赏
  • 举报
回复
MemoryStream ms = new MemoryStream((byte[])ds.Tables["Carifo"].Rows[0]["Photo"]);

Image image=Image.FromStream(ms, true);
pictureBox1.Image = image;
这样就好了
楼上的也没错。。
dahai99007 2008-11-27
  • 打赏
  • 举报
回复
问题解决没有?
我这写了个程序,把图片存到数据库,然后显示在pictureBox,一点问题都没有!
System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection("server=.;uid=sa;pwd=sa;database=MyTestDB");
private void button1_Click(object sender, EventArgs e)
{
int rtnNum = 0;
openFileDialog1.Filter = "*.jpg|*.JPG|*.GIF|*.GIF|*.BMP|*.BMP";
if (openFileDialog1.ShowDialog()==DialogResult.OK)
{
string filePath = openFileDialog1.FileName;
System.IO.FileStream stream = new System.IO.FileStream(filePath, System.IO.FileMode.Open);
byte[] imagebytes = new byte[stream.Length];
System.IO.BinaryReader reader = new System.IO.BinaryReader(stream);
imagebytes = reader.ReadBytes(Convert.ToInt32(stream.Length));
if (conn.State==ConnectionState.Closed)
{
conn.Open();
}
System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand("insert into imagetable values(@image)",conn);
cmd.Parameters.Add("image", SqlDbType.Image);
cmd.Parameters["image"].Value = imagebytes;
rtnNum = cmd.ExecuteNonQuery();
if (rtnNum>0)
{
MessageBox.Show("Ok");
}
else
{
MessageBox.Show("Error");
}
conn.Close();
}
}

private void button2_Click(object sender, EventArgs e)
{
byte[] imagebytes = null;
if (conn.State==ConnectionState.Closed)
{
conn.Open();
}
System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand("select image from imagetable",conn);
System.Data.SqlClient.SqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
imagebytes = (byte[])reader.GetValue(0);
}
reader.Close();
conn.Close();
System.IO.MemoryStream ms = new System.IO.MemoryStream(imagebytes);
Bitmap bmp = new Bitmap(ms);
pictureBox1.Image = bmp;
}

参考下.

111,130

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧