如果我的pictureboxstupic包含图像,我在我的一个项目中有一个如下方法,它返回byte []。 虽然我想以这样的方式转换它,如果pictureboxstupic中没有图片,它应该返回string =“NULL”否则它应该返回bute []。 我怎么能这样做?
private byte[] GetPic()
{
using (var stream = new MemoryStream())
{
var bmp = new Bitmap(pictureboxstupic.Image);
bmp.Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg);
stream.Position = 0;
var data = new byte[stream.Length];
stream.Read(data, 0, data.Length);
return data;
}
}
注意: 我插入图像的列如下
CREATE TABLE [dbo].[Students]
([Photo] [image] NULL)
并且在我目前的情况下我将图像插入上面提到的列中,即Students.Photo就像这样
if (pictureboxstupic.Image == null)
{
cmd.Parameters.Add("@Photo", SqlDbType.VarChar).Value = "NULL";
}
else
{
cmd.Parameters.Add("@Photo", SqlDbType.Image).Value = GetPic();
}
答案 0 :(得分:4)
您可以随时返回对象并将其转换为您期望的类型 - 但这不是一个好主意。如果在调用方法之前检查pictureboxstupic是否为空,然后执行正确的逻辑(例如,指定“NULL”),那会更好。
您也可以对TryParse应用类似的语义 - 也就是说,如果pictureboxstupic不为空,您可以返回bool,并将字节数组作为out参数返回。
答案 1 :(得分:3)
@ empi的回答是正确的,我想扩展它:
方法和功能应该有一套严格定义的职责。对于GetPic
方法,可以获取图片的字节流。这应该是该方法中封装的逻辑程度。
显示单词" NULL"在某些错误框中,不是 GetPic
的责任。它负责任何人调用它并负责显示图像或错误消息。这就是为什么我认为GetPic
应该返回null
如果它是一个合理的条件来接收没有图像,或者如果它是一个真正的错误条件,甚至可能会抛出异常打破了程序流程。
在任何情况下,您不应做的是返回object
,可以是byte[]
或string
,因为这样会打败整个强类型环境的一个点,是以后引入错误的好方法。如果您必须返回byte[]
或string
,则可以按其他人的建议使用ref/out
参数,也可以创建一个名为ImageData
的新类,或者其他,它包含字节和错误消息,您可以使用它们来检索其中一个或另一个。
- 编辑
在澄清之后,我仍然坚持我的回答。你不应该这样做。数据库支持的NULL值不与字符串" NULL"相同。您应该确保列可以为空,并插入空值 - DBNull.Value
,而不是插入此字符串。您当前的代码将崩溃,因为Photo列无法处理VarChar值。
答案 2 :(得分:1)
返回object
而不是?然后使用is
关键字首先检查类型。
if(returnedType is string) //or use as and then check for NULL
{
}
else //type is byte[]
{
}
不确定您的用例以及它是否有效,但这可以是一个解决方案
答案 3 :(得分:1)
您可以通过三种解决方案来实现:
1。)使用对象作为返回类型
2。)使用'ref'和'out'参数说明符返回数组和make方法返回类型字符串以返回状态消息。
3。)对指针使用'unsafe'代码......
示例:
public string GetPic(out byte[] ret)
{
if (Image == null)
return "NULL";
//set ret's value as image bytes
return "ok";
}
答案 4 :(得分:0)
你可以这样做:
//call the method:
string str = ""; //variable that will be changed accordingly by returned value
byte[] image = GetPic();
if (image.Length == 0)
{
//do what ever you want, like string = "NULL":
str = "NULL";
}
//
//
private byte[] GetPic()
{
PictureBox pictureboxstupic = new PictureBox();
using (var stream = new MemoryStream())
{
var bmp = new Bitmap(pictureboxstupic.Image);
bmp.Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg);
stream.Position = 0;
var data = new byte[stream.Length];
stream.Read(data, 0, data.Length);
return data;
}
}
答案 5 :(得分:-1)
我这样解决了我的问题 方法:
private object GetPic()
{
if(pictureboxstupic.Image == null)
{
return null;
}
using (var stream = new MemoryStream())
{
var bmp = new Bitmap(pictureboxstupic.Image);
bmp.Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg);
stream.Position = 0;
var data = new byte[stream.Length];
stream.Read(data, 0, data.Length);
return data;
}
}
用法:
cmd.Parameters.Add("@Photo", SqlDbType.Image).Value = GetPic() ?? DBNull.Value;