Ограничение в SQL CE заключается в том, что оно не поддерживает подзапросы, возвращающие скалярное значение. Подзапросы, возвращающие набор, отлично разбираются.
Подзапрос в соединении в ответе Грейсона возвращает набор, поэтому он должен работать. Иногда скалярный подзапрос нельзя избежать в состоянии соединения. Используя 'IN' вместо '=', парсер может быть обманут.
См. Мой ответ на этот вопрос .
Я бы поместил его в папку с программой, добавил ссылку в папку меню Пуск, чтобы обеспечить прямой доступ (без запуска инструмента) и просто по событию щелчка System.Diagnostics.Process.Start(@".\Manual.pdf");
Ок, теперь мы подошли к совершенно новому вопросу: Как внедрить файл в мое приложение и запустить его?
На этот вопрос вы найдете несколько ответов здесь, но вот краткая версия:
byte[]
from Properties.Resources.NameOfResource
С помощью этих шагов вы ссылаетесь на ваш файл там, где он существует в вашей структуре. Если вам нравится, что копия вашего pdf-файла будет помещена в подпапку Resources в вашем проекте, просто пропустите пункты один и два в приведенном выше списке.
Чтобы открыть ваш pdf, вам нужно записать байт[] на диск (возможно, с помощью Path.GetTempFileName()
) и запустить его с помощью Adobe Reader. (Не забудьте удалить файл после использования)
Вы можете ссылаться на элемент управления Adobe Reader ActiveX и свяжите его со своим приложением.
Просто добавьте AcroPDF.PDF.1
в панель инструментов на вкладке «Компоненты COM» (щелкните правой кнопкой мыши панель инструментов и выберите Выбрать элементы ...
), затем перетащите экземпляр в Winform, чтобы попросите дизайнера создать код для вас. В качестве альтернативы, после добавления необходимой ссылки вы можете использовать следующий код:
AxAcroPDFLib.AxAcroPDF pdf = new AxAcroPDFLib.AxAcroPDF();
pdf.Dock = System.Windows.Forms.DockStyle.Fill;
pdf.Enabled = true;
pdf.Location = new System.Drawing.Point(0, 0);
pdf.Name = "pdfReader";
pdf.OcxState = ((System.Windows.Forms.AxHost.State)(new System.ComponentModel.ComponentResourceManager(typeof(ViewerWindow)).GetObject("pdfReader.OcxState")));
pdf.TabIndex = 1;
// Add pdf viewer to current form
this.Controls.Add(pdf);
pdf.LoadFile(@"C:\MyPDF.pdf");
pdf.setView("Fit");
pdf.Visible = true;
Вы можете использовать элемент управления WebBrowser и позволить IE загружать для вас программу для чтения PDF, если она установлена на машине.
Однако в последний раз, когда я пробовал это, мне пришлось сначала записать файл PDF на диск, чтобы я мог указать на него элемент управления WebBrowser.
Если у вашего пользователя установлен Adobe Reader (или любой другой PDF-ридер), вы можете использовать:
System.Diagnostics.Process.Start(
"My-PDF-file.pdf");
Надеюсь, это поможет.
Примечание. Очевидно, это не удастся, если у пользователя не установлены какие-либо приложения для чтения PDF-файлов.
Я бы посоветовал преобразовать ваш PDF-файл в файл справки Microsoft, чтобы вам не требовалось устанавливать Adobe Reader (он содержит ошибки и имеет слишком много проблем с безопасностью). Вы не можете ожидать, что это будет у пользователей.
В ответ на комментарий начинающего:
Да, вам нужно будет создать файл справки в виде HTML-документа, а не pdf. Нет простого способа конвертировать PDF в HTML.
Возможно, можно будет встроить Adobe Reader в вашу форму как компонент ActiveX. Но это означает, что вам нужно убедиться, что Reader установлен на клиентском компьютере, чтобы это работало.
В случае, если он не обязательно должен быть строго встроен, вы можете просто запустить PDF-файл и позволить любому пользователю, просматривающему его, открыть его.