Rambler's Top100
Форум: MS ACCESSVBVBA MS OfficeMS SQL server
Новые сообщения: 0000

Форум: VBA MS Office

Программирования для MS Office кроме ACCESS

Обновить визитку
Участники «Online»
Все участники

 
 

Доброго времени суток, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как узнать тип поля в таблице. Кто знает??
 
 автор: akkorn   (13.11.2012 в 11:21)   личное сообщение
2 Кб.
 
 

Всем прифф :)
Люди, программеры уважаемые, подскажите. Я в ступоре..

Есть некая таблица в БД Access. В таблице есть поле. У поля есть тип.
Если подключиться DAO, то тип поля Single будет = 6 (dbSingle)
Если подключиться ADODB, то тип поля 6 будет уже значиться как adCurrency. В то время как в АДО есть тип поля adSingle и равен он 4!

В связи с этим вопрос: Как подключаясь при помощи ДАО и АДО в обоих случаях корректно определять тип поля в таблице? Ведь таких несоответствий довольно много..

Код таков:
Private Sub Command1_Click()
Dim PthToDB As String
PthToDB = App.Path & "\db_Temp.db"

Dim DbE As DAO.DBEngine, DbS As DAO.Database
Set DbE = New DAO.DBEngine

'удаляем старую, если есть
On Error Resume Next
Call Kill(PthToDB)
On Error GoTo 0

'создаем новую базу заново
Set DbS = DbE.CreateDatabase(PthToDB, dbLangGeneral, dbVersion40)

'переменные для работы
Dim tdf As DAO.TableDef
Set tdf = New DAO.TableDef
Set tdf = DbS.CreateTableDef("Table_1")

Dim fld As DAO.Field
Set fld = New DAO.Field

With tdf
    'надо создать поля..
    Set fld = .CreateField("Field_1", dbSingle)
    .Fields.Append fld

    'добавл такую таблицу в общ коллекцию
    DbS.TableDefs.Append tdf
    DbS.TableDefs.Refresh
End With

'вернемся к полю
Set fld = DbS("Table_1").Fields("Field_1")

'теперь проверим поле на тип
Dim i As String
i = "fld.Type is [DAO.dbSingle]?    " & vbTab & CBool(fld.Type = DAO.dbSingle) & vbCrLf & _
    "fld.Type is [ADODB.adSingle]?" & vbTab & CBool(fld.Type = ADODB.adSingle)
MsgBox i

'схлопываем все
Set fld = Nothing
Set tdf = Nothing
DbS.Close
Set DbS = Nothing
Set DbE = Nothing
End Sub

  Ответить  
 
 автор: akkorn   (13.10.2013 в 22:36)   личное сообщение
 
 

Неужели мыслефф нет?

  Ответить  
 
 автор: час   (18.10.2013 в 16:03)   личное сообщение
 
 

Надо использовать тока одну из моделей
либо
АДО ЛИБО ДАО

  Ответить  
 
 автор: akkorn   (18.10.2013 в 18:29)   личное сообщение
 
 

Логично. Но бывает так, что нужны обе.
К примеру, в ДАО мне проще строить SQL-запросы. А АДО тоже бывает полезен и может предоставить отутствующие функции ДАО. Например, АДО предоставляет информацию о выигрыше места при сжатии базы (если запросить параметр "Jet OLEDB:Compact Reclaimed Space Amount"), ну и другие плюшки.. Разница в подключениях, и в строении строки запроса меня не пугают.

По сему хотел научиться безошибочно определять тип поле не зависимо от подключения...

На самом деле вопрос открыт: ответа я пока не знаю и стараюсь работать с полями тока с-под ДАО...

  Ответить  
 
 автор: Дядя Федор   (21.10.2013 в 14:22)   личное сообщение
 
 

Может так:
With rst

For j = 0 To rst.Fields.Count - 1

Debug.Print .Fields(j).Properties("NAME"), .Fields(j).Properties("TYPE")
next

Ну и там прилепить .Fields(j).Properties("TYPE") куда надо.

  Ответить  
 
 автор: akkorn   (22.10.2013 в 16:28)   личное сообщение
 
 

to Дядя Федор
К сожалению не прокатывает.

В итоге выходит, что при подключениях из АДО и из ДАО типы полей различны:

DAO.dbSingle = 6
ADODB.adSingle = 4

и сответствено если подключаться из-под ДАО, то ответ будет =6,
а если из-под АДО, то 4.

Private Sub Command2_Click()
'ADO
Dim PthToDB As String
PthToDB = App.Path & "\db_Temp.db"

Dim aConn As ADODB.Connection, aRs As ADODB.Recordset
Set aConn = New ADODB.Connection
aConn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & PthToDB
aConn.Mode = adModeRead
aConn.Open

Set aRs = aConn.Execute("SELECT * FROM Table_1;", , adCmdText)

Dim fld As ADODB.Field
Set fld = aRs("Field_1")

MsgBox fld.Type

'схлопываем все
Set fld = Nothing
aRs.Close
Set aRs = Nothing
aConn.Close
Set aConn = Nothing
End Sub


p.s. Естественно что перед запуском Command2 мы должны запустить Command1 из первого поста- именно в ней создается БД с таблицей и полем.

  Ответить  
HiProg.com - Технологии программирования
Rambler's Top100 TopList