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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Ms Sql Server 2000 + Qt + Odbc  (Прочитано 3915 раз)
strength2008
Гость
« : Апрель 23, 2011, 08:30 »

Ответа в предыдущей теме, видимо, не будет. Возможно, надо сформулриовать по-другому вопрос.
Итак, в связке Ms Sql Server 2000 + Qt + Odbc у меня есть форма редактирования данных БД, в которой поля редактирования Edit -ы и 1 ComboBox связаны QWidgetMapper -ом с соответствующими полями БД. Код банален, но на всякий случай приведу и его.
Таблица, с которой я работаю в форме, создавалась в SQL Servere вручную,  но описать ее можно следующим скриптом:
Код:
query.exec("CREATE TABLE employee ("
               "id INTEGER PRIMARY KEY AUTOINCREMENT, "
               "name VARCHAR(40) NOT NULL, "
               "departmentid INTEGER NOT NULL, "
               "extension INTEGER NOT NULL, "
               "email VARCHAR(40) NOT NULL, "
               "startdate DATE NOT NULL, "
               "FOREIGN KEY (departmentid) REFERENCES department)");

Т.е. таблица с внешним ключом.
Поэтоиу использовалась далее QSqlRelationalTableModel:

Код:
tableModel = new QSqlRelationalTableModel(this);
    tableModel->setTable("employee");
    tableModel->setRelation(Employee_DepartmentId,
                            QSqlRelation("department", "id", "name"));
    tableModel->setSort(Employee_Name, Qt::AscendingOrder);
    tableModel->select();

далее идет привязка через Mapper:

Код:
mapper = new QDataWidgetMapper(this);
    mapper->setSubmitPolicy(QDataWidgetMapper::AutoSubmit);
    mapper->setModel(tableModel);
    mapper->setItemDelegate(new QSqlRelationalDelegate(this));
    mapper->addMapping(nameEdit, Employee_Name);
    mapper->addMapping(departmentComboBox, Employee_DepartmentId);
    mapper->addMapping(extensionLineEdit, Employee_Extension);
    mapper->addMapping(emailEdit, Employee_Email);
    mapper->addMapping(startDateEdit, Employee_StartDate);

Когда у меня готовые записи внесены в БД ручками, то маппер работает вполне сносно - редактирование готовых записей и навигация по ним нормально проходит. Но вот когда начинает выполняться слот формы по добавлению новой записи в таблицу

Код:
void EmployeeForm::addEmployee()
{
    int row = mapper->currentIndex();
   if (! mapper->submit())
    {
       QMessageBox::warning(0, QObject::tr("Database Error"),
                            tableModel-> lastError().text());
   }
   tableModel->insertRow(row);

    mapper->setCurrentIndex(row);

    nameEdit->clear();
    emailEdit->clear();
    extensionLineEdit->clear();
    startDateEdit->setDate(QDate::currentDate());
    nameEdit->setFocus();
}

mapper всегда возвращает false, и соответственно
в MessageBox выводится следующая ошибка:
QODBCResult::exec: unable to bind variable: "[Microsoft][ODBC SQL Server Driver]Дополнительная возможность не реализована"

В общем, я перечитал весь этот форум, посвященный БД+Qt, и ответа на этот вопрос не нашел. Уже третий день этот вопрос висит. Помогите люди добрые и знающие, пожалуйста.
« Последнее редактирование: Апрель 23, 2011, 08:33 от strength2008 » Записан
Странник
Гость
« Ответ #1 : Апрель 23, 2011, 08:39 »

дело в том, что драйвер ODBC не реализует возможность bind'а переменных типа дата-время. когда редактирование работало, ты, видимо, не изменял это поле. корректная работа возможна с датой в строковом формате ISO: date.toString(Qt::ISODate).
Записан
strength2008
Гость
« Ответ #2 : Апрель 23, 2011, 11:29 »

Большое спасибо за ответ.

Во-первых, что самое странное, когда готовые записи редактируешь в форме, то и дату вполне спокойно поменять можно.
Трабла возникает только тогда, когда приходится новую запись добавлять, т.е. вызывать mapper->submit().
Ну да ладно, действительно, снес с формы Edit, который работал с датой и связывание маппера с полем БД типа "дата" удалил, и теперь данные более-менее нормально вносятся в БД.
1)Тоесть как я понял, когда драйвер ODBC, связать DataEdit с маппером не выйдет. Поправьте меня, если выход все же какой-то есть. Ведь явное преобразование к типу строка в поле DateEdit не сделаешь!

2)Но решив одну проблему, натолкнулся на другую. Данные теперь хоть и добавляются, но как-то интересно - новые внесенные записи иногда дублируют существующие записи в БД. Т.е. к примеру была у меня 1 одна запись-
3 Иванов   17   2323   ivanov@mail.ru

Потом я добавил вторую -
4 Петров  12   2666    petrov@yandex.ru

Закончил я редактирование второй записи, решил перейти на первую, а потом снова вернулся на вторую. И вторая запись представляет собой копию первой, т.е.
3 Иванов   17   2323   ivanov@mail.ru

Такое происходит не каждый раз, но часто. Что это может быть?
« Последнее редактирование: Апрель 23, 2011, 11:33 от strength2008 » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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