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

在C#(ASP.NET)中执行SQL脚本遇路径异常求助

问题与解决方法

我需要打开路径为project_name\Scripts(sub_folder)\merge.sql的SQL脚本,但当前代码无法去除路径中的C:前缀,找不到实际文件,还触发了System.IO.DirectoryNotFoundException异常。

原代码

private void MergeQuery()
{
    //might need to change C: drive directory
    //string derefQuery = @"\.\mergeSQL.sql";
    using (SqlConnection mer = new SqlConnection(@"Data Source = address_name; Initial Catalog = catalog_name; Integrated Security=SSPI"))
    {
        {
            mer.Open();
            string path = Path.GetDirectoryName("\\project_name\\Scripts\\mergeSQL.sql ");
            string mergeScript = System.IO.File.ReadAllText(path);

            System.Collections.Generic.IEnumerable<string> commandStrings = Regex.Split(mergeScript, @"^\s*GO\s*$", RegexOptions.Multiline | RegexOptions.IgnoreCase);

            foreach (string commandString in commandStrings)
            {
                if (commandString.Trim() != "")
                {
                    using (var command = new SqlCommand(commandString, mer))
                    {
                        command.ExecuteNonQuery();
                    }
                    Label2.Text = "Query merged";
                }
            }

        }
    }
}

核心问题与修正步骤

  • 路径处理逻辑错误:Path.GetDirectoryName()是用来提取文件路径对应的目录路径,你把完整的文件路径传给它,得到的是\project_name\Scripts这个目录,再用File.ReadAllText()读取目录必然报错。直接使用完整文件路径即可,无需调用该方法。
  • 绝对路径前缀问题:路径开头的\会被识别为当前驱动器(比如C:)根目录下的路径,若想使用相对路径,要去掉开头的\,写成@"project_name\Scripts(sub_folder)\merge.sql"(注意原代码里路径写成了Scripts,要和需求里的Scripts(sub_folder)保持一致)。
  • 确保文件路径可靠:如果不确定程序运行时的工作目录,可通过程序基目录拼接路径,避免找不到文件:
    string baseDir = AppDomain.CurrentDomain.BaseDirectory;
    string filePath = Path.Combine(baseDir, @"project_name\Scripts(sub_folder)\merge.sql");
    string mergeScript = System.IO.File.ReadAllText(filePath);
    
  • 代码冗余与逻辑优化:原代码存在一对多余的大括号;Label2.Text = "Query merged";放在循环里会重复赋值,建议移到循环结束后,确保所有命令执行完成后再更新提示。

修正后的示例代码

private void MergeQuery()
{
    using (SqlConnection mer = new SqlConnection(@"Data Source = address_name; Initial Catalog = catalog_name; Integrated Security=SSPI"))
    {
        mer.Open();
        // 用程序基目录拼接正确的文件路径
        string baseDir = AppDomain.CurrentDomain.BaseDirectory;
        string filePath = Path.Combine(baseDir, @"project_name\Scripts(sub_folder)\merge.sql");
        string mergeScript = System.IO.File.ReadAllText(filePath);

        IEnumerable<string> commandStrings = Regex.Split(mergeScript, @"^\s*GO\s*$", RegexOptions.Multiline | RegexOptions.IgnoreCase);

        foreach (string commandString in commandStrings)
        {
            if (!string.IsNullOrWhiteSpace(commandString))
            {
                using (var command = new SqlCommand(commandString, mer))
                {
                    command.ExecuteNonQuery();
                }
            }
        }
        // 所有命令执行完成后更新提示
        Label2.Text = "Query merged";
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 22:50:27