Russian Qt Forum

Qt => Базы данных => Тема начата: nixman05 от Март 27, 2010, 23:04



Название: Частичное записывание данных
Отправлено: nixman05 от Март 27, 2010, 23:04
Здравствуйте.

Использую QODBC для работы с FoxPro (необходимость поддержки старой системы)
Возникли некоторые ошибки при добавлении данных в таблицу.
Таблица имеет следующню структуру:

ID              N             8
TN             N             8
FAM           C             30
NAME         C             12
OTCH         C             15
birthdate    D             8     
adr            C             100
sex            C             3

Данные добавляются следующим образом

Код
C++ (Qt)
 QString s_query="insert into person (ID, TN, fam, name, otch, birthdate, adr, grazd, sex )"
                 "values (:id, :TN, :fam, :name, :otch, :birthdate, :adr, :grazd, :sex )";
 query->prepare(s_query);
 query->bindValue(":id",number_id);
 query->bindValue(":TN",tableNumber);
 query->bindValue(":fam",fam.toLacal8Bit);
 query->bindValue(":name",name.toLocal8Bit());
 query->bindValue(":otch",otch.toLocal8Bit());
 query->bindValue(":birthdate",date);
 query->bindValue(":adr",adr);
 query->bindValue(":grazd",grazd);
 query->bindValue(":sex", sex);
 query->exec();
 

Запрос отрабатывает но в таблицу добавляется только id, fam, name и otch. Остальные поля остаются пустыми. В чём может быть ошибка и как ее устранить?
Заранее благодарен.



Название: Re: Частичное записывание данных
Отправлено: lit-uriy от Март 28, 2010, 00:47
>>только id, fam, name и otch.
Кореляция такова:
записываются целые числа и переменные для которых вызывается метод toLocal8Bit()

Какие типы имеют переменные date, adr, grazd, sex?


Название: Re: Частичное записывание данных
Отправлено: nixman05 от Март 28, 2010, 01:20
>>только id, fam, name и otch.
Кореляция такова:
записываются целые числа и переменные для которых вызывается метод toLocal8Bit()

Какие типы имеют переменные date, adr, grazd, sex?

date QDate
adr QString (также вызывал toLocalBit)
grazd QString
sex QString

Да и TN имеет тип int, но в отличае от id не записывается.


Название: Re: Частичное записывание данных
Отправлено: Пантер от Март 28, 2010, 10:38
Как создаешь подключение? У меня таких проблем не было.


Название: Re: Частичное записывание данных
Отправлено: nixman05 от Март 28, 2010, 11:28
Подключение создается следубщим образом:
Код
C++ (Qt)
 QSqlDatabase db=QSqlDatabase::addDatabase("QODBC","kadrfox");
 db.setDatabaseName(QString("DRIVER={Microsoft Visual FoxPro Driver};SourceType=DBF;SourceDB=%1").arg(base_name));
 if(!db.open())
  {
      QMessageBox::warning(0,"",db.lastError().text());
      return db.lastError().number();
  }
  QSqlQuery *query=new QSqlQuery(db);
 
 


Название: Re: Частичное записывание данных
Отправлено: Пантер от Март 28, 2010, 12:49
Попробуй вот так:
DRIVER={Microsoft dBase Driver (*.dbf)};FIL={dBase III;};DefaultDir=каталог_с_нужным_файлом


Название: Re: Частичное записывание данных
Отправлено: nixman05 от Март 28, 2010, 15:25
Попробуй вот так:
DRIVER={Microsoft dBase Driver (*.dbf)};FIL={dBase III;};DefaultDir=каталог_с_нужным_файлом

Получена ошибка при подключении:
[Microsoft][Драйвер ODBC dBase] Внешняя таблица не имеет предполагаемый формат. QODBC3: Unable to execute statement

P.S. Если это немного прояснит ситуацию то таблицы, к которым я обращають созданы в Visual FoxPro, хотя ,насколько я помню, dbf форматы различаются только memo-полями.


Название: Re: Частичное записывание данных
Отправлено: Пантер от Март 28, 2010, 16:00
Нет, форматы различаются не только мемо полями. Приложи сюда пример файла.


Название: Re: Частичное записывание данных
Отправлено: nixman05 от Март 28, 2010, 17:09
Попробовал пересоздать таблицу : добавились все поля. В таблище еще имеются несколько служебных полей, будут ли добавляться данные при их наличии?

P.S. А чем еще различаются различные форматы dbf помимо memo-полей?


Название: Re: Частичное записывание данных
Отправлено: Пантер от Март 28, 2010, 19:01
Попробовал пересоздать таблицу : добавились все поля. В таблище еще имеются несколько служебных полей, будут ли добавляться данные при их наличии?

P.S. А чем еще различаются различные форматы dbf помимо memo-полей?
Про служебные поля не понял, расшифруй.
Отличаются параметрами в заголовке файла. В формат Clipper строка увеличена в 2 раза. Поищи в интернете описания.


Название: Re: Частичное записывание данных
Отправлено: nixman05 от Март 30, 2010, 19:01
Кажись нашел в чм была ошибка.
Дело в том, что при добавлении не во все поля, для полей с данными, которые следуют за пустыми полями, данные поля так же не заполняются.


Название: Re: Частичное записывание данных
Отправлено: panAlexey от Апрель 02, 2010, 23:40
P.S. А чем еще различаются различные форматы dbf помимо memo-полей?
Вообще их 7 разновидностей....


Название: Re: Частичное записывание данных
Отправлено: Пантер от Апрель 03, 2010, 10:20
P.S. А чем еще различаются различные форматы dbf помимо memo-полей?
Вообще их 7 разновидностей....
Вообще их намного больше.


Название: Re: Частичное записывание данных
Отправлено: panAlexey от Апрель 07, 2010, 07:05
P.S. А чем еще различаются различные форматы dbf помимо memo-полей?
Вообще их 7 разновидностей....
Вообще их намного больше.
Type of file:
-FoxBASE
-FoxBASE+/dBASE III PLUS, no memo
-Visual FoxPro
-dBASE IV SQL table files, no memo
-dBASE IV SQL system files, no memo
-FoxBASE+/dBASE III PLUS, with memo
-BdBASE IV with memo
-dBASE IV SQL table files, with memo
-FoxPro 2.x (or earlier) with memo


Название: Re: Частичное записывание данных
Отправлено: Пантер от Апрель 07, 2010, 11:28
Clipper забыл.