【问题标题】:SQL Server multiple rows insert from .sql file in C#SQL Server 多行从 C# 中的 .sql 文件插入
【发布时间】:2014-02-07 05:26:34
【问题描述】:

好的,假设我有一个包含几千个插入命令的 .sql 文件(例如 data.sql),如下所示:

...
INSERT INTO some_table VALUES ('person_name_1', 31, 'CA');
INSERT INTO some_table VALUES ('person_name_2', 29, 'NC');
INSERT INTO some_table VALUES ('person_name_3', 18, 'NY');
INSERT INTO some_table VALUES ('person_name_4', 21, 'IL');
INSERT INTO some_table VALUES ('person_name_5', 25, 'FL');
...

我想知道从 C# 代码将此数据插入 SQL Server 2012 数据库的最佳方法,并且作为附加信息,这将是每天一次,但需要手动通过网络界面完成。

现在,我所拥有的是:我解析 .sql 文件并构建这个非常大的 INSERT,所以我最终得到了一个具有

StringBuilder (sb)
INSERT INTO some_table VALUES
    ('person_name_1', 31, 'CA'),
    ('person_name_2', 29, 'NC'),
    ('person_name_3', 18, 'NY'),
    ('person_name_4', 21, 'IL'),
    ('person_name_5', 25, 'FL'),
    ...

然后我跑

using (var cmd = new SqlCommand { Connection = conn })
{
    cmd.CommandType = CommandType.Text;
    cmd.CommandText = sb.ToString().Remove(sb.Length - 1);
    cmd.ExecuteNonQuery();
}

有没有更好的方法来做到这一点?

【问题讨论】:

  • 从您获取数据的地方,您是准备数据还是以 CSV 或文本文件的形式获取数据?
  • @MilanRaval 我没有准备。我从某个来源获得它,就像我描述的那样:作为一个 .sql 文件,包含几千个 INSERT 命令。
  • 您可以为此使用 SQLCMD - 请参阅下面的答案

标签: c# sql sql-server bulkinsert


【解决方案1】:

你可以试试SQL Server Management Objects (SMO)

using System.Data.SqlClient;
using System.IO;
using Microsoft.SqlServer.Management.Common;
using Microsoft.SqlServer.Management.Smo;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string sqlConnectionString = "...";
            string script =File.ReadAllText("data.sql");
            SqlConnection conn = new SqlConnection(sqlConnectionString);
            Server server = new Server(new ServerConnection(conn));
            server.ConnectionContext.ExecuteNonQuery(script);
        }
    }
}

如果需要从网页中读取sql字符串

var webClient = new WebClient();
string script = webClient.DownloadString("your_file_path_url");

【讨论】:

  • 感谢您的回复。还有一件事:是否有可能,而不是从物理文件中读取,而是直接从 URL 读取到流中?
【解决方案2】:

你可以添加对这2个SMO dll的引用

using Microsoft.SqlServer.Management.Smo;
using Microsoft.SqlServer.Management.Common;

然后直接读取所有sql运行命令。

string scriptToRun = File.ReadAllText("Filepath");
using (SqlConnection conn = new SqlConnection("Yourconnectionstring"))
{
     Server server = new Server(new ServerConnection(conn));
     server.ConnectionContext.ExecuteNonQuery(scriptToRun);
}

【讨论】:

    【解决方案3】:

    您可以使用 SQLCMD 将数据插入数据库 - 直接从 SQL 文件。

    string inputFile = @"a.sql";
    
    ProcessStartInfo info = new ProcessStartInfo("sqlcmd", string.Format(@" -d ""{0}"" -S ""{1}"" -i ""{2}"" -U ""{3}"" -P ""{4}""", database, sqlServer, inputFile, userName, password)
    
    info.UseShellExecute = false;
    
    info.CreateNoWindow = true;
    
    info.WindowStyle = ProcessWindowStyle.Hidden;
    
    info.RedirectStandardOutput = true;
    
    Process p = new Process();
    
    p.StartInfo = info;
    
    p.Start();
    

    【讨论】:

      【解决方案4】:

      如果您尝试从源读取(可能是流式传输?)数据并插入到您的数据库中,我会考虑使用 SqlBulkCopy 类 [MSDN link]

      WriteToServer 方法提供了一个接受 IDataReader 的重载。所以我会为我正在使用的源实现一个 DataReader,并使用它。

      有关如何实现此功能的更多详细信息,我建议阅读 Michael Bowersox 博客上的 this article

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-11-09
        • 1970-01-01
        • 1970-01-01
        • 2016-01-14
        • 2012-10-15
        • 2013-06-08
        • 2018-10-25
        • 2014-08-19
        相关资源
        最近更新 更多