Ошибка открытия соединения с файлом SQL CE на тестовой машине - PullRequest
2 голосов
/ 20 мая 2011

Я тестирую свое приложение на учетной записи без прав администратора 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 из-за пределов директории установки.

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

Ответы [ 2 ]

2 голосов
/ 27 мая 2011

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

Другой момент - это строка подключения в вашем app.config.Если вы измените его в своей программе, такой как я, он также должен находиться в такой папке, не требующей прав администратора.У меня есть статический app.config в моей папке app в программных файлах, но второй со строкой подключения в Environment.SpecialFolder.LocalApplicationData (это «username \ 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;
1 голос
/ 27 мая 2011

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

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

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

...