在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
相关产品推荐
相关产品推荐

