几周来我一直在研究这个应用程序。用户的希望之一是保存并显示图像。因此,我为用户创造了插入屏幕快照的机会。但是,当我第一次将图像发送到数据库并再次检索它们时,就无法再将它们解码为图像。 (错误:该参数无效。)因此,我检查了该代码还是其他代码。我发现,将图像转换为byte []之后,我可以还原并显示该图像而没有任何麻烦。因此,问题出在写入数据库和再次取回数据库之间。我查看了数据库,发现每个图像都以0x开头,即使没有图像要上传。我读到一些有关某些数据库的信息,可能会添加标头,所以我猜这就是问题所在。但是现在我需要知道如何摆脱该标头。而且,如果我放弃了该阅读器,是否仍可以仅使用GetValue()函数,还是真的需要使用GetBytes()?我之所以没有使用GetBytes的原因是,我需要在开始时分配一个长度,但是每个图像的长度都会变化。
有人能告诉我如何删除标头吗?我检查了前几个字节的值,希望如果我删除前两个字节,它们代表0x并且问题可以解决,但这显然不是这样的。之后,我尝试将图片上传到db并再次检索它,我注意到长度从566到1335。但是空白图片,尽管db表示其中包含0x,但具有byte []和长度为0。
对象bsk将发送到一部分代码,并将其写入数据库:
String command = "INSERT INTO " + db.getTabelbsk() + " VALUES ('" + bsk.getEmailapplicant() + "','" + bsk.getCreation().ToString("MM-dd-yyyy") + "','" + bsk.getCrmQuoteNumber()
+ "','" + bsk.getProjectStage() + "','" + bsk.getRefArticleId() + "','" + bsk.getClassification() + "','" + bsk.getDescription() + "','" +
bsk.getTrackingnumber() + "','" + bsk.getLastModified().ToString("MM-dd-yyyy") + "','" + bsk.getStatus() + "','" + bit + "','" + bsk.getScr() + "','" +
bsk.getBskMail() + "','" + bsk.getEnd12Mail() + "','" + bsk.getEnd3elecMail() + "','" + bsk.getEnd3swMail() + "','" + bsk.getPrmMail() + "','" +
bsk.getRejectMail() + "','" + bsk.getRejectReason() + "','" + bsk.getCommercialDescription() + "','" + bsk.getTechnicalDescription() + "','" +
bsk.getValue() + "','" + bsk.getEndhours() + "', '" + bsk.getLockedBy() + "', '";
command = addImages(command, bsk.getSrcSs()) + "', '" + addImages(command, bsk.getTechnicalDescriptionSs()) + "');";
sqlcommand(con, command);
private String addImages(String command, byte[] ba)
{ //Adds every byte to the command String
foreach (byte b in ba)
{
command += b;
}
return command;
}
public SqlDataReader sqlcommand(SqlConnection con, String s)
{ //Executes the command
try
{
con.Close();
}
catch { }
SqlCommand cmd = new SqlCommand();
cmd.CommandType = System.Data.CommandType.Text;
cmd.CommandText = s;
cmd.Connection = con;
try
{
con.Open();
}
catch
{
}
SqlDataReader reader = cmd.ExecuteReader();
return reader;
}
这部分用于从数据库中检索数据:
public Bsk returnBsk(Database db, Bsk bsk, SqlConnection con)
{ //This will retrieve the data from the database
String table = db.getTabelbsk();
int trackingnumber = bsk.getTrackingnumber();
String command = "SELECT * FROM " + table + " WHERE trackingNumber = " + trackingnumber;
SqlDataReader reader = sqlcommand(con, command);
reader.Read(); //Filling the object with data
bsk.setEmailapplicant(reader.GetString(0));
bsk.setCreation(reader.GetDateTime(1));
bsk.setCrmQuoteNumber(reader.GetString(2));
bsk.setProjectStage(reader.GetString(3));
bsk.setRefArticleId(reader.GetString(4));
bsk.setClassification(reader.GetString(5));
bsk.setDescription(reader.GetString(6));
bsk.setLastModified(reader.GetDateTime(8));
bsk.setStatus((Bsk.Status)Enum.Parse(typeof(Bsk.Status), reader.GetString(9)));
if (reader.GetBoolean(10) == false)
{
bsk.setComplexity((Bsk.Complexity.Simple));
}
else if (reader.GetBoolean(10) == true)
{
bsk.setComplexity((Bsk.Complexity.Complex));
}
bsk.setScr(reader.GetString(11));
bsk.setBskMail(reader.GetString(12));
bsk.setEnd12Mail(reader.GetString(13));
bsk.setEnd3elecMail(reader.GetString(14));
bsk.setEnd3swMail(reader.GetString(15));
bsk.setPrmMail(reader.GetString(16));
bsk.setRejectMail(reader.GetString(17));
bsk.setRejectReason(reader.GetString(18));
bsk.setCommercialDescription(reader.GetString(19));
bsk.setTechnicalDescription(reader.GetString(20));
bsk.setValue(reader.GetInt32(21));
bsk.setEndhours(reader.GetInt32(22));
bsk.setLockedBy(reader.GetString(23));
if (!Convert.IsDBNull(reader.GetValue(24)))
{
bsk.setSrcSs((byte[])reader.GetValue(24));
}
if (!Convert.IsDBNull(reader.GetValue(25)))
{
bsk.setTechnicalDescriptionSs((byte[])reader.GetValue(25));
}
reader.Close();
con.Close();
return bsk;
}
图像到字节[]:
Image imageSrc = pb_Src.Image;
byte[] arrSrc;
ImageConverter converterSrc = new ImageConverter();
arrSrc = (byte[])converterSrc.ConvertTo(imageSrc, typeof(byte[]));
bsk.setSrcSs(arrSrc);
byte []到图像:
byte[] arrSrc = bsk.getSrcSs();
MemoryStream ms = new MemoryStream(arrSrc);
pb_Src.Image = Image.FromStream(ms); <-- Error message appears here
PS: 我知道How to display image from database in c#是相关的。但是,这个问题从未得到解答。