我创建了一个从数据库中读取的方法,数据库有一个存储图像的blob字段。 此方法用于读取图像以及每个其他字段。 当我运行我的应用程序时它工作,表单显示所有细节,但如果我关闭表单并再次重新打开它,我最终得到此错误。
IO异常未处理
mscorlib.dll中出现未处理的“System.IO.IOException”类型异常
其他信息:进程无法访问文件'C:\ Users \ MyName \ Documents \ Visual Studio 2013 \ Projects \ MyApp \ MyApp \ bin \ Debug \ pic0jpg',因为它正由另一个进程使用。“
我已经尝试将filestream对象放在using语句和其他解决方案中,但错误仍然存在。 任何帮助将不胜感激,谢谢。
public void loadPlane()
{
//convert picture to jpg and load other details
MySqlDataAdapter sqladapt;
DataSet dataSet;
DatabaseConnector dbcon = new DatabaseConnector();
dbcon.OpenConnection();
sqladapt = new MySqlDataAdapter();
sqladapt.SelectCommand = dbcon.InitSqlCommand("SELECT * FROM plane");
dataSet = new DataSet("dst");
sqladapt.Fill(dataSet);
dbcon.CloseConnection();
DataTable tableData = dataSet.Tables[0];
//use from iplane class
IPlane.countPlane = tableData.Rows.Count;
for (int i = 0; i < IPlane.countPlane; i++)
{
IPlane.planeObj[i] = new NormalPlane();
DataRow drow = tableData.Rows[i];
string plName = "pic" + Convert.ToString(i);
FileStream FSNew = new FileStream(plName+"jpg",FileMode.Create);
byte[] blob = (byte[])drow[5];
FSNew.Write(blob,0,blob.Length);
FSNew.Close();
FSNew = null;
IPlane.planeObj[i].PlaneImage=(Image.FromFile(plName + "jpg"));
IPlane.planeObj[i].ModelNumber = drow[0].ToString();
IPlane.planeObj[i].EngineType = drow[1].ToString();
IPlane.planeObj[i].FlySpeed = Convert.ToInt32( drow[2]);
IPlane.planeObj[i].SpecialFeature = drow[3].ToString();
IPlane.planeObj[i].Price = Convert.ToDouble( drow[4]);
IPlane.planeObj[i].EconSeats = Convert.ToInt32(drow[6]);
IPlane.planeObj[i].BussSeats = Convert.ToInt32(drow[7]);
IPlane.planeObj[i].FirstSeats = Convert.ToInt32(drow[8]);
//drow 5 is the image
}
}
答案 0 :(得分:2)
关闭后你真的应该处理你的DatabaseConnector。最好的做法是使用Using Statement:
using (DatabaseConnector dbcon = new DatabaseConnector)
{
// Code that uses connection.
}
或者,在调用.CloseConnection()
之后调用dbcon.Dispose()这将确保释放DatabaseConnection使用的所有资源。
答案 1 :(得分:2)
这是主要问题:
IPlane.planeObj[i].PlaneImage=(Image.FromFile(plName + "jpg"));
您正在打开图像并将其打开。
你还有两种方法:
IPlane.planeObj[i].PlaneImage
,并在需要时加载文件。 (我不会理解为什么你在db上将图像保存为blob然后再创建文件)如果您没有很多图像,或者它们没有那么大或者您没有记忆问题,我认为第一个更好。
顺便说一下,你的代码有很多资源没有处理(连接,流等等)
答案 2 :(得分:2)
正如@giammin所说,你正在打开一个文件,但从未关闭它。该代码还会创建大量应该处理的资源。
此外,您根本不需要保存文件,除非您想在以后使用它。您可以使用Image.FromStream从流中创建Image对象。您可以将缓冲区包装在MemoryStream中并将其传递给Image.FromStream,例如:
using(var stream=new MemoryStream(drow[5]))
{
var image=Image.FromStream(stream);
Plane.planeObj[i].PlaneImage = image;
}