2015-10-30 1 views
1

J'écris un programme sur mon ordinateur portable que j'ai besoin de lancer sur mon ordinateur de travail après l'avoir publié. Le programme fait un tas de travail de base de données, puis ouvre un document Word et relie la fusion et publipostage aux données. Tout fonctionne bien dans le débogage. Il plante après avoir été publié sur mon ordinateur portable et sur mon ordinateur de bureau. J'ai isolé le problème mais je ne sais pas comment le résoudre.Les fichiers de contenu VB.Net Data (.mdb) ne sont pas disponibles après la publication. Qu'est-ce que je rate?

Il semble que le fichier .mdb, que le fichier .docx veut lire, n'est pas copié dans le répertoire App_Data au moment de l'exécution. C'est bizarre parce que j'ai le fichier .docx et le fichier .mdb dans le projet en tant que fichiers content. Le fichier .docx apparaît dans ce dossier et mon programme l'ouvre très bien. La seule chose différente à propos du fichier .mdb est qu'il est également une source de données dans le projet et a été introduit en ajoutant la source de données au lieu de simplement ajouter le document lui-même et de faire l'action de construction content. Evidemment c'est comme ça que ça marche, mais ... Voici enfin la question ... Comment obtenir le fichier .mdb du produit fini à copier dans le dossier App_Data afin que mon fichier .docx puisse en lire?

Voici les lignes de code que je utilise maintenant que je pensais devrait fonctionner:

Dim w As New Word.Application 
Try 
    Dim Folder As String = My.Application.Info.DirectoryPath.ToString 
    'MsgBox(Folder) 
    Dim Path As String = Folder & "\StandardLetter.docx" 
    w.Documents.Open(Path, [ReadOnly]:=True) 
    w.WindowState = Word.WdWindowState.wdWindowStateMaximize 
    w.Visible = True 
    w.Activate() 
Catch ex As Exception 
    MsgBox("Couldn't open the document.") 
    Exit Sub 
End Try 
Try 
    Dim AccessFolder As String = My.Application.Info.DirectoryPath.ToString 
    w.ActiveDocument.MailMerge.OpenDataSource(AccessFolder & "\RenewalTemp.mdb") 
    'This does not work after publishing because RenewalTemp.mdb doesn't appear in the AppData Folder 
Catch ex As Exception 
    MsgBox("Error accessing the RenewalLetterTemp Database.") 
    MsgBox("Path = " & My.Application.Info.DirectoryPath.ToString & "\RenewalTemp.mdb") 
    Exit Sub 
End Try 

EDIT - Je l'ai réduit encore le problème, mais encore ne l'ai pas résolu. Il se trouve le problème réside dans le répertoire référencé par ce code:

Dim AccessFolder As String = My.Application.Info.DirectoryPath.ToString 

Cela fonctionne très bien au cours de débogage, car il fait référence au dossier \ bin \ debug et les fichiers .mdb y aller pendant le débogage. Dans BUILD, ils vont à un endroit non référencé par le code ci-dessus. Je ne sais pas comment référencer l'emplacement, mais il doit y avoir un bon moyen. En outre, le nom du répertoire contient un tas de caractères qui semblent être générés de manière aléatoire, donc je ne sais pas comment je coderais l'emplacement en dur non plus. Voici les deux répertoires:

Dim AccessFolder As String = My.Application.Info.DirectoryPath.ToString 
C:\Users\lholk\AppData\Local\Apps\2.0\OGMYVLOB.LZH\TD1N8EZX.KAN\rene..tion_7dc5ad3db20d2410_0001.0000_fee3b96b6598cca2 

Dim AccessFolder As String = '??? I Don't know what should go here 
C:\Users\lholk\AppData\Local\Apps\2.0\OGMYVLOB.LZH\TD1N8EZX.KAN\rene...exe_7dc5ad3db20d2410_0001.0000_none_6758ee3059fd9f2f 

Je l'ai regardé autour de moi dans l'espace My.Application mais ne l'ai pas vu quoi que ce soit d'autre utile là-dedans. Pouvez-vous aider? EDIT 2 - Si je me réfère à TableAdapter pour le .mdb, je peux obtenir la sortie suivante, ce qui est presque ce que je dois:

Dim Tbl As New RenewalTempDataSetTableAdapters.RenewalLettersTableAdapter 
    Dim RightFolder As String = Tbl.Connection.DataSource 
'Returns "|Data Directory|\RenewalTemp.mdb" 

Je sais que quelque part « sous le capot » il doit y avoir une variable qui peut produire le réel | comme il est fait référence ici entre le | | symboles

+0

Définissez 'CopyToOutputDirectory' sur' CopyAlways'. –

+0

Il est déjà configuré de cette façon. –

+0

Alors c'est ** wierd. –

Répondre

0

C'est ce qui a permis de résoudre le problème. Pour clarifier, après la publication du programme, les fichiers de données sont stockés dans un emplacement distinct des autres fichiers de contenu. Je ne trouvais rien dans les classes habituelles qui fourniraient ce chemin, donc je l'ai retravaillé. Cela fonctionne en mode débogage, après la publication et après la mise à jour. J'espère que cela sera utile à quelqu'un d'autre.

 Public Shared Function GetDataFilePath(FileName As String) As String 
    'StartPath refers to the location of regular content files 
    Dim StartPath As String = My.Application.Info.DirectoryPath.ToString 
    If IO.Directory.Exists(StartPath) Then 
     For Each file As String In IO.Directory.GetFiles(StartPath) 
      StartPath = file 
      Exit For 
     Next 
    End If 
    'DataFolder is where root of where published apps data files go, but the actual directory is 3 levels below. 
    'The name of the Folder I'm looking for has the SAME name as the Folder the Content files are in. 
    Dim DataFolder As String = Environ("UserProfile") & "\AppData\Local\Apps\2.0\Data" 
    Dim Control As String = DataFolder 
    Dim DataParent As String = IO.Directory.GetParent(StartPath).ToString 
    Dim BackSlash As Integer = DataParent.LastIndexOf("\") 
    Dim FolderName As String = Strings.Right(DataParent, Len(DataParent) - BackSlash - 1) 
    Dim DataPath As String = "" 

    If IO.Directory.Exists(DataParent) Then 
     For Each SubFolder1 As String In IO.Directory.GetDirectories(DataFolder) 
      'MsgBox(SubFolder1) 
      For Each SubFolder2 As String In IO.Directory.GetDirectories(SubFolder1) 
       'MsgBox(SubFolder2) 
       For Each SubFolder3 As String In IO.Directory.GetDirectories(SubFolder2) 
        'MsgBox(SubFolder3) 

        Dim MatchBackSlash As Integer = SubFolder3.LastIndexOf("\") 
        Dim Match As String = Strings.Right(SubFolder3, Len(SubFolder3) - MatchBackSlash - 1) 
        If Match = FolderName Then 
         DataFolder = SubFolder2 & "\" & Match & "\Data" 
         'MsgBox(DataFolder) 
        End If 
       Next 
      Next 
     Next 
    End If 
    If DataFolder <> Control Then 
     Return DataFolder & "\" & FileName 
    End If 
    'This makes it so it works in Debug Mode as well, where everything is stored in the bin\debug folder 
    Return My.Application.Info.DirectoryPath & "\" & FileName 

End Function