C#执行SQL脚本文件

2017-3-7来源:SQL技巧人气:644

本文将简单介绍如何在C#中执行SQL Server脚本。SQLCMD是SQL Server的命令行,它提供了一种快速简便的方式来执行T-SQL脚本。在VS里,我们可以使用PRocessStartInfo这个类来调用sqlcmd,ProcessStartInfo这个类用于启动进程。假如我们有下面用于备份DB的脚本,其名称是backup.sql:

[sql] view plain copy BACKUP DATABASE [test] TO  DISK = N'C:\backup\test.bak'     WITH NOFORMAT, NOINIT,  NAME = N'test-Full Database Backup', SKip, NOREWIND, NOUNLOAD,  STATS = 10   GO  

为了执行backup.sql脚本,我们使用下面的命令:

[sql] view plain copy sqlcmd -S .\MSSQLSERVER -i C:\backup.sql   

对于如何使用sqlcmd 运行Transact-SQL脚本文件,可以参考这里。

下面将展示如何在C#中调用sqlcmd: 1、 在程式里用添加如下命名空间

[csharp] view plain copy using System.Diagnostics;  

2、 相关C#代码如下:

[csharp] view plain copy private void btnDemo_Click(object sender, EventArgs e)   {        // 调用sqlcmd       ProcessStartInfo info = new ProcessStartInfo("sqlcmd", @" -S .\MSSQLSERVER -i C:\backup.sql");       //禁用OS Shell       info.UseShellExecute = false;       //禁止弹出新窗口       info.CreateNoWindow = true;       //隐藏windows style       info.WindowStyle = ProcessWindowStyle.Hidden;       //标准输出       info.RedirectStandardOutput = true;          Process proc = new Process();       proc.StartInfo = info;       //启动进程       proc.Start();   }  

以上,就完整地演示了如何在C#里调用sqlcmd来执行.sql脚本。

方法一:osql.exe(这种方式最简单,但貌似微软以后会取消这个功能,改为SqlCmd了)

最简单的方法就是调用 osql.exe .

具体方法如下(以sql server200 数据库为例):

            try             {                 System.Diagnostics.Process pr = new System.Diagnostics.Process();                 pr.StartInfo.FileName = "osql.exe ";                 pr.StartInfo.Arguments = "-U sa -P sa -d master -s 127.0.0.1 -i Sql.sql";                 pr.StartInfo.UseShellExecute = false;                 pr.StartInfo.RedirectStandardOutput = true;  //重定向输出                               pr.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;//隐藏输出窗口                 pr.Start();                                  System.IO.StreamReader sr = pr.StandardOutput;                 Console.WriteLine(sr.ReadToEnd());                     pr.WaitForExit();                 pr.Close();             }             catch(Exception err)             {                 MessageBox.Show(err.ToString());             }

以下是osql的一些参数用法:

用法: osql                   [-U 登录 ID]          [-P 密码]   [-S 服务器]                [-H 主机名]           [-E 可信连接]   [-d 使用数据库名称]        [-l 登录超时值]       [-t 查询超时值]   [-h 标题]                  [-s 列分隔符]         [-w 列宽]   [-a 数据包大小]            [-e 回显输入]         [-I 允许带引号的标识符]   [-L 列出服务器]            [-c 命令结束]         [-D ODBC DSN 名称]   [-q "命令行查询"]          [-Q "命令行查询" 并退出]   [-n 删除编号方式]          [-m 错误级别]   [-r 发送到 stderr 的消息]  [-V 严重级别]   [-i 输入文件]              [-o 输出文件]   [-p 打印统计信息]               [-b 出错时中止批处理]   [-X[1] 禁用命令,[退出的同时显示警告]]   [-O 使用旧 ISQL 行为禁用下列项]

 

------------------------------------------------------------------------------------------------------------------------------------------------

private void execfile() { try { string connStr = "data source={0};user id={1};passWord={2};persist security info=false;packet size=4096"; ExecuteSql(connStr, "master", "CREATE DATABASE " + "数据库名"); //这个数据库名是指你要新建的数据库名称 下同 System.Diagnostics.Process sqlProcess = new System.Diagnostics.Process(); sqlProcess.StartInfo.FileName = "osql.exe "; sqlProcess.StartInfo.Arguments = " -U 数据库用户名 -P 密码 -d 数据库名 -i 存放sql文本的目录sql.sql"; sqlProcess.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; sqlProcess.Start(); sqlProcess.WaitForExit(); sqlProcess.Close(); } catch (Exception ex) { throw ex; } } private void ExecuteSql(string conn, string DatabaseName, string Sql) { System.Data.SqlClient.SqlConnection MySQLConnection = new System.Data.SqlClient.SqlConnection(conn); System.Data.SqlClient.SqlCommand Command = new System.Data.SqlClient.SqlCommand(Sql, mySqlConnection); Command.Connection.Open(); Command.Connection.ChangeDatabase(DatabaseName); try { Command.ExecuteNonQuery(); } finally { Command.Connection.Close(); } }

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/ventry/archive/2006/03/02/613981.aspx

try { System.Diagnostics.Process pr = new System.Diagnostics.Process(); pr.StartInfo.FileName = "osql.exe "; pr.StartInfo.Arguments = "-U sa -P lmj -d testdata -s 127.0.0.1 -i script.sql"; pr.StartInfo.UseShellExecute = false; pr.StartInfo.RedirectStandardOutput = true; //重定向输出

pr.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;//隐藏输出窗口 pr.Start();

System.IO.StreamReader sr = pr.StandardOutput; Console.WriteLine(sr.ReadToEnd());

pr.WaitForExit(); pr.Close(); } catch (Exception err) { //MessageBox.Show(err.ToString()); }

asp.net(C#)执行.SQL脚本实现数据库建表

using System; using System.Data; using System.Data.SqlClient; using System.Configuration; using System.Collections; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using System.IO; //输入输出流命名空间

public class Lj { public static ArrayList ExecuteSqlFile(string varFileName) { // // TODO:读取.sql脚本文件 // StreamReader sr = File.OpenText(varFileName);//传入的是文件路径及完整的文件名 ArrayList alSql = new ArrayList(); //每读取一条语名存入ArrayList string commandText = ""; string varLine = ""; while (sr.Peek() > -1) { varLine = sr.ReadLine(); if (varLine == "") { continue; } if (varLine != "GO") { commandText += varLine; commandText += " "; } else { alSql.Add(commandText); commandText = ""; } }

sr.Close(); return alSql; } } public partial class baidu : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) {

string constr = "data source=.;uid=sa;pwd=;database=lx"; // 定义链接字符窜 SqlConnection conn = new SqlConnection(constr); conn.Open();  SqlCommand cmd = new SqlCommand(); cmd.Connection = conn; ArrayList Lists = Lj.ExecuteSqlFile(Server.MapPath("NetShop.sql")); //调用ExecuteSqlFile()方法,反回 ArrayList对象; string teststr; //定义遍历ArrayList 的变量; foreach (string varcommandText in Lists) { teststr = varcommandText; //遍历并符值; //Response.Write(teststr + "|@|<br>"); cmd.CommandText = teststr; //为SqlCommand赋Sql语句; cmd.ExecuteNonQuery(); //执行 } conn.Close(); } }

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/FuCity/archive/2008/05/20/2462295.aspx

有用的 using System; using System.Configuration; using System.Data; using System.Linq; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.xml.Linq;

public partial class _Default : System.Web.UI.Page { //protected void Page_Load(object sender, EventArgs e) //{ // execfile(); //} //private void execfile() //{ // //try // //{ // // string connStr = "data source={0};user id={1};password={2};persist security info=false;packet size=4096"; // // ExecuteSql(connStr, "master", "CREATE DATABASE " + "testdata"); //这个数据库名是指你要新建的数据库名称 下同 // // System.Diagnostics.Process sqlProcess = new System.Diagnostics.Process(); // // sqlProcess.StartInfo.FileName = "osql.exe "; // // sqlProcess.StartInfo.Arguments = " -U sa -P lmj -d testdata -i script.sql"; // // sqlProcess.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; // // sqlProcess.Start(); // // sqlProcess.WaitForExit(); // // sqlProcess.Close(); // //} // //catch (Exception ex) // //{ // // throw ex; // //} /

 

-----------------------------------------------------------------------------------------------------------------------------------------------

方法二:

让C#程序直接执行sql脚本文件,类似SSMS直接打开sql文件并执行一样,搜索了一下结果还真有,不过需要借用mssql的几个类库及命名空间:

Microsoft.SqlServer.ConnectionInfo.dll

Microsoft.SqlServer.Smo.dll

--------------------------------------------

using Microsoft.SqlServer.Management.Common;

using Microsoft.SqlServer.Management.Smo;

 

这里有一个小插叙,对于vs2008里可以直接引用这个这两个类库,但在vs2010里的引用就无法找到这两个类库了(不知道微软是怎么考虑的)

还好我电脑vs2008和vs2010都安装了

不过我还是避易就难的讲一下,vs2010在引用里无法找到这两个类库,那我们就想办法找到它,首先我电脑安装了mssqlserver2008 ,

我去X:\Program Files\Microsoft SQL Server\100\SDK\Assemblies 找到

Microsoft.SqlServer.ConnectionInfo.dll

Microsoft.SqlServer.Smo.dll

Microsoft.SqlServer.Management.Sdk.Sfc.dll(这个一定要考到你的程序目录,但你可以不引用)

然后手动添加应用,第三个dll一定要引用,不然会报错

 

代码如下:

复制代码
//补卡操作
         private void PatchCard()
         {
             string path = System.Environment.CurrentDirectory;
             string CardNo = txtCardNo.Text.Trim();
             string connectonstring=ConfigurationManager.AppSettings["connectionString"].ToString();
             if(CardNo==null||CardNo=="")
             {
                 MessageBox.Show("卡号不能为空!");
                 return;
             }
             if(!path.EndsWith(@"\"))
             {
                 path += @"\";
             }
             path+="补蓝鲸卡.sql";    //获取脚本位置
             if (File.Exists(path))
             {
                 FileInfo file = new FileInfo(path);
                 string script = file.OpenText().ReadToEnd();
                 script=script.Replace("H00001", CardNo);  //替换脚本里的参数
                 try
                 {
                       //执行脚本
                    SqlConnection conn = new SqlConnection(connectonstring);
                    Microsoft.SqlServer.Management.Smo.Server server = new Server(new ServerConnection(conn));
                    int i= server.ConnectionContext.ExecuteNonQuery(script);
                    if (i == 1)
                    {
                        MessageBox.Show("恭喜!\n"+CardNo+" 补卡成功!","成功");
                        txtCardNo.Text = "";
                        CreateLog(CardNo, true);
                    }
                    else
                    {
                        MessageBox.Show("@_@ 再试一次吧!","失败");
                    }
                     
                 }
                 catch (Exception es)
                 {
                     MessageBox.Show(es.Message);
                     CreateLog(CardNo + "  " + es.Message, false);
                 }
             }
             else
             {
                 MessageBox.Show("脚本不存在!");
                 return;
             }
         }
复制代码

方法三: 执行sql语句(最麻烦)

复制代码
代码 

public static int ExecuteSqlScript(string sqlFile)
{
    int returnValue = -1;
    int sqlCount = 0, errorCount = 0;
    if (!File.Exists(sqlFile))
    {
        Log.WriteLog(string.Format("sql file not exists!", sqlFile));
        return -1;
    }
    using (StreamReader sr = new StreamReader(sqlFile))
    {
        string line = string.Empty;
        char spaceChar = ' ';
        string newLIne = "\r\n", semicolon = ";";
        string sprit = "/", whiffletree = "-";               
        string sql = string.Empty;
        do
        {
            line = sr.ReadLine();
            // 文件结束
            if (line == null) break;
            // 跳过注释行
            if (line.StartsWith(sprit) || line.StartsWith(whiffletree)) continue;
            // 去除右边空格
            line = line.TrimEnd(spaceChar);
            sql += line;
            // 以分号(;)结尾,则执行SQL
            if (sql.EndsWith(semicolon))
            {
                try
                {
                    sqlCount++;
                    SqlHelper.ExecuteNonQuery(sql, null);
                }
                catch (Exception ex)
                {
                    errorCount++;
                    Log.WriteLog(sql +  newLIne + ex.Message);  
                }                        
                sql = string.Empty;
            }
            else
            {
                // 添加换行符
                if(sql.Length > 0) sql += newLIne;
            }
        } while (true);
    }
    if (sqlCount > 0 && errorCount == 0)
        returnValue = 1;
    if (sqlCount == 0 && errorCount == 0)
        returnValue = 0;
    else if (sqlCount > errorCount && errorCount > 0)
        returnValue = -1;
    else if (sqlCount == errorCount)
        returnValue = -2;
    return returnValue;
}
复制代码