Хобрук: Ваш путь к мастерству в программировании

Ошибка при открытии соединения с файлом SQL CE на тестовом компьютере

Я тестирую свое приложение в учетной записи Windows 7 без прав администратора. Приложение устанавливается в файлы программы. Это включает в себя файл .sdf, который мне нужно прочитать. У меня есть строка подключения, помеченная как только для чтения, и я установил временный путь к своим документам. Это ошибка, которую он выдает, когда я пытаюсь сделать connection.Open()

Внутренняя ошибка: не удается открыть область общей памяти.

У меня есть строка подключения, определенная в app.config, но я изменяю ее, прежде чем начать использовать подключение. Эта часть находится в app.config Data Source=|DataDirectory|\DB.sdf;Password=password;

И затем я изменяю его так:

    connection = new SqlCeConnection(connectionString +
 ";Mode=Read Only; Temp Path=" + Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments));

Это работает на моей машине разработчика (очевидно), поскольку она работает вне каталога, доступного только для чтения. Но даже когда я вручную помечаю файл .sdf как доступный только для чтения, он все еще работает и успешно создает временный файл базы данных в правильной папке. Однако на тестовой машине все находится в папке с программными файлами, доступной только для чтения, и это не работает.

Основная цель этой проблемы - попытаться убедиться, что мою программу не нужно запускать от имени администратора, и я хотел бы не перемещать основную копию файла db из-за пределов каталога установки.

Дайте мне знать, если мне нужно объяснить что-то еще. Спасибо

20.05.2011

  • К сожалению, вам потребуются привилегии уровня администратора для доступа к базе данных SQL-CE в папке Program Files (или любой другой защищенной папке). Зачем вам нужно, чтобы это было установлено в Program Files? Если вы устанавливаете базу данных в ProgramData (т. е. Environment.SpecialFolder.ApplicationData), вам не потребуются права администратора, и, возможно, это правильное место? 23.05.2011
  • Требованием проекта было хранить все файлы вместе. Я посмотрю, как это сделать, так как это, вероятно, сработает. Кроме того, не имеет ли значения тот факт, что БД доступна только для чтения? 23.05.2011
  • Можно было бы ожидать, что только чтение подойдет... Windows рассматривает Program Files, Windows и другие системные папки как защищенные и поэтому очень требовательна к типу доступа к файлам. Документация по этой проблеме очень плохая; поэтому трудно предоставить конкретные факты о том, почему вы видите такое поведение. Из любопытства, пробовали ли вы временный путь, для которого задано значение System.IO.Path.GetTempPath()? 23.05.2011
  • Установка БД в папку данных программы сработала. Хотя, думаю, не стоит этому слишком удивляться. Однако Path.GetTempPath() не работал. Он выдал ту же ошибку, что и у меня все время 23.05.2011
  • Да, ProgramData — ожидаемое место для хранения информации такого типа; Я определенно рекомендовал бы установить БД там. Что касается TEMP, решил, что это того стоило. 23.05.2011

Ответы:


1

Я тоже использую базу данных sql ce, и у меня были те же проблемы. мое решение состояло в том, чтобы создать базу данных во вложенной папке в Environment.SpecialFolder.CommonApplicationData. Если его будет использовать только один пользователь, вы можете создать его в Environment.SpecialFolder.ApplicationData. Но здесь вам не нужны права администратора.

Еще один момент — ваша строка подключения в вашем app.config. Если вы измените его в своей программе, как я, он также должен находиться в такой папке «без прав администратора». У меня есть статический файл app.config в моей папке приложения в программных файлах, но второй со строкой подключения в Environment.SpecialFolder.LocalApplicationData (это «имя пользователя\AppData\Local» в Win7) . И я защищаю свою строку подключения с помощью шифрования DataProtectionConfigurationProvider, поэтому никто не может прочитать пароль базы данных.

Вот как вы можете сопоставить свой второй app.config с вашим приложением:

string ConfigPathString = @"{0}\MyApp\MyApp.config";
string ConfigPath = String.Format( ConfigPathString, System.Environment.GetFolderPath( Environment.SpecialFolder.LocalApplicationData ) );

ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
fileMap.ExeConfigFilename = ConfigPath;
Configuration Config = ConfigurationManager.OpenMappedExeConfiguration( fileMap, ConfigurationUserLevel.None );

string myConnectionString = ConnectionStrings.ConnectionStrings["MyConnectionStringKey"].ConnectionString;
27.05.2011
  • Это в значительной степени то, что я в конечном итоге сделал. Я поместил свой в CommonApplicationData, так как хотел 1 установку для нескольких пользователей. Конечно, воняет, что я не мог сделать это по-другому, но этот способ ничуть не хуже. Спасибо за подтверждение моего решения. 27.05.2011
  • Я думаю, что это очень распространенная проблема, связанная с sql ce в системах win с UAC. пожалуйста. 27.05.2011

  • 2

    Как Калгари уже упоминал в своих комментариях, вы не можете открыть файл непосредственно в папке программ из-за ограничений Windows 7 для не-администраторов. Но в связи с тем, что вы не хотите в него ничего записывать, почему бы вам просто не скопировать при запуске файл в Environment.SpecialFolder.ApplicationData?

    Когда ваша программа запустится, просто скопируйте файл из папки программ в нужное место, используйте его по своему усмотрению и удалите при выходе из приложения. Таким образом, вы не оставляете никаких фрагментов (кроме того, что приложение вылетит).

    Просто чтобы быть уверенным в последнем сценарии, вы можете добавить дополнительную операцию удаления в процедуру деинсталляции установки. Таким образом, если приложение будет удалено и оно вылетит при последнем запуске, программа установки удалит мусор, оставив машину такой же, как и до установки программного обеспечения.

    27.05.2011
  • На самом деле я думал сделать это как решение, но оказалось, что проект не так сильно пострадает от наличия чего-то вне программных файлов, как если бы нам пришлось копировать базу данных при запуске. 27.05.2011
  • Новые материалы

    Создание кнопочного меню с использованием HTML, CSS и JavaScript
    Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

    Внедрите OAuth в свои веб-приложения для повышения безопасности
    OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

    Классы в JavaScript
    class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

    Как свинг-трейдеры могут использовать ИИ для больших выигрышей
    По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

    Как построить любой стол
    Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...

    Обзор: Машинное обучение: классификация
    Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

    Разработка расширений Qlik Sense с qExt
    Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..