读书人

从数据库将图片显示到picturebox上。有

发布时间: 2011-12-30 23:30:45 作者: rapoo

从数据库将图片显示到picturebox上。有一个异常,小弟真的没招了。高手进!在线等!!
这是小弟的图片插入程序:
SqlCommand Command = new SqlCommand(@ "INSERT INTO TaskScan (Task_serialNumber,picture1,picture2,picture3,picture4,picture5,
picture6,picture7,picture8,picture9,picture10)
VALUES (@Task_serialNumber,@picture1,@picture2,@picture3,@picture4,@picture5,
@picture6,@picture7,@picture8,@picture9,@picture10) ", connection, tran);
Command.Parameters.Add(new SqlParameter( "@Task_serialNumber ", SqlDbType.VarChar, 50));

Command.Parameters.Add(new SqlParameter( "@picture1 ", SqlDbType.Image,16));
Command.Parameters.Add(new SqlParameter( "@picture2 ", SqlDbType.Image, 16));
Command.Parameters.Add(new SqlParameter( "@picture3 ", SqlDbType.Image, 16));
Command.Parameters.Add(new SqlParameter( "@picture4 ", SqlDbType.Image, 16));
Command.Parameters.Add(new SqlParameter( "@picture5 ", SqlDbType.Image, 16));

Command.Parameters.Add(new SqlParameter( "@picture6 ", SqlDbType.Image, 16));
Command.Parameters.Add(new SqlParameter( "@picture7 ", SqlDbType.Image, 16));
Command.Parameters.Add(new SqlParameter( "@picture8 ", SqlDbType.Image, 16));
Command.Parameters.Add(new SqlParameter( "@picture9 ", SqlDbType.Image, 16));
Command.Parameters.Add(new SqlParameter( "@picture10 ", SqlDbType.Image, 16));

bool bSucceed = false;
try
{
Command.Parameters[ "@Task_serialNumber "].Value = GetValue(data.Task_serialNumber);

Command.Parameters[ "@picture1 "].Value = GetValue(data.picture1);
Command.Parameters[ "@picture2 "].Value = GetValue(data.picture2);
Command.Parameters[ "@picture3 "].Value = GetValue(data.picture3);


Command.Parameters[ "@picture4 "].Value = GetValue(data.picture4);
Command.Parameters[ "@picture5 "].Value = GetValue(data.picture5);

Command.Parameters[ "@picture6 "].Value = GetValue(data.picture6);
Command.Parameters[ "@picture7 "].Value = GetValue(data.picture7);
Command.Parameters[ "@picture8 "].Value = GetValue(data.picture8);
Command.Parameters[ "@picture9 "].Value = GetValue(data.picture9);
Command.Parameters[ "@picture10 "].Value = GetValue(data.picture10);

if (Command.ExecuteNonQuery() == 0)
{
throw new Exception( "插入数据失败! ");
}
tran.Commit();
bSucceed = true;
}
catch (SqlException ex)
{
if (ex.Number == 2627)
{
throw new Exception( "数据库中已经存在相同记录, 无法继续保存! ");
}
else
{
throw ex;


}
}
finally
{
if (!bSucceed)
{
tran.Rollback();
}
connection.Close();
}
下满是小弟的图片显示程序:
DataRowView dv = dt.DefaultView[0];
Byte[] p1 = new Byte[0], p2 = new Byte[0], p3 = new Byte[0], p4 = new Byte[0], p5 = new Byte[0],
p6 = new Byte[0], p7 = new Byte[0], p8 = new Byte[0], p9 = new Byte[0], p10 = new Byte[0];

///在写入图片时一定要写入图片大小.
p1 = (Byte[])(dv.Row[ "picture1 "]); ///这里是错误提示处
MemoryStream stmBLOBData1 = new MemoryStream(p1);
pictureBox1.Image = Image.FromStream(stmBLOBData1);
p2 = (Byte[])(dv.Row[ "picture2 "]);
MemoryStream stmBLOBData2 = new MemoryStream(p2);
pictureBox2.Image = Image.FromStream(stmBLOBData2);
p3 = (Byte[])(dv.Row[ "picture3 "]);
MemoryStream stmBLOBData3 = new MemoryStream(p3);
pictureBox3.Image = Image.FromStream(stmBLOBData3);


p4 = (Byte[])(dv.Row[ "picture4 "]);
MemoryStream stmBLOBData4 = new MemoryStream(p4);
pictureBox4.Image = Image.FromStream(stmBLOBData4);
p5 = (Byte[])(dv.Row[ "picture5 "]);
MemoryStream stmBLOBData5 = new MemoryStream(p5);
pictureBox5.Image = Image.FromStream(stmBLOBData5);
p6 = (Byte[])(dv.Row[ "picture6 "]);
MemoryStream stmBLOBData6 = new MemoryStream(p6);
pictureBox6.Image = Image.FromStream(stmBLOBData6);
p7 = (Byte[])(dv.Row[ "picture7 "]);
MemoryStream stmBLOBData7 = new MemoryStream(p7);
pictureBox7.Image = Image.FromStream(stmBLOBData7);
p8 = (Byte[])(dv.Row[ "picture8 "]);
MemoryStream stmBLOBData8 = new MemoryStream(p8);
pictureBox8.Image = Image.FromStream(stmBLOBData8);
p9 = (Byte[])(dv.Row[ "picture9 "]);
MemoryStream stmBLOBData9 = new MemoryStream(p9);
pictureBox9.Image = Image.FromStream(stmBLOBData9);
p10 = (Byte[])(dv.Row[ "picture10 "]);
MemoryStream stmBLOBData10 = new MemoryStream(p10);
pictureBox10.Image = Image.FromStream(stmBLOBData10);


这些代码是参考微软的。
可是出现以下错误:
无法将类型为“System.DBNull”的对象强制转换为类型“System.Byte[]”。
小弟应该如何改。拜托各位了!!!

[解决办法]
try
{
this.picWP.Image = Image.FromStream(new System.IO.MemoryStream(GetBin( "select 图片 from 物品表 where cid= ' " + cid + " ' ")));
}
catch
{
this.picWP.Image = null;
}


/// <summary>
///从数据库得到图片数据
/// </summary>
/// <param name= "Sql "> </param>
/// <returns> </returns>
public static byte[] GetBin(string Sql)
{
try
{
DataSet set1 = new DataSet();
//DBbind改用adapter.fill填。
set1 = DBbind(Sql);
if (set1.Tables[0].Rows.Count > 0)
{
byte[] buffer1 = (byte[])set1.Tables[0].Rows[0][0];
return buffer1;
}
return null;
}
catch
{
return null;
}
}


[解决办法]
object obj = dv.Row[ "picture1 "];
if (obj is byte[])
{
p1 = (Byte[])obj; ///这里是错误提示处
}

....

[解决办法]
if(Convert.IsDBNull(dv.Row[ "picture1 "]))
{
//
p1 = (Byte[])(dv.Row[ "picture1 "]);
}
[解决办法]
Command.Parameters.Add(new SqlParameter( "@picture1 ", SqlDbType.Image));//注意不要加长度

读书人网 >C#

热点推荐