You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PowerShell的C#代码段中添加Microsoft.SqlServer.Smo程序集引用

解决C#代码段中引用SQL Server SMO程序集的问题

问题根源

直接执行New-Object Microsoft.SqlServer.Management.Smo.Server能正常运行,是因为PowerShell会自动解析并加载SMO(SQL Server管理对象)相关的依赖程序集;但使用Add-Type编译嵌入的C#代码时,PowerShell不会自动加载这些外部依赖,必须手动指定。此外你的C#代码存在一个基础错误:Microsoft.SqlServer.Management.Smo.Server是类而非命名空间,正确的命名空间引用应为Microsoft.SqlServer.Management.Smo。

解决步骤

  1. 修正命名空间引用:将C#代码中的using Microsoft.SqlServer.Management.Smo.Server;改为using Microsoft.SqlServer.Management.Smo;,同时添加using System.Linq;用于日志文件大小的求和计算。
  2. 手动指定依赖程序集:在Add-Type命令中通过-AssemblyName参数明确指定SMO相关程序集,至少需要Microsoft.SqlServer.Smo和Microsoft.SqlServer.ConnectionInfo(后者是SQL Server连接的基础依赖)。

修改后的完整脚本

$code = @"
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.SqlServer.Management.Smo;

namespace DatabaseInfoRetrieval
{
    public class DatabaseInfo
    {
        public string DbName { get; set; }
        public bool Encrypted { get; set; }
        public double DbSize { get; set; }
        public double LogSize { get; set; }
    }

    public class DatabaseInfoRetriever
    {
        public static List<DatabaseInfo> GetDatabaseInfo(string serverInstance)
        {
            List<DatabaseInfo> databaseList = new List<DatabaseInfo>();
            Server srv = new Server(serverInstance);

            foreach (Database db in srv.Databases)
            {
                if (!db.IsSystemObject)
                {
                    DatabaseInfo info = new DatabaseInfo
                    {
                        DbName = db.Name,
                        Encrypted = db.EncryptionEnabled,
                        DbSize = db.DataSpaceUsage / (1024.0 * 1024.0),
                        LogSize = db.LogFiles.Sum(f => f.Size) / (1024.0 * 1024.0)
                    };

                    databaseList.Add(info);
                }
            }

            return databaseList;
        }
    }
}
"@
try {
    // 加载C#代码时指定SMO依赖程序集
    Add-Type -TypeDefinition $code -Language CSharp -AssemblyName Microsoft.SqlServer.Smo, Microsoft.SqlServer.ConnectionInfo
    $sourcecomputer = "s-sql-p063-17.ads.schwarz"
    $table = @{
        result     = ""
        definition = "DB-Migration, get DBs from SQL Instance: $sourcecomputer"
    }

    // 调用静态方法,无需实例化类
    $databaseList = [DatabaseInfoRetrieval.DatabaseInfoRetriever]::GetDatabaseInfo($sourcecomputer)

    $table.result = $databaseList
    ConvertTo-Json -Depth 3 -InputObject $table
}
catch {
    $table.result = "Error."
    $table.errors = $Error[0].Exception.Message
    ConvertTo-Json -InputObject $table
}

额外说明

  • 原脚本中$db = New-Object -TypeName DatabaseInfoRetriever属于冗余代码,因为调用的是静态方法,无需实例化类,已删除。
  • 修正了日志大小计算逻辑:db.LogFiles是集合对象,需通过Sum方法计算所有日志文件的总大小,因此添加了System.Linq命名空间引用。

内容的提问来源于stack exchange,提问作者Purclot

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 21:57:45