C# 从图像列可能为空的数据库加载picturebox图像
这是从数据库中加载图像并在图片框中显示的代码。问题是,若一行中并没有pic,它将遇到一个错误,但我在数据库中将其标记为allownulls image列C# 从图像列可能为空的数据库加载picturebox图像,c#,sql-server,C#,Sql Server,这是从数据库中加载图像并在图片框中显示的代码。问题是,若一行中并没有pic,它将遇到一个错误,但我在数据库中将其标记为allownulls image列 private void button1_Click(object sender, EventArgs e) { sql = new SqlConnection(@"Data Source=PC-PC\PC;Initial Catalog=Test;Integrated Security=True"); cmd = new Sq
private void button1_Click(object sender, EventArgs e)
{
sql = new SqlConnection(@"Data Source=PC-PC\PC;Initial Catalog=Test;Integrated Security=True");
cmd = new SqlCommand();
cmd.Connection = sql;
cmd.CommandText = ("select Image from Entry where EntryID =@EntryID");
cmd.Parameters.AddWithValue("@EntryID", Convert.ToInt32(textBox1.Text));
var da = new SqlDataAdapter(cmd);
var ds = new DataSet();
da.Fill(ds, "Images");
int count = ds.Tables["Images"].Rows.Count;
if (count > 0)
{
var data = (Byte[])(ds.Tables["Images"].Rows[count - 1]["Image"]);
var stream = new MemoryStream(data);
pictureBox1.Image= Image.FromStream(sream);
}
}
您应该检查
DbNull.Value
这应该可以做到:
if (count > 0)
{
if (ds.Tables["Images"].Rows[count - 1]["Image"] != DbNull.Value){
var data = (Byte[])(ds.Tables["Images"].Rows[count - 1]["Image"]);
(MemoryStreamstream = new MemoryStream(data)
pictureBox1.Image= Image.FromStream(sream);
}
}
您将列id DB标记为接受null值,以便DB处理它,但您也需要在应用程序中处理null(您不能强制转换DbNull值)
提示
当使用任何类型的
流时,您应该使用using
语句在使用后处理流。您应该检查DbNull.Value
这应该可以做到:
if (count > 0)
{
if (ds.Tables["Images"].Rows[count - 1]["Image"] != DbNull.Value){
var data = (Byte[])(ds.Tables["Images"].Rows[count - 1]["Image"]);
(MemoryStreamstream = new MemoryStream(data)
pictureBox1.Image= Image.FromStream(sream);
}
}
您将列id DB标记为接受null值,以便DB处理它,但您也需要在应用程序中处理null(您不能强制转换DbNull值)
提示
使用任何类型的流时
都应该使用using
语句在使用后处理流。只需检查即可
if(ds.Tables["Images"].Rows[count - 1]["Image"]!=DbNull.Value)
{
//you code of execution
}
else
{
//display default image
}
检查一下
if(ds.Tables["Images"].Rows[count - 1]["Image"]!=DbNull.Value)
{
//you code of execution
}
else
{
//display default image
}
仅供参考,您需要学习使用块。这将确保及时处理对象,即使引发异常:
private void button1_Click(object sender, EventArgs e)
{
var ds = new DataSet();
using (
var sql =
new SqlConnection(
@"Data Source=PC-PC\PC;Initial Catalog=Test;Integrated Security=True")
)
{
using (
var cmd = new SqlCommand
{
Connection = sql,
CommandText =
"select Image from Entry where EntryID = @EntryID"
})
{
cmd.Parameters.AddWithValue(
"@EntryID",
Convert.ToInt32(textBox1.Text));
using (var da = new SqlDataAdapter(cmd))
{
da.Fill(ds, "Images");
}
}
}
var imagesTable = ds.Tables["Images"];
var imagesRows = imagesTable.Rows;
var count = imagesRows.Count;
if (count <= 0)
return;
var imageColumnValue =
imagesRows[count - 1]["Image"];
if (imageColumnValue == DBNull.Value)
return;
var data = (Byte[]) imageColumnValue;
using (var stream = new MemoryStream(data))
{
pictureBox1.Image = Image.FromStream(stream);
}
}
private void按钮1\u单击(对象发送者,事件参数e)
{
var ds=新数据集();
使用(
var-sql=
新SqlConnection(
@“数据源=PC-PC\PC;初始目录=测试;集成安全性=真”)
)
{
使用(
var cmd=new SqlCommand
{
连接=sql,
命令文本=
“从EntryID=@EntryID的条目中选择图像”
})
{
cmd.Parameters.AddWithValue(
“@EntryID”,
转换为32(textBox1.Text));
使用(var da=new-SqlDataAdapter(cmd))
{
da.填充(ds,“图像”);
}
}
}
var imagesTable=ds.Tables[“Images”];
var imagesRows=imagesTable.Rows;
var count=imagesRows.count;
如果(countFYI),您需要学习使用块。这将确保及时处理对象,即使引发异常:
private void button1_Click(object sender, EventArgs e)
{
var ds = new DataSet();
using (
var sql =
new SqlConnection(
@"Data Source=PC-PC\PC;Initial Catalog=Test;Integrated Security=True")
)
{
using (
var cmd = new SqlCommand
{
Connection = sql,
CommandText =
"select Image from Entry where EntryID = @EntryID"
})
{
cmd.Parameters.AddWithValue(
"@EntryID",
Convert.ToInt32(textBox1.Text));
using (var da = new SqlDataAdapter(cmd))
{
da.Fill(ds, "Images");
}
}
}
var imagesTable = ds.Tables["Images"];
var imagesRows = imagesTable.Rows;
var count = imagesRows.Count;
if (count <= 0)
return;
var imageColumnValue =
imagesRows[count - 1]["Image"];
if (imageColumnValue == DBNull.Value)
return;
var data = (Byte[]) imageColumnValue;
using (var stream = new MemoryStream(data))
{
pictureBox1.Image = Image.FromStream(stream);
}
}
private void按钮1\u单击(对象发送者,事件参数e)
{
var ds=新数据集();
使用(
var-sql=
新SqlConnection(
@“数据源=PC-PC\PC;初始目录=测试;集成安全性=真”)
)
{
使用(
var cmd=new SqlCommand
{
连接=sql,
命令文本=
“从EntryID=@EntryID的条目中选择图像”
})
{
cmd.Parameters.AddWithValue(
“@EntryID”,
转换为32(textBox1.Text));
使用(var da=new-SqlDataAdapter(cmd))
{
da.填充(ds,“图像”);
}
}
}
var imagesTable=ds.Tables[“Images”];
var imagesRows=imagesTable.Rows;
var count=imagesRows.count;
如果(count是sream
一个输入错误,或者您有两个不同的流(sream
&var-stream…
)?无法将'system.dbnull'类型的对象强制转换为'system.byte[]类型。@aliprogrammer:这个异常是一个很大的提示。sream
是一个输入错误,还是您有两个不同的流(sream
&var stream…
)?无法将“system.dbnull”类型的对象强制转换为“system.byte[]”类型@aliprogrammer:该异常是一个非常大的提示。