none
複製MDB時,發生錯誤! RRS feed

  • 問題

  • 我是用VB2005的,當我將abc.mdb的資料抄到def.mdb後,用了以下的程式去close個MDB。
            m_dtEmployer_old.Dispose()
            m_dtEmployee_old.Dispose()
            m_daEmployer_old.Dispose()
            m_daEmployee_old.Dispose()
            m_cbEmployer_old.Dispose()
            m_cbEmployee_old.Dispose()
            m_cnMDB_old.Close()
            m_cnMDB_old.Dispose()
           
            m_dtEmployer_new.Dispose()
            m_dtEmployee_new.Dispose()
            m_daEmployer_new.Dispose()
            m_daEmployee_new.Dispose()
            m_cbEmployer_new.Dispose()
            m_cbEmployee_new.Dispose()
            m_cnMDB_new.Close()
            m_cnMDB_new.Dispose()
    但當我現行以下程式時出現 57:由於已有另一個處理序正在使用該檔案,所以無法存取該檔案。
                My.Computer.FileSystem.RenameFile("c:\mdb\abc.mdb", "c:\mdb\def.mdb")

    2010年1月18日 上午 08:05

解答

所有回覆

  • hi
    先確定abc.mdb是否存在任何session
    不然先停止SQL SERVER Service在行複製
    http://www.dotblogs.com.tw/ricochen/Default.aspx
    2010年1月18日 上午 08:26
  • GC.Collect 方法 ()

    abc.mdb和def.mdb都是已經存在的檔案嗎?那應該就不能改名了吧...
    • 已提議為解答 Lolota Lee 2010年1月18日 上午 09:04
    • 已標示為解答 璉璉Moderator 2010年1月31日 上午 05:29
    2010年1月18日 上午 08:32
  • 應該沒有SQL Server Service,因為這情形只在Vista 64bit或Windwos7 64bit才出現,Vista 32 bit或Windows7 32bit是不會有這問題的。
    2010年1月18日 上午 08:34
  • sorry是我看錯(看成MDF)

    確定abc.mdb是否有被開啟呢??

    或者先這樣嘗試可否複製
    copy /y c:\mdb\abc.mdb c:\mdb\def.mdb



    http://www.dotblogs.com.tw/ricochen/Default.aspx
    2010年1月18日 上午 09:05
  • def.mdb係不存在的。
    2010年1月18日 上午 09:19
  • 我是用VB2005的,當我將abc.mdb的資料抄到def.mdb後,用了以下的程式去close個MDB。
    那這句話是什麼意思??
    2010年1月18日 上午 09:24
  • 我試過在Program中,在開MDB前用copy statment 係OK的。之後行個Module

        Public m_cnMDB_old As New OleDb.OleDbConnection
        Public m_daEmployer_old, m_daEmployee_old As OleDb.OleDbDataAdapter
        Public m_cbEmployer_old, m_cbEmployee_old As OleDb.OleDbCommandBuilder
        Public m_dtEmployer_old, m_dtEmployee_old As New DataTable
        Public m_intRowPosition_old As Integer = 0
    ....
            Try
                If My.Settings.strPass = "" Then
                    m_cnMDB_old.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                                         "Data Source=" & strDBPath & m_strMDBname_old
                Else
                    m_cnMDB_old.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                          "Data Source=" & strDBPath & m_strMDBname_old & ";Jet OLEDB:Database Password=" & My.Settings.strPass
                End If

                m_cnMDB_old.Open()
                m_daEmployer_old = New OleDb.OleDbDataAdapter("SELECT employer.* FROM employer", m_cnMDB_old)
                m_cbEmployer_old = New OleDb.OleDbCommandBuilder(m_daEmployer_old)
                m_daEmployer_old.Fill(m_dtEmployer_old)

                m_daEmployee_old = New OleDb.OleDbDataAdapter("SELECT employee.* FROM employee ORDER BY employee.Surname, employee.FirstName", m_cnMDB_old)
                m_cbEmployee_old = New OleDb.OleDbCommandBuilder(m_daEmployee_old)
                m_daEmployee_old.Fill(m_dtEmployee_old)

            Catch ex As Exception

                Errbox("Error in opening old Access MDB: " + ex.Message)
                m_intReturn = 0
                Exit Sub
            End Try

    然後用這些去Close MDB。
            m_dtEmployer_old.Dispose()
            m_dtEmployee_old.Dispose()
            m_daEmployer_old.Dispose()
            m_daEmployee_old.Dispose()
            m_cbEmployer_old.Dispose()
            m_cbEmployee_old.Dispose()
            m_cnMDB_old.Close()
            m_cnMDB_old.Dispose()
     
    再用這句Statment去Copy。
    My.Computer.FileSystem.RenameFile(strDBPath + m_strMDBnameTmp, m_strMDBnameWorking)

    行在32bit係冇問題的,但在64bit就有問題了。

    2010年1月18日 上午 09:26
  • 你要把程式強制建置成X86 (不能建置為Any CPU) , 因為Jet OleDB Driver 4.0 沒有64位元版的, 所以會呼叫失敗
    MSDN 文件庫很重要
    問題本身越具體, 越容易得到大家的回應
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情
    2010年1月18日 上午 09:54
    版主
  • 我已將程式強制建置成x86。
    但我發現,如果將個Module放在Form裏行,完成後Close了個Form,再行Copy/Rename,都冇問題。
    所以我覺得,GC好似要等個Application Close先會回收。我也試過在行完Database的Dispose之後行GC.Collect,再行Copy/Rename,但情況一樣,都係有Error出現。
    係唔係Jet OleDB Driver運用在64位元版,GC要等到Application Close左,先會回收呢?

    2010年1月19日 上午 03:38