Операция не разрешена в IsolatedStorageFileStream

    using (EntityDataContext amdb = new EntityDataContext(StrConnectionString))
            {
                if (amdb.DatabaseExists())
                {
                    using (IsolatedStorageFile isoStore = IsolatedStorageFile.GetUserStoreForApplication())
                    {
                        if (!isoStore.FileExists(databaseName))
                        {
                            copyDatabase = true;
                        }
                        else
                        {
                            using (IsolatedStorageFileStream databaseStream = isoStore.OpenFile(databaseName, FileMode.Open, FileAccess.Read)) // error here
                            {
                                using (Stream db = Application.GetResourceStream(new Uri(databaseName, UriKind.Relative)).Stream)
                                {
                                    if (databaseStream.Length < db.Length)
                                        copyDatabase = true;
                                }
                            }
                        }
                    }
                }
                else
                {
                    //error with the database that has been packaged
                }
                if (copyDatabase)
                    new Worker().Copy(databaseName);
            }

2 ответа

Убедитесь, что в параметрах режима доступа к изолированному хранилищу вы точно указали возможность записывать данные, а не просто читать.

Вы тестировали с устройством?

Из того, что я могу сказать, вы пытаетесь прочитать файл базы данных, пока у вас все еще открыто соединение с базой данных. Поскольку a DataContext блокирует базу данных (и, следовательно, файл), вы не можете читать ее одновременно.

Чтобы закрыть соединение с базой данных, попробуйте закрыть EntityDataContext объект (по телефону amdb.Close() или закрыв оператор использования

Попробуйте что-то вроде этого:

bool shouldCopyDatabase = false;
bool databaseExists = false;

using (EntityDataContext amdb = new EntityDataContext(StrConnectionString))
{
    databaseExists = amdb.DatabaseExists();
}

if (databaseExists == true)
{
    using (IsolatedStorageFile isoStore = IsolatedStorageFile.GetUserStoreForApplication())
    {
        if (!isoStore.FileExists(databaseName))
        {
            copyDatabase = true;
        }
        else
        {
            using (IsolatedStorageFileStream databaseStream = isoStore.OpenFile(databaseName, FileMode.Open, FileAccess.Read)) // error here
            {
                using (Stream db = Application.GetResourceStream(new Uri(databaseName, UriKind.Relative)).Stream)
                {
                    if (databaseStream.Length < db.Length)
                        copyDatabase = true;
                }
            }
        }
    }
}

if (copyDatabase)
    new Worker().Copy(databaseName);

Перемещая функцию доступа к изолированному хранилищу за пределы using (EntityDataContext amdb = new EntityDataContext(StrConnectionString)) область действия, вы разрешаете закрытие подключения к базе данных в первую очередь.

Другие вопросы по тегам