[R] COM erreur 80020009 sur $cat.Tables.Append($Tb)
Posté : ven. 22 mai 2009 06:58
Bonjour,
Débutant en AutoIt, je cherche à migrer mes précédents codes VB / VBA en AutoIt. J'ai un pb (générique) pour lier une table d'une base mdb (Access) dans une autre base mdb.
Je plante systématiquement sur la ligne $adox_catalog.Tables.Append($adox_table) .
J'ai déjà cherché une solution dans les forums Français / Américain / Allemand et Google sans succès. Les UDF trouvés (Access.au3 et AccessCom.au3) ne contiennent pas de code pour effectuer des LinkTables.
Pour info le code en VB suivant fonctionne parfaitement dans un vbs / wsf:
J'ai alors fait les tests suivants:
1er test) en utilisant le DAO ---> Celà fonctionne avec le code ci-dessous !
2eme test) En créant une table locale (pour tester la commande $adox_catalog.Tables.Append($adox_table) ---> Celà fonctionne avec le code ci-dessous !
Je ne vois vraiment pas ce qui cloche dans mon premier code.....
Quelqu'un aurait il LA solution ?
Débutant en AutoIt, je cherche à migrer mes précédents codes VB / VBA en AutoIt. J'ai un pb (générique) pour lier une table d'une base mdb (Access) dans une autre base mdb.
Je plante systématiquement sur la ligne $adox_catalog.Tables.Append($adox_table) .
J'ai déjà cherché une solution dans les forums Français / Américain / Allemand et Google sans succès. Les UDF trouvés (Access.au3 et AccessCom.au3) ne contiennent pas de code pour effectuer des LinkTables.
Code : Tout sélectionner
; ----------------------------------------------------------------------------
; AutoIt Version : 3.3.0.0
; Auteur: pw93 at live point fr
; Date : 2009-05-22
; Fonction du Script :
; Lier la table Access ZIPTPW01.ZIPTPW01 en tant que CUSTOMER.ZIPTPW01
; --> Se plante sur la ligne : $adox_catalog.Tables.Append($adox_table)
;
; err.description : COM Erreur 80020009 Multiple-step OLE DB operation generated errors.
; err.source : Microsoft JET Database Engine
; err.windescription : .... des caractères en chinois....
; ----------------------------------------------------------------------------
Global $oMyError = ObjEvent("AutoIt.Error", "MyErrFunc")
Local $CustomerMdbPath = "c:\$user\$user"
Local $CustomerMdbName = "CUSTOMER"
Local $CustomerTbName = "CLITPW00"
Local $ZipfooMdbPath = "c:\$user\$user"
Local $ZipfooMdbName = "ZIPTPW01"
Local $ZipfooTbName = "ZIPTPW01"
_TestAddLinkedTable($ZipfooMdbPath, $ZipfooMdbName, $ZipfooTbName, $CustomerMdbPath, $CustomerMdbName, "ZIPTPW01")
Exit
;--------------------------------------- Functions ---------------------------
Func _TestAddLinkedTable($LinkedMdbPath, $LinkedMdbName, $LinkedTbName, $MdbPath, $MdbName, $TbName)
Dim $conn
$conn = ObjCreate("ADODB.Connection")
$conn.Open( _
"Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & $MdbPath & "\" & $MdbName & ".mdb" & ";" & _
"Jet OLEDB:Engine Type=5;")
Dim $adox_catalog
$adox_catalog = ObjCreate("ADOX.Catalog")
$adox_catalog.ActiveConnection() = $conn
Dim $adox_table
$adox_table = ObjCreate("ADOX.Table")
With $adox_table
.Name = $TbName
.ParentCatalog = $adox_catalog
.Properties("Jet OLEDB:Link Datasource").Value = $LinkedMdbPath & "\" & $LinkedMdbName & ".mdb"
.Properties("Jet OLEDB:Remote Table Name").Value = $LinkedTbName
.Properties("Jet OLEDB:Create Link").Value = True
EndWith
[color=#FF0000]$adox_catalog.Tables.Append($adox_table)[/color]
$adox_table = ''
$adox_catalog = ''
$conn.Close
$conn = ''
EndFunc ;==>_TestAddLinkedTable
Code : Tout sélectionner
Sub AddLinkedTable(ByVal LinkedMdbPath, ByVal LinkedMdbName, ByVal LinkedTbName, ByVal MdbPath, ByVal MdbName, ByVal TbName)
Dim cnn
Set cnn = CreateObject("ADODB.Connection")
cnn.Open ("Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & MdbPath & "\" & MdbName & ".mdb" & ";" & _
"Jet OLEDB:Engine Type=5;")
Dim adox_catalog
Set adox_catalog=CreateObject("ADOX.Catalog")
Dim adox_table
Set adox_table=CreateObject("ADOX.Table")
adox_catalog.ActiveConnection() = cnn
With adox_table
.Name = TbName
.ParentCatalog = adox_catalog
.Properties("Jet OLEDB:Link Datasource").Value = LinkedMdbPath & "\" & LinkedMdbName & ".mdb"
.Properties("Jet OLEDB:Remote Table Name").Value = LinkedTbName
.Properties("Jet OLEDB:Create Link").Value = True
End With
adox_catalog.Tables.Append adox_table
Set adox_table = Nothing
Set adox_catalog = Nothing
cnn.Close
Set cnn = Nothing
End Sub
1er test) en utilisant le DAO ---> Celà fonctionne avec le code ci-dessous !
Code : Tout sélectionner
Func _DAOTestAddLinkedTable($LinkedMdbPath, $LinkedMdbName, $LinkedTbName, $MdbPath, $MdbName, $TbName)
Local $engine = ObjCreate("DAO.DBEngine.36")
Local $dbs = $engine.OpenDatabase($MdbPath & "\" & $MdbName & ".mdb", False, False)
Local $tdfLnked = ObjCreate("DAO.TableDef.36")
$tdfLinked = $dbs.CreateTableDef($TbName)
$tdfLinked.Connect = ";DATABASE=" & $LinkedMdbPath & "\" & $LinkedMdbName & ".mdb"
$tdfLinked.SourceTableName = $LinkedTbName
$dbs.TableDefs.Append($tdfLinked)
$dbs.Close
$tdfLinked = ""
$dbs = ""
$engine = ""
EndFunc ;==>_DAOTestAddLinkedTable Code : Tout sélectionner
Func _TestCreateLocalTable($MdbPath, $MdbName)
Local $adox_table = ObjCreate("ADOX.Table")
With $adox_table
.Name = "TESTNAME"
.Columns.Append("id", 3)
.Columns.Append("surname", 202, 30)
.Columns.Append("firstname", 202, 30)
.Keys.Append("pk_name_id", 1, "id")
EndWith
Local $adox_catalog = ObjCreate("ADOX.Catalog")
With $adox_catalog
.ActiveConnection() = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & $MdbPath & "\" & $MdbName & ".mdb" & ";" & _
"Jet OLEDB:Engine Type=5;"
.Tables.Append($adox_table)
EndWith
$adox_catalog = ""
$adox_table = ""
EndFunc ;==>_TestCreateLocalTableQuelqu'un aurait il LA solution ?