Je veux mes scripts objets de base de données à l'aide du code ci-dessous IronPython:Comment définir des arguments en IronPython pour la classe Microsoft.SqlServer.SMO.Scripter.Script
import sys
import clr
database_name = r'localhost\SQLEXPRESS'
dir_assemblies = r'D:\programfiles\Microsoft SQL Server\100\SDK\Assemblies'
# Import SMO Namespace
sys.path.append(dir_assemblies)
clr.AddReferenceToFile('Microsoft.SqlServer.Smo.dll')
import Microsoft.SqlServer.Management.Smo as SMO
db = SMO.Server(database_name)
scripter = SMO.Scripter(db)
for database in db.Databases:
for table in database.Tables:
# TypeError: expected Array[Urn], got Table
scripter.Script(table)
Lors de l'exécution de ce code, je reçois le texte suivant erreur:
File "SMOtest2.py", line 18, in <module>
TypeError: expected Array[Urn], got Table
Le SMO.Scripter. doc me donne les informations suivantes:
Script(self: Scripter, urns: Array[Urn]) -> StringCollection
Script(self: Scripter, list: UrnCollection) -> StringCollection
Script(self: Scripter, objects: Array[SqlSmoObject]) -> StringCollection
J'ai essayé de créer un tableau [Urne] ou un tableau [SqlSmoObject], mais sans succès.
Est-ce que quelqu'un a une idée de comment je peux créer le bon argument pour la classe SMO.Scripter.Script?
Je veux écrire le code VB ci-dessous en python. Extrait de: http://msdn.microsoft.com/en-us/library/ms162160(v=SQL.90).aspx
'Connect to the local, default instance of SQL Server.
Dim srv As Server
srv = New Server
'Reference the AdventureWorks database.
Dim db As Database
db = srv.Databases("AdventureWorks")
'Define a Scripter object and set the required scripting options.
Dim scrp As Scripter
scrp = New Scripter(srv)
scrp.Options.ScriptDrops = False
scrp.Options.WithDependencies = True
'Iterate through the tables in database and script each one. Display the script.
'Note that the StringCollection type needs the System.Collections.Specialized namespace to be included.
Dim tb As Table
Dim smoObjects(1) As Urn
For Each tb In db.Tables
smoObjects = New Urn(0) {}
smoObjects(0) = tb.Urn
If tb.IsSystemObject = False Then
Dim sc As StringCollection
sc = scrp.Script(smoObjects)
Dim st As String
For Each st In sc
Console.WriteLine(st)
Next
End If
Next
Merci pour la réponse. J'ai essayé votre suggestion mais malheureusement sans succès. (voir ma réponse ci-dessous) – hoke1606
Je m'attendais à ce que la surcharge acceptant 'Array [SqlSmoObject]' soit appelée. Peut-être essayez de convertir le 'TableCollection' en un' Array [Table] 'en premier. – Daniel
J'ai essayé de créer plusieurs tableaux différents. Rien ne fonctionne. – hoke1606