Здравствуйте, подскажите пожалуйста, как можно реализовать копирование строки из одной таблицы БД в другую по команде (с помощью кнопки или двойного клика по строке или с помощью других вариантов). Единственное что получилось на QT, это выполнение запросов к БД на sql.
в слоте щелчка по кнопке определяешь первичный ключ строки (какой?) из одной таблицы.
Затем делаешь SQL-запрос на вставку такого вида:
INSERT INTO TABLE2 (<тут через запятую поля строки>)
VALUES (
SELECT * FROM TABLE1
WHERE <имя первичного ключа>=:pk)
где :pk подстановочное имя используемое в QSqlQuery::prepare() и QSqlQuery::bind() а значение его ты его определил чуть раньше.
буду пробовать, спасибо.
можете написать примерно, что в слот вписывать и в получателя. сижу с учебником, ничерта не выходит.
можете написать примерно, что в слот вписывать и в получателя. сижу с учебником, ничерта не выходит.
Ты напиши структуры сових таблиц, точнее SQL с помщью которого ты их создаёшь.
Наверное таблица получатель..
скорее всего в "слот" вписывать имена полей которые треббуется скопировать через запятую.. "field1,field2,field3" - это писать вместо *(звёздочка)
А вот в "получателя" соотвественно поля в которые будут писаться эти самые значения.. "field3,field5,field7" - это писать вместо <тут через запятую поля строки>
А вобще если тебе потребовались данные операции, следует задуматься над архитектурой базы данных..
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();
}
sundreamer, плохая затея писать весь код в функции main.
Тебе нужно создать класс, в котором будет описано окно приложения. Класс этот простой наследник QWidget. Смотри примеры Qt из каталога %QTDIR%\examples\sql\
у меня ощущение что sqlite не поддрживает вложенные запросы, оно же поддерживает?..
почему-то при выполнении такогово вот запроса
INSERT INTO addressbook1 (name, phone, email)
VALUES (
SELECT name, phone, email FROM addressbook2
WHERE number = 1)
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
}
Далее по теме Как поймать строку из таблицы QTableView (обычным выделением), над которой надо выполнить какие-либо действия? ID ее узнать или как-то иначе?
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)