2017-05-06 92 views
2

我从C#代码运行SQL脚本,我的问题是代码需要很长时间才能完成执行,它有许多表在脚本中创建(至少30表),所以我的代码正在工作,但它有性能问题。 这是代码从ASP.Net运行SQL脚本C#应用程序性能问题

public static bool executeSqlScript(string scriptPath,string serverName,string databaseName) 
    { 
     try 
     { 

      SqlConnection myConn = new SqlConnection("Server=.;Integrated security=SSPI;database=master"); 
      Server server = new Server(new ServerConnection(myConn)); 
      string CreateCommand = "CREATE DATABASE " + databaseName + ""; 
      string appendText; 
      //delete first line from script(Oldscript) 
      var lines = File.ReadAllLines(scriptPath).Skip(1); 
      File.WriteAllLines(scriptPath, lines); 
      using (StreamReader sreader = new StreamReader(scriptPath)) 
      { 
       appendText = sreader.ReadToEnd(); 
      } 
      File.Delete(scriptPath); 
      using (StreamWriter swriter = new StreamWriter(scriptPath, false)) 
      { 
       appendText = "USE [" + databaseName + "]" + Environment.NewLine + appendText; 
       swriter.Write(appendText); 
       swriter.Close(); 
      } 
      string readtext = File.ReadAllText(scriptPath); 
      SqlCommand myCommand = new SqlCommand(CreateCommand, myConn); 
      myConn.Open(); 
      myCommand.ExecuteNonQuery(); 
      server.ConnectionContext.ExecuteNonQuery(readtext); 

      return true; 
     } 
     catch (Exception e) 
     { 
     throw e; 
     return false; 
     } 
    } 
+1

请将代码粘贴到您的问题主体中。 –

+0

您需要多久创建一次这些表格?是否可以并行而不是串行地执行某些操作? –

+0

你是什么意思串行? –

回答

0

的问题是在围棋关键字在脚本中,我发现这个解决方案

http://www.codingdefined.com/2014/07/run-sql-script-file-in-c.html

(如果你想执行SQL生成的脚本文件,你必须删除所有“GO”。为此你必须使用下面的代码...)

他re是我的代码:

 string sqlConnectionString = "Data Source=.;Initial Catalog=master;Integrated Security=True"; 
     FileInfo file = new FileInfo(@"D:\Script.sql"); 
     string script = file.OpenText().ReadToEnd(); 
     SqlConnection conn = new SqlConnection(sqlConnectionString); 
     conn.Open(); 
     script = script.Replace("GO", ""); 
     SqlCommand cmd = new SqlCommand(script, conn); 
     cmd.ExecuteNonQuery(); 
     cmd.Dispose(); 
     conn.Close(); 
1

我的建议是这个最迁移到SQL Server,一旦新的数据库和用户的设置,调用存储过程来读取必要的DDL的SQL文件中它。

我最后的项目是托管托管公司,我们的CMS使用了150多个数据库对象。我们使用了一个“控制”数据库,我们传递了新的数据库信息,并且通常会在不到一分钟内完成新的表格,函数和过程。

+0

请给我一个这种方法的例子吗? –

+0

不能给你具体说明,但[Sql Server Central](https://www.sqlservercentral.com/Forums/Topic452984-146-1.aspx)有一个论坛讨论可以指导你 –

0

使用Parallel.ForEach创建表喜欢

public static bool executeSqlScript(string scriptPath, string serverName, string databaseName) 
    { 
     try 
     { 

      SqlConnection myConn = new SqlConnection("Server=.;Integrated security=SSPI;database=master"); 
      //Server server = new Server(new ServerConnection(myConn)); 
      string CreateCommand = "CREATE DATABASE " + databaseName + ""; 
      string appendText; 
      //delete first line from script(Oldscript) 
      //create db first 
      var myCommand = new SqlCommand(CreateCommand, myConn); 
      myConn.Open(); 
      myCommand.ExecuteNonQuery(); 
      myConn.Close(); 


      List<string[]> list = File.ReadLines(scriptPath) 
       .Select(line => line.ToLower().Split(new string[] { "go" }, StringSplitOptions.None)) 
       .ToList(); 
      Parallel.ForEach(list, (sql) => 
      { 
       using (var mysqlConn = new SqlConnection("Server=.;Integrated security=SSPI;database=master")) 
       { 
        var mysql = "USE [" + databaseName + "]" + Environment.NewLine + string.Join("", sql); 
        var mysqlCommand = new SqlCommand(mysql, mysqlConn); 
        myConn.Open(); 
        mysqlCommand.ExecuteNonQuery(); 
       } 
      }); 

      //server.ConnectionContext.ExecuteNonQuery(readtext); 

      return true; 
     } 
     catch (Exception e) 
     { 
      throw e; 
      return false; 
     } 
    }