powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Типы полей в FoxPro и ADODB.
10 сообщений из 10, страница 1 из 1
Типы полей в FoxPro и ADODB.
    #32706338
Артем1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день, уважаемые.
Не подскажите источник, в котором описано соответствие типов полей в FoxPro (dbf) и ADODB.DataTypeEnum?

Спасибо.
...
Рейтинг: 0 / 0
Типы полей в FoxPro и ADODB.
    #32706474
leaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а с кем вообще сязываетесь из фокса
и вообще что-то не совсем понятно про что речь
http://support.microsoft.com/default.aspx?scid=kb%3Ben-us%3B812916
...
Рейтинг: 0 / 0
Типы полей в FoxPro и ADODB.
    #32706912
ABsada
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Когдато писал процедуру по конвертации фокс курсора в рекордсет.
Тут соответствие определял по наитию, по этому за правельность не ручаюсь, но у меня работает.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
PROCEDURE Convert_Cursor_to_ADORecordset 

 LPARAMETERS  m.cur_name,rs_

* m.cur_name - Алиас курсора который надо загнать в рекордсет
* rs_ - созданный пустой рекордсет  rs = CREATEOBJECT("ADODB.Recordset")

 PRIVATE ca,m.str_


IF rs_.State<> 0  Then
	rs_.close
Endif	

rs_.CursorType=  3   && adOpenStatic    

m.str_=""
IF USED(m.cur_name)
	gnFieldcount = AFIELDS(gaMyArray)  && Create array.
	FOR nCount =  1  TO gnFieldcount 
		*adFldIsNullable =  32 
		DO CASE 		
			CASE  gaMyArray(nCount, 2 )=='C'
						rs_.Fields.Append(ALLTRIM(gaMyArray(nCount, 1 )), 129 ,gaMyArray(nCount, 3 ),iif(gaMyArray(nCount, 5 ), 32 ,- 1 )) &&adChar  129 
			CASE  gaMyArray(nCount, 2 )=='D'
						rs_.Fields.Append(ALLTRIM(gaMyArray(nCount, 1 )), 133 ,,iif(gaMyArray(nCount, 5 ), 32 ,- 1 )) &&adDate -  7  , &&adDBDate =  133  
			CASE  gaMyArray(nCount, 2 )=='N'
						rs_.Fields.Append(ALLTRIM(gaMyArray(nCount, 1 )), 5 ,,iif(gaMyArray(nCount, 5 ), 32 ,- 1 )) &&adDouble
					*	rs_.Fields.Append(ALLTRIM(gaMyArray(nCount, 1 )), 131 ,gaMyArray(nCount, 3 ),iif(gaMyArray(nCount, 5 ), 32 ,- 1 )) &&adNumeric 
			CASE  gaMyArray(nCount, 2 )=='I'
						rs_.Fields.Append(ALLTRIM(gaMyArray(nCount, 1 )), 20 ,,iif(gaMyArray(nCount, 5 ), 32 ,- 1 )) &&adBigInt
			CASE  gaMyArray(nCount, 2 )=='L'
						rs_.Fields.Append(ALLTRIM(gaMyArray(nCount, 1 )), 11 ,,iif(gaMyArray(nCount, 5 ), 32 ,- 1 )) &&adBoolean
			CASE  gaMyArray(nCount, 2 )=='M'
						rs_.Fields.Append(ALLTRIM(gaMyArray(nCount, 1 )), 201 , 5000 ,iif(gaMyArray(nCount, 5 ), 32 ,- 1 )) &&adLongVarChar
			CASE  gaMyArray(nCount, 2 )=='F'
						rs_.Fields.Append(ALLTRIM(gaMyArray(nCount, 1 )), 5 ,,iif(gaMyArray(nCount, 5 ), 32 ,- 1 )) &&adDouble
			CASE  gaMyArray(nCount, 2 )=='B'
						rs_.Fields.Append(ALLTRIM(gaMyArray(nCount, 1 )), 5 ,,iif(gaMyArray(nCount, 5 ), 32 ,- 1 )) &&adDouble
			CASE  gaMyArray(nCount, 2 )=='Y'
						rs_.Fields.Append(ALLTRIM(gaMyArray(nCount, 1 )), 6 ,,iif(gaMyArray(nCount, 5 ), 32 ,- 1 )) &&adCurrency
			CASE  gaMyArray(nCount, 2 )=='T'
						rs_.Fields.Append(ALLTRIM(gaMyArray(nCount, 1 )), 133 ,,iif(gaMyArray(nCount, 5 ), 32 ,- 1 )) &&adDate -  7  , &&adDBDate =  133  
					*	rs_.Fields.Append(ALLTRIM(gaMyArray(nCount, 1 )), 134 ,,iif(gaMyArray(nCount, 5 ), 32 ,- 1 )) &&adDBTime
			CASE  gaMyArray(nCount, 2 )=='G'
						rs_.Fields.Append(ALLTRIM(gaMyArray(nCount, 1 )), 204 ,,iif(gaMyArray(nCount, 5 ), 32 ,- 1 )) &&adVarBinary
		ENDCASE 	
		m.str_=m.str_+ Alltrim(gaMyArray(nCount, 1 ))+','  && Display field names.
	ENDFOR
ELSE
	RETURN .F.	
Endif
IF LEN(ALLTRIM(m.str_))< 2  THEN 
	RETURN .F.	
Endif

m.str_=LEFT(Alltrim(m.str_),LEN(Alltrim(m.str_))- 1 )

rs_.open


ca=CreateObject("CursorAdapter")
ca.Alias='tmp_Cur1_CA_'+ALLTRIM(m.cur_name)
ca.DataSourceType ="ADO"
ca.DataSource = rs_
ca.SendUpdates=.T.
ca.UpdatableFieldList= m.str_

llReturn = ca.CursorFill(.F., .F.,  0 , rs_)
IF   Not llReturn Then
	  AERROR(laErrors)
      Err_Message(laErrors[ 2 ] ,  16 , 'CursorFill Error')
      RETURN .F.
ENDIF

SELECT(ca.Alias)
APPEND FROM DBF(ALLTRIM(m.cur_name))
GO TOP 

TABLEUPDATE( 1 ,.T.,ca.Alias)

Sclose(ca.Alias) 

ca=null

RETURN .T.

...
Рейтинг: 0 / 0
Типы полей в FoxPro и ADODB.
    #32707006
Артем1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 leaf
У меня просто стоит задача загнать набор данных из xml в dbf на vbs-е.

2 ABsada
Большое человеческое спасибо, ваш case - это как раз то, что я искал. :)
Просто я думал, что это есть в какой-то доке, и никак не мог найти в msdn-не.
Но мне ехать, а не шашечки, так что ваше "по наитию" очень кстати.
...
Рейтинг: 0 / 0
Типы полей в FoxPro и ADODB.
    #32707031
sar99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ADODB - само по себе лишь инструмент (представленный рядом
объектов) при помощи которого Вы можете соединиться с базой
(например SQL SERVER ИЛИ INTERBASE) и манипулировать данными
Уже в этих базах есть определенные форматы данных.
Но как правило с символьными данными и с числовыми проблем
быть не должно (при записи в базу ADODB само по возможности
преобразует форматы) Возможны проблемы при преобразовании
форматов дат
Например в случае INTERBASE мне для записи даты прищлось
делать следующее преобразование:
***** сохранить во временной переменной
VDATE_N=DTOC(DATE())+' '+SUBSTR(TIME(),1,5)
***** потом уже записать базу (а преобразование из символов ADODB
***** делает уже само)
IM_TAB.FIELDS('F_MODIFIED')=VDATE_N
...
Рейтинг: 0 / 0
Типы полей в FoxPro и ADODB.
    #32707698
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Не подскажите источник, в котором описано соответствие типов полей в
> FoxPro (dbf) и ADODB.DataTypeEnum?

В хелпе вестимо :)

Microsoft Visual FoxPro
-Reference
--Language Reference
---Language Reference for OLE DB Development
----Visual FoxPro OLE DB Provider Data Support

Posted via ActualForum NNTP Server 1.0
...
Рейтинг: 0 / 0
Типы полей в FoxPro и ADODB.
    #32707740
Артем1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Igor Korolyov
Это как раз то, что я искал, но никак не мог найти. Спасибо. :)

Тема закрыта.
...
Рейтинг: 0 / 0
Типы полей в FoxPro и ADODB.
    #32745059
Артем1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет еще раз. Поторопился закрывать.
Сегодня вернулся к этой теме. Не получается вставить в dbf число с знаками после запятой.

Тип поля в таблице dbf:
Код: plaintext
 N  Number  19  4

Запрос:
Код: plaintext
INSERT INTO TBL (...SMNDS...) VALUES(...?...)
Параметр для запроса на вставку (ADO 2.8, VBScript):
Код: plaintext
Set p = setCmd.CreateParameter("SMNDS", adNumeric, adParamInput,  19 )

Данные для вставки:
Код: plaintext
235883.5932

Код: plaintext
1.
2.
Ошибка:	Несоответствие типов данных в выражении условия отбора.
Код:	80040E07
Источник: 	Microsoft JET Database Engine

В такое же поле данные вида 164684.0000 вставляются без проблем.
Никаких условий отбора у меня в запросе нету.

Где я накосячил?

Спасибо.
...
Рейтинг: 0 / 0
Типы полей в FoxPro и ADODB.
    #32745493
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi Артем1!

> Сегодня вернулся к этой теме. Не получается вставить в dbf число с
> знаками после запятой.
>
> Тип поля в таблице dbf:
> N Number 19 4

Крайне нехороший тип поля. Учитывая что в фоксе при вычислениях
достигается точность лишь в 16 знаков :( Даже при вставке через Insert будет
произведено округление (в среде фокса, как оно будет в ADO я не знаю).

> Данные для вставки:
> 235883.5932

А ты уверен, что со стороны VBS всё правильно? Что там такой тип может
принимать такие значения?

И ещё - я не совсем понимаю, при чём тут
Microsoft JET Database Engine
Может это он что-то нехорошее делает? Если уж работаешь с ADO, то должен
быть VFP OLEDB Provider...

Posted via ActualForum NNTP Server 1.0
...
Рейтинг: 0 / 0
Типы полей в FoxPro и ADODB.
    #32746927
Артем1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет, Igor Korolyov

Igor Korolyov
Крайне нехороший тип поля. Учитывая что в фоксе при вычислениях
достигается точность лишь в 16 знаков :( Даже при вставке через Insert будет
произведено округление (в среде фокса, как оно будет в ADO я не знаю).


Попробовал указать параметру 16 знаков. эффект тот-же.
Это с провайдером Microsoft VFP ODBC Provider

Igor Korolyov
А ты уверен, что со стороны VBS всё правильно? Что там такой тип может
принимать такие значения?


Тип adNumeric, это по MSDN
Код: plaintext
Indicates an exact numeric value with a fixed precision and scale (DBTYPE_NUMERIC).

пробовал вручную задавать precision and scale, не помогает.

Так же пробовал тип adDecimal. Никакого эффекта

Igor KorolyovМожет это он что-то нехорошее делает? Если уж работаешь с ADO, то должен
быть VFP OLEDB Provider...


Скачал и поставил этот провайдер, хотя очень хотелось обойтись стандартными встроенными средствами. Теперь все вставляется на ура, но в любые числовые поля пишется 0.000000000000000E+0, хотя данные есть и до этого они нормально вставлялись. С текстом и датами нет проблем (да и не было).


Не знаю, чего еще попробовать.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Типы полей в FoxPro и ADODB.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]