Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将数据从CSV文件批量复制到SQL?_C#_Sql_Datatable_Import From Csv - Fatal编程技术网

C# 如何将数据从CSV文件批量复制到SQL?

C# 如何将数据从CSV文件批量复制到SQL?,c#,sql,datatable,import-from-csv,C#,Sql,Datatable,Import From Csv,我试着这样做: public Datatable GetDatatable(){ string[] csv=@"1,ABC,Arun,12/12/2017\n 2,BCD,Sam,10/12/2017\n 3,XYZ,Ammy,11/12/2017\n 4,PQR,Varun,9/12/2017\n"; DataTable table = new DataTable(); table.Colu

我试着这样做:

    public Datatable GetDatatable(){
        string[] csv=@"1,ABC,Arun,12/12/2017\n
        2,BCD,Sam,10/12/2017\n
        3,XYZ,Ammy,11/12/2017\n
        4,PQR,Varun,9/12/2017\n";
        DataTable table = new DataTable();
        table.Columns.Add("Dosage", typeof(int));
        table.Columns.Add("Drug", typeof(string));
        table.Columns.Add("Patient", typeof(string));
        table.Columns.Add("Date", typeof(DateTime));

        foreach (var line in csv)
         {
              string[] l=line.split(',');
              table.Rows.Add(l[0]);
              table.Rows.Add(l[1]);
              table.Rows.Add(l[2]);
              table.Rows.Add(l[3]);
         }
         return table;
    }
类csv

1,ABC,Arun,12/12/2017
2,BCD,Sam,10/12/2017
3,XYZ,Ammy,11/12/2017
4,PQR,Varun,9/12/2017
这是通过使用foreach完成的。我希望在不使用for循环的情况下得到相同的结果
或foreach,因为CSV包含超过300万行。请给出一些想法或建议。

您可以使用OLEDB通过SQL(类似)查询来读取CSV文件:

请检查此答案以获取示例:


您还可以使用现有的库,如FileHelpers:它允许轻松且非常快速地解析大型CSV文件。

您可以使用OLEDB使用SQL(kinda)查询读取CSV文件:

请检查此答案以获取示例:


您也可以使用现有的库,如FileHelpers:它允许轻松且非常快速地解析大型CSV文件。

以某种方式或其他方式,将始终执行循环以读取文件、拆分行并将其插入数据表。
有许多免费的库可以使用CSV文件,如果您执行简单的搜索,您将很容易找到它们

但是,您的代码可以通过在循环中只拆分一次行而不是4次来改进(和修复),并且只添加一行 (实际上,您的代码每行添加4行,这似乎是非常错误的)


如果这足以满足您的需求,则由您来评估。有这么多行要读,我将对不同方法的特性和性能进行广泛的比较。(使用库或自制代码)

以某种方式,将始终执行循环以读取文件、拆分行并将其插入数据表。
有许多免费的库可以使用CSV文件,如果您执行简单的搜索,您将很容易找到它们

但是,您的代码可以通过在循环中只拆分一次行而不是4次来改进(和修复),并且只添加一行 (实际上,您的代码每行添加4行,这似乎是非常错误的)


如果这足以满足您的需求,则由您来评估。有这么多行要读,我将对不同方法的特性和性能进行广泛的比较。(使用库或自制代码)

这是可行的,无需第三方使用SQLBulk Copy

 public static  void BulInsert()
    {
        var destination = @"Data Source = (localdb)\MSSQLLocalDB; Initial Catalog = SampleDatabase; Integrated Security = True; Connect Timeout = 30; Encrypt = False; TrustServerCertificate = False; "; // your comnnection string

        var filename = @"d:\db.csv";//your source file
        var connString = string.Format(@"Provider=Microsoft.Jet.OleDb.4.0; Data Source={0};Extended Properties=""Text;HDR=No;FMT=Delimited""", Path.GetDirectoryName(filename));
        string query = string.Format("Select * from [{0}]", Path.GetFileName(filename));
        using (var conn = new OleDbConnection(connString))
        {
            conn.Open();

            OleDbCommand command = new OleDbCommand(query, conn);
            var reader = command.ExecuteReader();
            using (SqlConnection destConnection = new SqlConnection(destination))
            {
                try
                {
                    destConnection.Open();
                    using (SqlBulkCopy bulkCopy =
                      new SqlBulkCopy(destConnection))
                    {

                        // what ever mapping with ordinal
                        bulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping(0, "Id"));
                        bulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping(1, "name"));
                        bulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping(2, "visit"));
                        bulkCopy.DestinationTableName =
                            "dbo.Patients";

                        try
                        {
                            bulkCopy.WriteToServer(reader);
                        }
                        catch (Exception ex)
                        {
                            Console.WriteLine(ex.Message);
                        }
                        finally
                        {

                            reader.Close();
                        }
                    }
                }
                catch (Exception)
                {

                }

            }
        }

    }

这是可行的,无需转向第三方使用SQLBulk Copy

 public static  void BulInsert()
    {
        var destination = @"Data Source = (localdb)\MSSQLLocalDB; Initial Catalog = SampleDatabase; Integrated Security = True; Connect Timeout = 30; Encrypt = False; TrustServerCertificate = False; "; // your comnnection string

        var filename = @"d:\db.csv";//your source file
        var connString = string.Format(@"Provider=Microsoft.Jet.OleDb.4.0; Data Source={0};Extended Properties=""Text;HDR=No;FMT=Delimited""", Path.GetDirectoryName(filename));
        string query = string.Format("Select * from [{0}]", Path.GetFileName(filename));
        using (var conn = new OleDbConnection(connString))
        {
            conn.Open();

            OleDbCommand command = new OleDbCommand(query, conn);
            var reader = command.ExecuteReader();
            using (SqlConnection destConnection = new SqlConnection(destination))
            {
                try
                {
                    destConnection.Open();
                    using (SqlBulkCopy bulkCopy =
                      new SqlBulkCopy(destConnection))
                    {

                        // what ever mapping with ordinal
                        bulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping(0, "Id"));
                        bulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping(1, "name"));
                        bulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping(2, "visit"));
                        bulkCopy.DestinationTableName =
                            "dbo.Patients";

                        try
                        {
                            bulkCopy.WriteToServer(reader);
                        }
                        catch (Exception ex)
                        {
                            Console.WriteLine(ex.Message);
                        }
                        finally
                        {

                            reader.Close();
                        }
                    }
                }
                catch (Exception)
                {

                }

            }
        }

    }
若要将CSV转换为Datatable或将CSV批量导入sqlserver,可以使用库

要将CSV转换为datatable,下面的代码显示了如何进行转换

using (var p = new ChoCSVReader("emp.csv").WithFirstLineHeader())
{
    DataTable dt = p.AsDataTable();
}
如果您想将CSV批量导入sqlserver,可以参考这篇codeproject文章,了解如何实现

希望这有帮助

免责声明:我是此库的作者。

如果您希望将CSV转换为Datatable或将CSV批量导入sqlserver,则可以使用此库

要将CSV转换为datatable,下面的代码显示了如何进行转换

using (var p = new ChoCSVReader("emp.csv").WithFirstLineHeader())
{
    DataTable dt = p.AsDataTable();
}
如果您想将CSV批量导入sqlserver,可以参考这篇codeproject文章,了解如何实现

希望这有帮助


免责声明:我是这个库的作者。

这些代码甚至都不会编译。你能提供一份工作吗?在任何情况下,某个地方都需要一个循环。不想使用foreach循环的原因是什么?在任何情况下都需要某种循环..你不能这样做。无论如何,您或您将使用的某些库需要逐行循环csvfile@AlenGenzić以提高性能,因为执行需要2分钟以上。如果CSV文件很大,则需要很长时间,并且无法避免使用某种循环。该代码甚至无法编译。你能提供一份工作吗?在任何情况下,某个地方都需要一个循环。不想使用foreach循环的原因是什么?在任何情况下都需要某种循环..你不能这样做。无论如何,您或您将使用的某些库需要逐行循环csvfile@AlenGenzić提高性能,因为执行需要2分钟以上。如果CSV文件很大,则需要很长时间,并且您无法避免使用某种循环。这不是SQL批量复制的答案,也不是SQL批量复制的答案