Как определить аргументы в Ironpython для класса Microsoft.SqlServer.SMO.Scripter.Script - PullRequest
0 голосов
/ 14 декабря 2010

Я хочу создать сценарий для своих объектов базы данных, используя приведенный ниже код Ironpython:

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)    

При выполнении этого кода я получаю следующую ошибку:

File "SMOtest2.py", line 18, in <module>
TypeError: expected Array[Urn], got Table

SMO.Scripter. doc дает мне следующую информацию:

Script(self: Scripter, urns: Array[Urn]) -> StringCollection
Script(self: Scripter, list: UrnCollection) -> StringCollection
Script(self: Scripter, objects: Array[SqlSmoObject]) -> StringCollection

Я пытался создать Array [Urn] или Array [SqlSmoObject], но без успеха.

Есть ли у кого-нибудьидея, как я могу создать правильный аргумент для класса SMO.Scripter.Script?

Я хочу написать код VB ниже в Python.Взято из: 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

Ответы [ 2 ]

3 голосов
/ 15 декабря 2010

Я нашел решение:

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

Полный скрипт выглядит так:

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
0 голосов
/ 14 декабря 2010

Никогда не использовал IronPython или SMO, но похоже, что он ожидает какую-то коллекцию. Вы пробовали:

scripter.Script(database.Tables)

вместо сценариев по одной таблице за раз?

...