2014-12-03 54 views
1

我創建了一個從我的數據庫中讀取數據的方法,該數據庫有一個存儲圖像的blob字段。 此方法用於讀取圖像以及其他所有字段。 當我運行我的應用程序它的工作原理和窗體顯示所有的細節,但如果我關閉窗體並重新打開它,我結束了這個錯誤。FileStream錯誤 - 進程無法訪問該文件...被另一個進程使用

IO例外是未處理

類型 'System.IO.IOException' 的未處理的異常出現在mscorlib.dll

附加信息:該方法不能訪問該文件「C:\用戶\ 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 
    } 
} 

回答

2

這是主要的問題:

IPlane.planeObj[i].PlaneImage=(Image.FromFile(plName + "jpg")); 

要打開的圖像,並離開它打開。

您有2路要走:

  • 與從團塊內存流創建圖像,而不是作爲一個文件
  • 創建圖像文件,並使用圖片的路徑爲你的財產IPlane.planeObj[i].PlaneImage並在需要時加載文件。 (我不明白爲什麼你將圖像保存爲分貝數據塊,然後創建該文件)

如果你沒有很多圖像,或者它們不是很大,或者沒有內存問題我認爲第一個更好。

順便說一下你的代碼有許多沒有設置資源(連接,溪流,等等等等)

+0

感謝您的回答,有很多錯誤,因爲這只是從數據庫加載詳細信息的方法的測試代碼。我會盡快解決他們的問題。 – NimazSheik 2014-12-03 10:57:02

+0

@NimazSheik沒有太多的錯誤,我太粗糙了。你只有一些對象沒有處置。只需將IDisposable中的所有內容放在一起使用即可:D – giammin 2014-12-03 11:01:58

2

確實應該在關閉它之後處理DatabaseConnector。造成這種情況的最佳做法是使用using語句:

using (DatabaseConnector dbcon = new DatabaseConnector) 
{ 
    // Code that uses connection. 
} 

另外,只需調用dbcon.Dispose()調用.CloseConnection後()

這將確保的DatabaseConnection使用的所有資源被釋放。

+0

感謝您的幫助,我將確保關閉所有連接。 – NimazSheik 2014-12-03 11:00:36

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; 
} 
+0

感謝您的詳細解答,此解決方案運行良好! – NimazSheik 2014-12-03 11:02:29

相關問題