Я пишу программу на своем ноутбуке, которую мне нужно запустить на рабочем компьютере после публикации. Программа выполняет кучу работы с базой данных, а затем открывает документ Word и связывает слияние с данными. В отладке все работает нормально. Он вылетает после публикации как на моем ноутбуке, так и на рабочем столе. Я изолировал проблему, но не знаю, как ее решить.
Похоже, что файл .mdb, из которого требуется прочитать файл .docx, не копируется в каталог App_Data
во время выполнения. Это странно, потому что у меня есть и файл .docx, и файл .mdb в проекте как файлы content
. Файл .docx отображается в этой папке, и моя программа отлично его открывает.
Единственное отличие файла .mdb заключается в том, что он также является источником данных в проекте и был добавлен путем добавления источника данных, а не просто добавления самого документа и выполнения действия сборки content
. Очевидно, что так оно и должно работать, но... Вот, наконец, вопрос... Как мне заставить файл готового продукта .mdb скопировать в папку App_Data
, чтобы мой файл .docx мог читать из него?
Вот строки кода, которые я использую сейчас и которые, по моему мнению, должны работать:
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
РЕДАКТИРОВАТЬ. Я еще больше сузил проблему, но до сих пор не решил ее. Оказывается, проблема заключается в каталоге, на который ссылается этот код:
Dim AccessFolder As String = My.Application.Info.DirectoryPath.ToString
Это прекрасно работает во время отладки, поскольку ссылается на папку \bin\debug, а файлы .mdb помещаются туда во время отладки.
В BUILD они переходят в место, не указанное в приведенном выше коде. Я не знаю, как сослаться на местоположение, но должен быть хороший способ. Кроме того, имя каталога содержит кучу случайно сгенерированных символов, поэтому я не знаю, как бы я жестко закодировал местоположение. Вот два каталога:
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
Я просмотрел пространство My.Application, но не нашел там ничего полезного. Вы можете помочь? РЕДАКТИРОВАТЬ 2. Если я сошлюсь на TableAdapter для .mdb, я могу получить следующий вывод, который мне ПОЧТИ нужен:
Dim Tbl As New RenewalTempDataSetTableAdapters.RenewalLettersTableAdapter
Dim RightFolder As String = Tbl.Connection.DataSource
'Returns "|Data Directory|\RenewalTemp.mdb"
Я знаю, что где-то «под капотом» должна быть переменная, которая может создать фактический |Каталог данных| как это упоминается здесь между | | символы.
CopyToOutputDirectory
наCopyAlways
. - person Fᴀʀʜᴀɴ Aɴᴀᴍ   schedule 30.10.2015