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

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

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: CREATE DATABASE  (Прочитано 28971 раз)
cya-st
Гость
« : Сентябрь 17, 2009, 15:43 »

Привет всем! Подскажите пожалуйста как создать БД, делаю так:
Код
C++ (Qt)
 
           db=QSqlDatabase::addDatabase("QPSQL");
   db.setHostName( sServerIP );
   db.setPort( MY_DBPORT );
   db.setDatabaseName("postgres");
   db.setUserName( MY_DBUSER );
   db.setPassword( MY_DBPASS );
 
//    db.exec("CREATE DATABASE myDB;"); // тоже не создается
 
           QSqlQuery query(db);
   query.exec("CREATE DATABASE myDb;");
 
Возвращается ошибка: <internal error>
Записан
_OLEGator_
Гость
« Ответ #1 : Сентябрь 17, 2009, 18:40 »

Код
C++ (Qt)
db.open(); ???
Записан
cya-st
Гость
« Ответ #2 : Сентябрь 17, 2009, 19:03 »

Код
C++ (Qt)
db.open(); ???
Спасибо помогло, как это я мог забыть?
Записан
_OLEGator_
Гость
« Ответ #3 : Сентябрь 17, 2009, 19:50 »

Бывает, по запарке, обычно все сложное и тяжелое сделаешь, а про мелочи забываешь Подмигивающий
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #4 : Октябрь 18, 2009, 00:57 »

А так у вас заработало??? Я специально проверил - у меня нет - потому что на мой взгляд то что написано бред. Вы подключаетесь к одной базе и через контекст этой БД хотите создать еще одну??? это невозможно! Я думаю вы всего лишь подключаетесь к существующей БД и ничего не создаете!!!

после вашего оператора query.exec("CREATE DATABASE myDb;"); сделайте так:

   if ( query.lastError().type() != QSqlError::NoError )
   {
      qDebug() << "Error:" << query.lastError().text();
      return false;
   };
и скиньти мне вывод -  не напишет ли он вам - что то типа: Dynamic SQL Error - SQL error code = -104 - Token unknown - line X, column XX - XXX Could not prepare statement

Вы или неправильно задали вопрос - вам надо было подключиться к сущ. БД - тогда этот оператор не нужен query.exec("CREATE DATABASE myDb;"); или же вам нужно использовать усовершенствованный драйвер Qt умеющий создавать базы (насколько я знаю существующие этого не могут) или более простой способ - использовать внешние утилитыы из комплекта БД для создания базы - через QProcess.

В общем мне очень интересно!!!
Записан
cya-st
Гость
« Ответ #5 : Октябрь 18, 2009, 16:07 »

Да давно уже работает, я уже и забыл про это. Просто незабудь поставить db.setDatabaseName("postgres");, ну и конечно пользователя и пароль не забудь указать для этой базы.
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #6 : Октябрь 18, 2009, 18:02 »

издеваешься??? Что там работает - БД создается?
Записан
cya-st
Гость
« Ответ #7 : Октябрь 18, 2009, 18:21 »

Я не издеваюсь. Программа рабочая, но еще не доработанная. (Всмысле я ее портирую с дельфи). Правда в установке я выполняю команду:
Код
DOS
C:\PG\bin\psql.exe -d template1 -f c:\pg\cruser.sql
 
Файл cruser.sql:
Код
SQL
CREATE USER "user1" WITH PASSWORD 'pass1' SUPERUSER CREATEDB CREATEROLE;
 
Я так думаю что проблема может быть в том что не создан юзер с вышеперечисленными правами.
Записан
BaltikS
Гость
« Ответ #8 : Октябрь 18, 2009, 18:37 »

всё правильно, если пользователя наделить правами на создание баз, то таким способом можно её создать!
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #9 : Октябрь 19, 2009, 03:28 »

Цитировать
всё правильно, если пользователя наделить правами на создание баз, то таким способом можно её создать!

каким способом? - счначала подключившись к ней а потом создав ее через коннект с ней же?НепонимающийНепонимающийНепонимающий мне так и не дали посмотреть на вывод команды которую я просил - уверен 99% автор поста только подулючается к базе через драйвер QT а не создает ее.

вот код автора с учетом что он забыл команду db.open
Код
C++ (Qt)
 db=QSqlDatabase::addDatabase("QPSQL");
   db.setHostName( sServerIP );
   db.setPort( MY_DBPORT );
   db.setDatabaseName("postgres");
   db.setUserName( MY_DBUSER );
   db.setPassword( MY_DBPASS );
                   db.open();
 
// все ниже выполнится с ошибками!!!!!!!!!! и не имеет смысла т.к. если db.open(); вернет true -
// значит БД уже есть и создавать ее не надо, а если false то ее нет и создать ее операторами ниже все равно нельзя!!!
//    db.exec("CREATE DATABASE myDB;"); // тоже не создается
 
//            QSqlQuery query(db);
//    query.exec("CREATE DATABASE myDb;");
 

а создать БД через команду CREATE DATABASE можно конечно - но вероятно в каком нибудь БД Админ кот. использует API базы а не через стандартный драйвер Qt...
« Последнее редактирование: Октябрь 19, 2009, 03:35 от break » Записан
CroCIV
Гость
« Ответ #10 : Октябрь 19, 2009, 07:39 »

Подключение к СУБД и управление БД - это разные вещи. В одной СУБД может быть гипотетически не ограниченное кол-во БД. Для успешного создания БД необходимы права администратора, скорее всего у тебя просто не достаточно прав. Мб еще стоит посмотреть настройки самой СУБД, там тоже могут быть подводные камни, например, на MS SQL 2009 есть галки: запретить подключение через ОДБЦ, запретить вход администратора через ОДБЦ, и по молчанию они включены, так вот, пока ты их не вырубишь к СУБД из Qt посредством ODBC цепануться сложно )). Разбирайся со своим сервером.

З.Ы.: прав тот у кого больше прав
Записан
BaltikS
Гость
« Ответ #11 : Октябрь 19, 2009, 08:07 »

break, Всё создаётся без  PgAdmin... Вот не поленился и выдрал код
Код
C++ (Qt)
QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL");
db.setDatabaseName("template1");
db.setPort(5432);
db.setHostName("myhost");
if (!db.open(ui.e_user->text(), ui.e_password->text()))
{
...
            }
...
QSqlQuery query(db);
if (!query.exec("CREATE DATABASE xxx ENCODING = 'KOI8';"))
{
...
            }
 
Да, единственно, не заметил, подключаться надо к БД template1, а не postgres...
Ну и если мы хотим работать далее с новой базой, то конечно нужно сделать реконект.
« Последнее редактирование: Октябрь 19, 2009, 08:11 от BaltikS » Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #12 : Октябрь 19, 2009, 11:35 »

Цитировать
В одной СУБД может быть гипотетически не ограниченное кол-во БД.

Это чудо философской мысли мне непонятно. Если считаете что фраза порлна смысла раскройте мне ее буду коллег поучать :-)

На счет создания базы - мне кажется способ подключения сначала к ненужной, а потом создание нужной - кривым, хотя я удивлен что так работает. Но мне этот вариант не интересен - например человек установил мою программу которая работает с БД и программа должна при первом запуске создать базу. И к какой временной базе я подключусь? А если таскать временную с собой в дистрибутиве программы, то зачем можно и болванку рабочей таcкать обновив при первом запуске и дав нужное имя. Кстати вас не смущает что вы не указываете в каком месте файловой системы создасться БД? или указвываете - в коде не увидел этого.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


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


Просмотр профиля WWW
« Ответ #13 : Октябрь 19, 2009, 11:45 »

При чем тут постгрес и указание расположения БД?
А на счет того, что нужно сначала в ненужную приконнектится, а потом уже создать новую базу, большого костыля не вижу. Просто так подсоединится, не указывая конкретную БД, на сколько я знаю, невозможно. А БД postgres создается при инсталлировании самого постгреса. Как вариант, можешь в инсталлятор своей софтины положить psql.exe и запустить его с параметром создания твоей БД.
« Последнее редактирование: Октябрь 19, 2009, 11:50 от panter_dsd » Записан

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

Таскать с собой базу не придется, например в Postgre после выполнения команды:
Код
DOS
c:\pg\bin\initdb.exe -D c:\pg\data
, автоматически создается база postgre.
Записан
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


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