Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Копирование строки из т1 в т2 по команде.
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Разработка баз данных
sundreamer
Здравствуйте, подскажите пожалуйста, как можно реализовать копирование строки из одной таблицы БД в другую по команде (с помощью кнопки или двойного клика по строке или с помощью других вариантов). Единственное что получилось на QT, это выполнение запросов к БД на sql.
Litkevich Yuriy
в слоте щелчка по кнопке определяешь первичный ключ строки (какой?) из одной таблицы.
Затем делаешь SQL-запрос на вставку такого вида:
INSERT  INTO TABLE2 (<тут через запятую поля строки>)
    VALUES (
        SELECT * FROM TABLE1
            WHERE <имя первичного ключа>=:pk)
где :pk подстановочное имя используемое в QSqlQuery::prepare() и QSqlQuery::bind() а значение его ты его определил чуть раньше.
sundreamer
буду пробовать, спасибо.
sundreamer
можете написать примерно, что в слот вписывать и в получателя. сижу с учебником, ничерта не выходит.

можете написать примерно, что в слот вписывать и в получателя. сижу с учебником, ничерта не выходит.
haiflive
Ты напиши структуры сових таблиц, точнее SQL с помщью которого ты их создаёшь.
Litkevich Yuriy
Цитата(sundreamer @ 13.6.2011, 3:03) *
что в слот вписывать и в получателя
что за получатель?
haiflive
Наверное таблица получатель..

скорее всего в "слот" вписывать имена полей которые треббуется скопировать через запятую.. "field1,field2,field3" - это писать вместо *(звёздочка)
А вот в "получателя" соотвественно поля в которые будут писаться эти самые значения.. "field3,field5,field7" - это писать вместо <тут через запятую поля строки>
А вобще если тебе потребовались данные операции, следует задуматься над архитектурой базы данных..
sundreamer
Раскрывающийся текст
static bool createConnection()
{
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName ("C:\\addressbook");
    db.setUserName("root");
    db.setHostName("Notebook");
    db.setPassword("root");
    if (!db.open()) {
        qDebug() << "Cannot open database:" << db.lastError();
        return false;
    }
    return true;
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QWidget *window = new QWidget;
    window->setWindowTitle("Sqlite COPY/PASTE");
    QPushButton *button = new QPushButton ("Copy");
    connect (button, SIGNAL(clicked()), получатель , SLOT(слот));
    button->show();

    //Соединяемся с менеджером баз данных
    if (!createConnection()) {
        return -1;
    }

    //Создаем базу
    QSqlQuery query;
    QString str = "CREATE TABLE addressbook2 ( "
                  "number INTEGER PRIMARY KEY NOT NULL, "
                  "name VARCHAR(15), "
                  "phone VARCHAR(12), "
                  "email VARCHAR(15) "
                  ");";
    if (!query.exec(str)) {
        qDebug() << "Unable to create a table";
    }
    //Добавляем данные в базу
    QString strF =
            "INSERT INTO addressbook2 (number, name, phone, email) "
            "VALUES(%1, '%2', '%3', '%4');";

    str = strF.arg("1")
          .arg("Piggy")
          .arg("+49 631322187")
          .arg("piggy@mega.de");

    if (!query.exec(str)) {
        qDebug() << "Unable to do insert operation";
    }

    str = strF.arg("2")
          .arg("Kermit")
          .arg("+49 631322181")
          .arg("kermit@mega.de");

    if (!query.exec(str)) {
        qDebug() << "Unable to do insert operation";
    }
    if (!query.exec("SELECT * FROM addressbook2;")) {
        qDebug() << "Unable to execute query - exiting";
        return 1;
    }

    //Считываем данные из базы
    QSqlRecord rec = query.record();
    int nNumber = 0;
    QString strName;
    QString strPhone;
    QString strEmail;

    while (query.next()) {
        nNumber = query.value(rec.indexOf("number")).toInt();
        strName = query.value(rec.indexOf("name")).toString();
        strPhone = query.value(rec.indexOf("phone")).toString();
        strEmail = query.value(rec.indexOf("email")).toString();
        qDebug() << nNumber << " " << strName << ";\t"
                << strPhone << ";\t" << strEmail;
    }

    QTableView view;
    QSqlTableModel model;
    model.setTable("addressbook2");
    model.select();
    model.setEditStrategy(QSqlTableModel::OnFieldChange);
    view.setModel(&model);
    view.show();

    QHBoxLayout *layout = new QHBoxLayout;
    layout->addWidget(button);
    window->setLayout(layout);
    window->show();
    return a.exec();
}
Litkevich Yuriy
sundreamer, плохая затея писать весь код в функции main.
Тебе нужно создать класс, в котором будет описано окно приложения. Класс этот простой наследник QWidget. Смотри примеры Qt из каталога %QTDIR%\examples\sql\
haiflive
у меня ощущение что sqlite не поддрживает вложенные запросы, оно же поддерживает?..
почему-то при выполнении такогово вот запроса
INSERT  INTO addressbook1 (name, phone, email)
    VALUES (
        SELECT name, phone, email FROM addressbook2
            WHERE number = 1)

прога "sqlitebrowser_200_b1_win" зависает..

я всёрано не понял что ты хотел..
вот напрмер:
connect (button, SIGNAL(clicked()), получатель , SLOT(слот));

лучше бы всё это поместить в класс QObject и там создать public slots ну и соотвественно делать что тебе надо..
class MyClass : public QObject
{
Q_OBJECT

   public slots:
   void myButton_slot();
   private:
     Q_DISABLE_COPY(MyClass)
};

MyClass::MyClass()
{
// соединем событие нажати кнопки с нашим слотом myButton_slot()
   connect (button, SIGNAL(clicked()), this , SLOT(myButton_slot()));
}

void MyClass::myButton_slot()
{
// здесь что-то делаем по команде кнопки, выполняем нужный нам sql
}

Графическая модель, - это уже другая история..

вобщем могу посоветовать почитать книги, там про сигналы и слоты всё доходчиво расписано..
Litkevich Yuriy
Цитата(haiflive @ 13.6.2011, 19:11) *
у меня ощущение что sqlite не поддрживает вложенные запросы, оно же поддерживает?..
в каждой СУБД свой синтаксис, а Склайт тем более
sundreamer
Цитата(Litkevich Yuriy @ 13.6.2011, 16:59) *
sundreamer, плохая затея писать весь код в функции main.
Тебе нужно создать класс, в котором будет описано окно приложения. Класс этот простой наследник QWidget. Смотри примеры Qt из каталога %QTDIR%\examples\sql\


для меня программирование темный лес. я из учебника взял пример с формированием бд sql и слоты я смотрел, но все равно не догоняю.
можете написать, что в слоте прописывать, с чем кнопка связана?
Litkevich Yuriy
Цитата(sundreamer @ 13.6.2011, 23:52) *
можете написать, что в слоте прописывать, с чем кнопка связана?
можем, но ты всё равно не поймёшь.
Забудь про базы данных, начинай изучть Qt от сюда
Гость_sundreamer_*
Цитата(Litkevich Yuriy @ 13.6.2011, 23:20) *
Цитата(sundreamer @ 13.6.2011, 23:52) *
можете написать, что в слоте прописывать, с чем кнопка связана?
можем, но ты всё равно не поймёшь.
Забудь про базы данных, начинай изучть Qt от сюда


таки напишите пожалуйста, я попробую разобраться.
Litkevich Yuriy
Цитата(Гость_Гость_sundreamer_*_* @ 14.6.2011, 18:06) *
таки напишите пожалуйста, я попробую разобраться.
Просто возьми за основу пример examples\sql\cachedtable, изучи его, а затем доработай.
Гость
Цитата(Litkevich Yuriy @ 14.6.2011, 16:20) *
Цитата(Гость_Гость_sundreamer_*_* @ 14.6.2011, 18:06) *
таки напишите пожалуйста, я попробую разобраться.
Просто возьми за основу пример examples\sql\cachedtable, изучи его, а затем доработай.

попробую
Гость
Далее по теме:) Как поймать строку из таблицы QTableView (обычным выделением), над которой надо выполнить какие-либо действия? ID ее узнать или как-то иначе?
Litkevich Yuriy
Цитата(Гость_Гость_* @ 20.6.2011, 13:47) *
Далее по теме Как поймать строку из таблицы QTableView
Правило многих форумов: Одна проблема - одна тема.
Прежде чем создать тему - используй поиск (в поиске нельзя набирать символов меньше 4).
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.