2010-12-13 78 views
0

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 

Répondre

0

Jamais utilisé IronPython ou SMO, mais on dirait qu'il attend une collection de quelque sorte. Avez-vous essayé:

scripter.Script(database.Tables) 

au lieu de programmer une table à la fois?

+0

Merci pour la réponse. J'ai essayé votre suggestion mais malheureusement sans succès. (voir ma réponse ci-dessous) – hoke1606

+0

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

+0

J'ai essayé de créer plusieurs tableaux différents. Rien ne fonctionne. – hoke1606

3

J'ai trouvé la solution:

arg=System.Array[SMO.SqlSmoObject]([table]) 

Le script complet ressemble:

import sys  
import clr  
# import .NET Array 
import System.Array 

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:  
     # create a .NET Array as an argument for the scripter 
     arg=System.Array[SMO.SqlSmoObject]([table]) 
     script = scripter.Script(arg) 
     #output script 
     for line in script: 
      print line