循环执行多个SQL脚本文件,在执行第2个时报错

geekcat 2018-06-13 04:31:38
说明:
1、我要执行的全部SQL脚本用SSMS单个单个执行都没问题,这是项目中用的脚本(保证脚本文件不会有问题)
2、运行工具时第一个脚本文件能能够执行成功,但在执行第2个脚本文件时会报错
3、我通过调试,报错代是在“server.ConnectionContext.ExecuteNonQuery(script);”这一行


4、我的目的就是执行多个SQL脚本文件
请大家帮我看一下我是那个地方的代码写的有问题


代码如下:

using Microsoft.SqlServer.Management.Common;
using Microsoft.SqlServer.Management.Smo;
using System.Configuration;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace TPRIWEBSQL
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{

//6、获取全部要执行的SQL脚本文件全路径并依次执行SQL脚本
#region
string Filepath = @"D:\SQLJB";//存放SQL脚本的目录
List<string> FileList = new List<string>();//存放SQL脚本文件的绝对路径
string RelativePath = @"D:\SQLJB";
GetFile(Filepath, FileList, RelativePath);
//循环执行每1个SQL脚本
for (int i = 0; i < FileList.Count; i++)
{
ExecutionScript(FileList[i]);
MessageBox.Show(FileList[i]);
}
#endregion
}


//执行1个SQL脚本文件
#region
private void ExecutionScript(string path)
{
string connectonstring = "data source=.\\TPRI;initial catalog=mydb9;user id=GeekCat9;password=portal";
//string connectonstring = ConfigurationManager.AppSettings["connectionString"].ToString();

if (File.Exists(path))
{
FileInfo file = new FileInfo(path);
string script = file.OpenText().ReadToEnd();
try
{
//执行脚本
SqlConnection conn = new SqlConnection(connectonstring);
Server server = new Server(new ServerConnection(conn));
server.ConnectionContext.ExecuteNonQuery(script);

conn.Close();
}
catch (Exception es)
{
MessageBox.Show(es.Message);
}
}
else
{
MessageBox.Show("脚本不存在!");
//return;
}
MessageBox.Show("9");
}
#endregion


/////获取全部要执行的SQL脚本文件全路径
#region
/// <summary>
/// 获取路径下所有文件以及子文件夹中文件
/// </summary>
/// <param name="path">全路径根目录</param>
/// <param name="FileList">存放所有文件的全路径</param>
/// <param name="RelativePath"></param>
/// <returns></returns>
public static List<string> GetFile(string path, List<string> FileList, string RelativePath)
{
DirectoryInfo dir = new DirectoryInfo(path);
FileInfo[] fil = dir.GetFiles();
DirectoryInfo[] dii = dir.GetDirectories();
foreach (FileInfo f in fil)
{
FileList.Add(f.FullName);//添加文件路径到列表中
}
//获取子文件夹内的文件列表,递归遍历
foreach (DirectoryInfo d in dii)
{
GetFile(d.FullName, FileList, RelativePath);
}
return FileList;
}
#endregion

}
}
...全文
813 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Blithe239 2018-09-17
  • 打赏
  • 举报
回复
脚本中是不是有GO语句,因为GO语句分割了多个事务,所以在C#的ExecuteNonQuery这个方法里不能够包含GO语句,因为默认每执行这个方法,都会创建一个事务,所以可以将GO当做分隔符,然后分段执行。
xuzuning 2018-09-17
  • 打赏
  • 举报
回复
server.ConnectionContext.ExecuteNonQuery(script)
执行的不是查询指令
yanghao1 2018-09-17
  • 打赏
  • 举报
回复
首先认真检查sql语句中的错误,逐步排除。
  • 打赏
  • 举报
回复
这个问题,你不会程序调试,所以你只知道打印 es.Message 而不知道使用 vs 来调试异常堆栈以及 Inner 信息。
  • 打赏
  • 举报
回复
引用 楼主 geekcat 的回复:
[size=14px]说明:
1、我要执行的全部SQL脚本用SSMS单个单个执行都没问题,这是项目中用的脚本(保证脚本文件不会有问题)
2、运行工具时第一个脚本文件能能够执行成功,但在执行第2个脚本文件时会报错
3、我通过调试,报错代是在“server.ConnectionContext.ExecuteNonQuery(script);”这一行


你贴出这个画面是不对路的。调试信息是堆栈的,如果你查看 vs 调试器抛出的异常信息窗口,它有一个“查看详细异常信息”的按钮(链接样式的按钮),如果你用代码打印异常日志那么你起码应该打印 InnerException,并且递归打印 InnerException。

实际上SQL Server(或者其它绝大多数 database provider)封装的异常信息,真正的数据库返回的错误是在 InnerExeption 这一层的最顶上一个。你没有调试内部信息,这是不行的。

最后要提醒你的是,开发中不要乱写 try...catch。写了这个你就无法使用 vs 调试器了,也就丧失了 vs 调试能力。

只有 Release 版本才应该启用 try....catch 代码。
Ruoch 2018-09-16
  • 打赏
  • 举报
回复
加个USING包含一下 你这样会直接批量执行 没完整容易出错
Boy_Xin 2018-08-24
  • 打赏
  • 举报
回复
为什么在我这里这句话 Server server = new Server(new ServerConnection(conn));报未能找到类型和命名空间的错我
exception92 2018-06-13
  • 打赏
  • 举报
回复
把出错信息贴出来看看呢,ssms在执行语句时会进行批处理操作,也就是每个语句会作为一个“批” ,然后ssms通过算法生成合适的执行计划,通过执行这个计划来返回或者处理结果。 即使是多条语句也可以作为“批” 来处理,go关键字就是用于指定批。 执行第二条出现错误 也许是执行第一条之后由某些错误,批中出现错误 会发生回滚事务操作,导致批处理失败。
正怒月神 2018-06-13
  • 打赏
  • 举报
回复
每个脚本的最后,增加 go语句试试看

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧