2012-08-25 2 views
-1

Access 데이터베이스를 만드는 웹 응용 프로그램이 있습니다. 이 데이터베이스를 만들 때 먼저 파일이 있으면 삭제하고 다시 만들어야합니다.파일을 삭제하려고 할 때 오류가 발생했습니다.

  if (File.Exists(DataSourcePath + fileName)) 
       File.Delete(DataSourcePath + fileName); 

      string cnnStr = @"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + DataSourcePath + fileName + "; Jet OLEDB:Engine Type=5"; 
      var catType = Type.GetTypeFromProgID("ADOX.Catalog"); 
      object o = Activator.CreateInstance(catType); 
      catType.InvokeMember("Create", BindingFlags.InvokeMethod, null, o, new object[] { cnnStr }); 

      OleDbConnection cnn = new OleDbConnection(cnnStr); 
      var cmd = cnn.CreateCommand(); 

      cnn.Open(); 
      cmd.CommandText = "CREATE TABLE TblInfoCompany (Name TEXT, Family TEXT)"; 
      cmd.ExecuteNonQuery(); 

      cmd.Dispose(); 
      cnn.Close(); 
      cnn.Dispose(); 

이 파일을 재생성 할 때 예외가 발생할 수 있습니다. 예외가 : "파일이 다른 프로세스에서 사용되었습니다." 이 프로세스를 종료하거나이 문제를 해결할 수있는 방법을 찾으십시오.

감사합니다.

+3

관련 코드 표시. 오류를 더 자세히 말하면 "열린 프로세스"가 필요 없습니다. –

+0

당신의 연결이 아마도 풀링되어 있기 때문에, 닫기만으로는 충분하지 않습니다. [ReleaseObjectPool] (http://msdn.microsoft.com/en-us/library/system.data.oledb.oledbconnection.releaseobjectpool%28v=vs.100%29.aspx)을 참조하십시오. –

답변

1

사용중인 파일을 처리하는 프로세스는 아마도 웹 응용 프로그램 자체 일 것입니다. 해당 mdf 파일을 닫거나 열 때 Jet 엔진에서 직접 처리하지 않으므로 쉽지 않습니다. 나는 시스템 기능을 MoveFileEx 지정을 PInvoke를하는 것이 좋습니다 것입니다 :

  • 조작을 의미하는 것은 다음에 시스템을 다시 시작할 때 할 것, dwFlags로
  • MOVEFILE_DELAY_UNTIL_REBOOT을 삭제하려는 의미 두 번째 매개 변수에 null

나는 서버가 너무 자주 종료되지 않기 때문에 최선의 방법이 아니라는 것을 안다. 그러나 갇힌 곳에서 닫을 수없는 잠긴 파일을 삭제하는 더 쉬운 해결책 일 것이다.

관련 문제