Russian Qt Forum
Май 18, 2024, 22:01 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Attempt to write to read-only database  (Прочитано 13651 раз)
Yuriy
Гость
« : Октябрь 12, 2011, 21:35 »

Всем привет. Вчера впервые решил опробывать работу своих программ в Windows 7 64 bit.
Сборку делал на Win XP 32 bit. Все безупречно работает. Но вот почему то в новой версии виндоуз выдает ошибку при попытке записи данных в БД SQlite3: Attempt to write to read-only database.

В чем может быть дело ? Может быть кто-нибудь уже сталкивался ?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Октябрь 12, 2011, 21:36 »

Права есть на запись?
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
BRE
Гость
« Ответ #2 : Октябрь 12, 2011, 21:37 »

В чем может быть дело ? Может быть кто-нибудь уже сталкивался ?
В правах к самому файлу или папке где он лежит. Ты его не в Program Files положил?
Записан
Yuriy
Гость
« Ответ #3 : Октябрь 12, 2011, 21:40 »

Я честно говоря не знаю. Документы сохраняются и в папку программы и там откуда считываю БД, но вот например на C: не сохраняются. Думаю это такой трюк Win 7. Пользоваться этой поделкой от M$ не собираюсь, но вдруг кто-нибудь будет использовать мое приложение под Win7, нужно быть уверенным, что все работает.

у меня два exe-шника и оба лежат C:\Visual3D\bin
Записан
Yuriy
Гость
« Ответ #4 : Октябрь 12, 2011, 21:43 »

И в эту папку пишутся файлы, конфиги, и читаются без проблем из под программы. Без проблем создаются файлы из под моей программы с помощью fopen, fflush и fclose. Только не в корневой папке C: А БД почему-то не сохраняются. Вообще я использую БД SQlite3 и не задаю userName, password, port и hostName при открытии БД. Может быть дело в этом Непонимающий
« Последнее редактирование: Октябрь 12, 2011, 21:51 от Yuriy » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #5 : Октябрь 12, 2011, 22:01 »

Покажи как создаешь подключение.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
BRE
Гость
« Ответ #6 : Октябрь 12, 2011, 22:03 »

[off] Микрософт наконец дошел до того, что права доступа все таки нужны, добавили их в win7 (ну через жопу конечно сделали), а пользователи не поняв что это все для их блага, либо сразу отрубают UAC, либо по традиции работают с админскими правами. Улыбающийся Сам недавно столкнулся, пришлось проработать вопрос...
Еще понравилось решение вопроса с повышением привилегий программ-установщиков. Кто-то скажет нужен специальный файл манифест, где все это будет описано, но есть способ проще. Используется специальный эвристический алгоритм, который анализирует имя запускаемого файла и если там есть что-то типа setup, install или чего-то подобного, до венда без всяких манифестов запросит пароль и поднимет привилегии этому процессу. Улыбающийся  [/off]
Записан
Yuriy
Гость
« Ответ #7 : Октябрь 12, 2011, 22:06 »

В одной статические функции, а в первой (потому как реже используются БД) обычным классом:

Добавляю соединение:
Код:
void readconstants::openDB(const int &Type)
{
    QSqlDatabase db;

switch (Type)
{
case 0:
    db = QSqlDatabase::addDatabase("QSQLITE","myConstConnect");
    break;
case 1:
    db = QSqlDatabase::addDatabase("QSQLITE","myRoomConnect");
    break;
case 2:
......

Здесь работаю с БД разными функциями
Код:
void writedb::writePanelsState(const QString &fileName,const QByteArray &geo_data,const QByteArray &layout_data)
{
QSqlDatabase db = QSqlDatabase::database("mySettingsConnect",false);
db.setDatabaseName(fileName);
if (!db.open())
    {
        QMessageBox::warning(0, QString::fromUtf8("Ошибка"), QString::fromUtf8("Ошибка при подключении к базе данных %1.").arg(fileName));
        return;
    }

db.transaction();

QSqlQuery query(db);
query.exec("DELETE FROM PanelsData;");

query.prepare("INSERT INTO PanelsData (LayoutData, GeoData) "
                   "VALUES (:layout, :geo)");
     query.bindValue(":layout", layout_data);
     query.bindValue(":geo", geo_data);
     if (!query.exec())
         QMessageBox::warning(0, QString::fromUtf8("Ошибка"), QString::fromUtf8("Не смогли записать информацию о панелях."));

db.commit();
//if (db.isOpen())  db.close(); memory leak - закрываю с помощью RemoveDB
}

Убираю соединение:
Код:
void readconstants::closeDB(const int &Type)
{
switch (Type)
{
case 0:
    QSqlDatabase::removeDatabase("myConstConnect");
    break;
case 1:
    QSqlDatabase::removeDatabase("myRoomConnect");
    break;
case 2:
    QSqlDatabase::removeDatabase("mySettingsConnect");
    break;
case 3:
    QSqlDatabase::removeDatabase("myBaseMaterialConnect");
    break;
Записан
Yuriy
Гость
« Ответ #8 : Октябрь 12, 2011, 22:10 »

[off] Микрософт наконец дошел до того, что права доступа все таки нужны, добавили их в win7 (ну через жопу конечно сделали), а пользователи не поняв что это все для их блага, либо сразу отрубают UAC, либо по традиции работают с админскими правами. Улыбающийся Сам недавно столкнулся, пришлось проработать вопрос...
Еще понравилось решение вопроса с повышением привилегий программ-установщиков. Кто-то скажет нужен специальный файл манифест, где все это будет описано, но есть способ проще. Используется специальный эвристический алгоритм, который анализирует имя запускаемого файла и если там есть что-то типа setup, install или чего-то подобного, до венда без всяких манифестов запросит пароль и поднимет привилегии этому процессу. Улыбающийся  [/off]

Ну и хрень, как бы тогда права 0666 установить с помощью InnoSetup  скрипта на установленную папку.  Смеющийся
И еще не смог WiFi подключить под эту ОС, поэтому в Debian  или Win XP могу только выйти на форум, потом уже перезагружать в Win 7 и пробывать... Вообщем бред из бреда.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #9 : Октябрь 12, 2011, 22:12 »

В InnoSetup это делается очень легко, на сколько я помню. Поищи в хэлпе. А еще лучше, создавай БД в ApplicationData.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Yuriy
Гость
« Ответ #10 : Октябрь 12, 2011, 22:28 »

погуглил немного, а то ведь в Win 7 инета не будет  Смеющийся
http://sqlite.phxsoftware.com/forums/t/1163.aspx

Решение следующее:
This a reccurrent error in Vista and 7. The user must set the administrator privileges to the aplication in the properties. Otherwise the error appears.

И всего - навсего нужно будет объяснить конечным пользователям это же. Создать какую-нибудь политику и куда-нибудь ее всунуть! Блин, как же это все напрягает если честно. Эти sheduled task'и пачками, которые невозможно отключить, это шерстение на жестком диске, вся эта "умная" Windows'овская обработка в тихушку ! Блин это не система а вирус
Записан
Yuriy
Гость
« Ответ #11 : Октябрь 12, 2011, 22:37 »

А вот и решение по запуску программ с повышенными привелегиями, которое я теперь заучу и буду диктовать по телефону своим клиентам:

1) Запускаете планировщик заданий (Пуск ---> Все программы ---> Стандартные ---> Служебные ---> Планировщик заданий)
2) Нажимаете "Создать задачу"
3) Указываете Имя для новой задачи и ставите флажок "Выполнять с наивысшими правами"
4) Переходите на вкладку Действия, нажимаете "Создать", в следующем окне нажимаем "Обзор"
5) Указываете путь к нужному приложению и нажимаете "Открыть"
6) Нажимаете "ОК", затем снова "ОК"
7) Создайте ярлык на рабочем столе ( Нажмите правую кнопку мыши, выберете "Создать" ---> "Ярлык")
Крутой В поле Расположение объекта введите:
schtasks /run /tn mytask_admin

где mytask_admin - имя созданной нами задачи. Если в имеми содержаться робелы, обязательно укажите его в кавычках.
9) Введите имя ярлыка и нажмите Готово

И кто мне скажет, что такой подход - не КОСТЫЛЬ ? И после этого еще кто-то говорит что Linux для "красноглазых" Непонимающий
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #12 : Октябрь 12, 2011, 22:40 »

Что-то больно все сложно. Уверен, что это единственное решение?
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Yuriy
Гость
« Ответ #13 : Октябрь 12, 2011, 22:45 »

Пантер, спасибо за Ваше участие в обсуждении проблемы.

Я немного расстроился. Нужно было модели доделывать, а я два дня с этим Win 7 занимаюсь вместо основной работы. Ну а как же еще. Либо сторонние приложения использовать типа Elevated Shortcut, либо демон писать и его в службы засовывать, либо вот так по телефону клиентам толдычить. Возможность переноса папки с программой в этом случае проблематичная. Я всегда делал программы Portable, которые имеют свои настройки и содержатся в пределах одной папки, а теперь придется вот такие трюки выполнять и как только клиент переустановит Windows снова ему перезаряжать программу.

А может быть какой-нибудь exe-шничек сейчас сварганю, типа FirstConfig.exe чтобы он вшивал программу в систему, но уж очень я не люблю таких вещей.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #14 : Октябрь 12, 2011, 22:47 »

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

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.046 секунд. Запросов: 19.