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

.NET Core 7从数据库获取脚本时遭遇NullReferenceException问题求助

解决System.NullReferenceException:TableCollection索引器返回null的问题

错误分析

你遇到的空引用异常,是因为代码中database.Tables[myTable.Name]返回了null,调用.Script()方法时触发了异常。

核心问题点

  1. 冗余且风险的表获取操作:你已经在遍历database.Tables拿到了myTable实例,没必要再通过名称索引重新获取,这完全是多余操作,还会因为系统表/权限问题导致获取失败。
  2. 缺失的null检查:server.Databases[databaseName]可能因为数据库名称错误、连接权限不足等原因返回null,后续操作会直接报错。
  3. 脚本选项冲突:ScriptForCreateDrop和ScriptDrops = false存在逻辑冲突,前者会同时生成创建和删除脚本,后者禁止生成删除脚本,需要调整。

修复后的代码

public static string DbGetScript(string connectionString, string databaseName, string filePath)
{
    try
    {
        if (File.Exists(filePath))
            File.Delete(filePath);

        using (SqlConnection conn = new SqlConnection(connectionString))
        using (ServerConnection serverConn = new ServerConnection(conn))
        {
            var server = new Server(serverConn);
            // 检查目标数据库是否存在或可访问
            var database = server.Databases[databaseName];
            if (database == null)
            {
                return $"Error: 数据库 {databaseName} 不存在或当前账号无访问权限";
            }

            ScriptingOptions scriptOptions = new ScriptingOptions
            {
                FileName = filePath,
                ScriptDrops = false,
                ScriptData = true,
                ScriptSchema = true,
                IncludeIfNotExists = true,
                // 移除冲突配置,若需生成创建+删除脚本,将ScriptDrops设为true即可
                // ScriptForCreateDrop = true,
                Encoding = Encoding.UTF8
            };

            // 遍历表实例,跳过系统表避免权限或索引问题
            foreach (Table myTable in database.Tables)
            {
                if (!myTable.IsSystemObject)
                {
                    myTable.Script(scriptOptions);
                }
            }

            return filePath;
        }
    }
    catch (Exception ex)
    {
        return $"Error: {ex.GetOriginalException().Message}";
    }
}

关键修改说明

  • 自动释放资源:用using包裹SqlConnection和ServerConnection,确保连接资源被自动释放,避免内存泄漏。
  • 前置空检查:提前判断数据库实例是否有效,给出明确的错误提示。
  • 移除冗余操作:直接使用遍历得到的myTable实例,避免重复索引查询带来的风险。
  • 过滤系统表:通过IsSystemObject跳过系统表,规避无权限访问或索引查询失败的问题。
  • 修复配置冲突:调整脚本选项的矛盾配置,保证生成逻辑符合预期。

内容的提问来源于stack exchange,提问作者Mohamad Hasan Salmaaniyaan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 09:50:36