|
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
|
| |
|
| |
|
|
|
| Неужели мыслефф нет? | |
|
| |
|
|
|
| Надо использовать тока одну из моделей
либо
АДО ЛИБО ДАО | |
|
| |
|
|
|
| Логично. Но бывает так, что нужны обе.
К примеру, в ДАО мне проще строить SQL-запросы. А АДО тоже бывает полезен и может предоставить отутствующие функции ДАО. Например, АДО предоставляет информацию о выигрыше места при сжатии базы (если запросить параметр "Jet OLEDB:Compact Reclaimed Space Amount"), ну и другие плюшки.. Разница в подключениях, и в строении строки запроса меня не пугают.
По сему хотел научиться безошибочно определять тип поле не зависимо от подключения...
На самом деле вопрос открыт: ответа я пока не знаю и стараюсь работать с полями тока с-под ДАО... | |
|
| |
|
|
|
| Может так:
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") куда надо. | |
|
| |
|
|
|
| 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 из первого поста- именно в ней создается БД с таблицей и полем. | |
|
| |