Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> DBF:ошибка в добавлении данных в поле типа NUMERIC, ошибка при экспорте в DBF 
:(
    Опции темы
PittOn
  Дата 23.4.2009, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 18.11.2005

Репутация: нет
Всего: нет



Доброго времени суток!
Проблема при добавлении в DBF таблицу числовых данных в поля типа NUMERIC.
Средствами ADO создаю DBF файл и добавляю в него данные, выбранные из другой базы (.gdb).
Строка подключения к DBF: "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=D:\dbase\;Extended Properties=dBase 5.0;"
При добавлении данных в поля типа CHAR все нормально, но когда добавляешь именно числовые данные в поле типа NUMERIC - выдает ошибку:
Run-time error '-2147217887 (80040e21)': Размер поля недостаточен, чтобы принять добавляемые данные. Попробуйте вставить меньшее количество данных.
Не пойму, в чем причина, ведь при создании таблицы я явно указываю разрядность числового поля.. Вот кусок кода, где создается таблица DBF:


Код


Set cn1 = New ADODB.Connection
cn1.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=D:\dbase\;Extended Properties=dBase 5.0;"
ssql = "CREATE TABLE inv_cnt.dbf (NOPER   CHAR(8), " & _
                                 "DTOPER  DATETIME, " & _
                                 "FIOOPER CHAR(50), " & _
                                 "ADROPER CHAR(80), " & _
                                 "SMOPER  NUMERIC(10,2), " & _
                                 "ABCOUNT CHAR(20), " & _
                                 "NMFIRME CHAR(80), " & _
                                 "NMPLAT  CHAR(160))"

cn1.Execute (ssql)



Далее добавляю данные в эту DBF-ку, предварительно открыв еще соединение с базой gdb и взяв оттуда нужные данные:

Код


Set cn = New ADODB.Connection
cnString = "provider=LCPI.IBProvider;data source=D:\gdb\mygdb.gdb;ctype=win1251;user id=admin;password=admin"
cn.ConnectionString = cnString
cn.Open

Set rs = New ADODB.Recordset

ssql = "select NOPER, DTOPER, FIOOPER, ADROPER ,SMOPER, ABCOUNT, NMFIRME, NMPLAT, REMOPER from PLATEZHI"
       
cn.BeginTrans
rs.Open ssql, cn, adOpenStatic, adLockOptimistic, adCmdText
cn.CommitTrans

Set rs1 = New ADODB.Recordset
rs1.Open "SELECT * FROM inv_cnt.dbf", cn1, adOpenKeyset, adLockOptimistic, adCmdText

rs.MoveFirst
For i = 1 To rs.RecordCount
    rs1.AddNew
    
    rs1!NOPER = rs!NOPER
    rs1!DTOPER = rs!DTOPER
    rs1!FIOOPER = rs!FIOOPER
    rs1!ADROPER = rs!ADROPER
    rs1!SMOPER = rs!SMOPER      'вот в этой строке при присвоении значения rs!SMOPER выдает указанную выше ошибку. Значения маленькие, например 2.50, 3.14 и т.д. Это явно меньше 10 знаков, которые были указаны при задании размерности поля. Если поле SMOPER не заполнять, остальные данные ложатся нормально.
    rs1!ABCOUNT = rs!ABCOUNT
    rs1!NMFIRME = rs!NMFIRME
    rs1!NMPLAT = rs!NMPLAT

     
    rs1.Update
    rs.MoveNext
Next i



Все классно работает, если задать полю SMOPER символьный тип, но такого я делать не буду. Нужно число.
Записи также добавляются, если я в строке подключения вместо dBase 5.0 указываю dBase IV или dBase III,
но тогда формат поля SMOPER получается с пятью знаками после запятой, какую бы я точность при создании DBF таблицы не ставил..

Есть какие-нибудь мысли насчет добавления числовых данных в таблицу dBase 5.0? Мож кто сталкивался с подобным?
Или подскажите пожалуйста, как сделать так, чтоб при создании DBF таблицы версии IV или III создавались числовые поля с нужной точностью (в данном случае 2 знака после запятой).

Заранее спасибо!
PM MAIL ICQ   Вверх
Данкинг
Дата 23.4.2009, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: нет
Всего: 130



Цитата(PittOn @  23.4.2009,  19:22 Найти цитируемый пост)
Provider=Microsoft.Jet.OLEDB.4.0;" 

А с какой стати с DBF стали работать через Microsoft.Jet. ? smile 

Далее: какой размер числа, которое ты пытаешься засунуть в numeric ? Попробуй задать ему (полю) максимальный размер, 20. И вообще, в DBF типы полей обозначаются C или N. smile 


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
PittOn
Дата 23.4.2009, 19:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 18.11.2005

Репутация: нет
Всего: нет



Через Microsoft.Jet.OLEDB.4.0 нормально работаю с DBF-ками.. Данные то добавляются, но только в поля типа CHAR, а в NUMERIC - ни в какую.. :(
Засовываю значение максимум содержащие 5 символов. даже простое число 1 не присваивается..
Если типы полей указывать как C или N, тогда при создании таблицы выдает ошибку.. А так как у меня они объявлены - DBF-ка создается..
Задавая полю таблицы dBase 5.0 макс. размер 20, то поле все равно создается с размером 16 знаков...

PM MAIL ICQ   Вверх
Данкинг
Дата 23.4.2009, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: нет
Всего: 130



В общем, я с DBF работаю черехз драйверы фокса (правда, из Дельфи, но суть та же), и у меня всё, мною перечисленное, работает нормально. Данные же я вставляю запросом (через AdoQuery).


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
PittOn
Дата 24.4.2009, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 18.11.2005

Репутация: нет
Всего: нет



Вот вот... я уже попробовал повставлять данные запросом..:

Код


rs.MoveFirst
For i = 1 To rs.RecordCount
 
  ssql = "INSERT INTO inv_cnt.dbf (NOPER, DTOPER, FIOOPER, ADROPER, SMOPER, ABCOUNT, NMFIRME, NMPLAT) Values ('" & rs1!NOPER & "', '" & rs1!DTOPER & "', '" & rs1!FIOOPER & "', '" & rs1!ADROPER & "', " & rs1!SMOPER & ", '" & rs1!ABCOUNT & "', '" & rs1!NMFIRME & "', '" & rs1!NMPLAT & "')"
        
  cn1.Execute (ssql)

   rs.MoveNext

Next i




Работает с пол-оборота.  Это радует, но таблицы большие и вставка данных запросами INSERT INTO почему-то длится заметно дольше, чем тем через rs.AddNew...rs.Update. Поэтому пытаюсь обойти вставку с помощью запросов...

PM MAIL ICQ   Вверх
Akina
Дата 24.4.2009, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 34
Всего: 454



UpdateBatch


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
PittOn
Дата 24.4.2009, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 18.11.2005

Репутация: нет
Всего: нет



Цитата

UpdateBatch


Не спасает
PM MAIL ICQ   Вверх
Akina
Дата 24.4.2009, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 34
Всего: 454



Попробовал, кстати - поле SMOPER получается не (10,2), а (20,2)  smile

Добавлено через 6 минут и 9 секунд
Разобрался. Драйвер требует в качестве разделителя целой и дробной частей запятую - из локали, видимо... так что
Код

rs1!SMOPER = Replace(CStr(rs!SMOPER), ".", ",")



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
PittOn
Дата 24.4.2009, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 18.11.2005

Репутация: нет
Всего: нет



Akina
Нет, дело не в этом.. Что то тут странное...
Если сделать как ты пишешь

Код

rs1!SMOPER = Replace(CStr(rs!SMOPER), ".", ",")


 то тогда ошибка остается. У меня в настройках рег. стандартов в качестве разделителя стоит "," . если поменять на точку - пишет "Несовпадение типов".
Далее, я заметил, что даже целое число не удается вставить. Пробовал тупо rs1!SMOPER = 1. Прокатывает только одно: вставка значения Null (rs1!SMOPER = Null). А если шаг влево, швг вправо - ошибка -2147217887 (80040e21) либо несовпадение типов :(

Насчет размера поля... Тут тоже я удивился: у тебя поле (20,2) получается если задать размер (10,2)? Правильно я понял? А у меня какую бы размерность поля я не задавал, у меня оно получается 16,2...Вот

Это сообщение отредактировал(а) PittOn - 24.4.2009, 17:32
PM MAIL ICQ   Вверх
Akina
Дата 24.4.2009, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 34
Всего: 454



Цитата(PittOn @  24.4.2009,  18:28 Найти цитируемый пост)
Если сделать как ты пишешь
[skipped]
 то тогда ошибка остается.
Странно... у меня работает на "ура"... правда, я вставляю статические данные, типа
Код
dblDummy=123.45
rs1!SMOPER = Replace(CStr(dblDummy), ".", ",")
но разницы быть не должно... походу сколько версий драйвера, столько и закидонов.

SP. Я использовал либу ADO 2.8.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
PittOn
Дата 24.4.2009, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 18.11.2005

Репутация: нет
Всего: нет



гыгы...  smile  я тоже пробовал статические данные присваивать... и ни в какую.. У меня тоже используется ADO 2.8. А не может ли быть какая-то загвоздка в BDE? Или при подключении через Microsoft Jet драйвер BDE не причем?
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "VB6"
Akina

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по VB обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • Используйте теги [code=vb][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB6 | Следующая тема »


 




[ Время генерации скрипта: 0.1942 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.