Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.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#将大型ASCII文件导入sql server并将其分解_C#_Sql Server_Sqlbulkcopy - Fatal编程技术网

c#将大型ASCII文件导入sql server并将其分解

c#将大型ASCII文件导入sql server并将其分解,c#,sql-server,sqlbulkcopy,C#,Sql Server,Sqlbulkcopy,我目前的任务是将800万行从ASCII文件导入SQL数据库 我已经将行格式化为一个实体,可以进行操作,但是我找不到一种方法将这个巨大的文件分解为多个DataTable,以便与SQLBulkCopy一起使用 你们知道怎么做吗?我想使用这个解决方案,但我不知道从哪里开始破坏我的1Go文件 感谢您的帮助。8M行对于现代的DBs和内存来说并不是那么多 你看过SSI吗?将数据从CSV导入数据库非常容易 如果您确实需要使用C#,那么您应该能够在C#中构建一个数据表,然后使用大容量复制加载数据 乙二醇 我找到

我目前的任务是将800万行从ASCII文件导入SQL数据库

我已经将行格式化为一个实体,可以进行操作,但是我找不到一种方法将这个巨大的文件分解为多个DataTable,以便与SQLBulkCopy一起使用

你们知道怎么做吗?我想使用这个解决方案,但我不知道从哪里开始破坏我的1Go文件


感谢您的帮助。

8M行对于现代的DBs和内存来说并不是那么多

你看过SSI吗?将数据从CSV导入数据库非常容易

如果您确实需要使用C#,那么您应该能够在C#中构建一个数据表,然后使用大容量复制加载数据 乙二醇


我找到了解决方案,适用于那些有同样问题的人。 只需读取每一行,然后将其添加到数据表中,一旦DT达到批量大小,我们将发送它,然后为下一批清除它,最后我们发送剩余内容,即使数据表不是批量大小:

            using (FileStream stream = File.Open(file, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))


            using (BufferedStream bufferedStream = new BufferedStream(stream))


            using (StreamReader streamReader = new StreamReader(bufferedStream))
            {
                string connectionString = @"connectionstring";
                using (SqlConnection conn = new SqlConnection(connectionString))
                {
                    conn.Open();

                    while ((line = streamReader.ReadLine()) != null)
                    {
                        dfdfdf = line.Substring(42, 1);
                        fdfdf = line.Substring(45, 1);

                        DataRow row = dt.NewRow();
                        row["dfdfdf"] = dfdfdf;
                        row["fdfdf"] = fdfdf;

                        dt.Rows.Add(row);

                        if (dt.Rows.Count == batchSize)
                        {
                            try
                            {
                                Console.WriteLine("Batch sent");
                                using (SqlBulkCopy bulkCopy = new SqlBulkCopy(conn))
                                {
                            bulkCopy.ColumnMappings.Add("dfdfdf", "dfdfdf");
                            bulkCopy.ColumnMappings.Add("fdfdf", "fdfdf");

                                    bulkCopy.DestinationTableName = "table";
                                    bulkCopy.WriteToServer(dt);
                                }

                                dt.Clear();

                            }
                            catch (Exception e)
                            {
                                Console.WriteLine(e);
                            }

                        }
                    }

                    try
                    {
                        Console.WriteLine("Last batch sent");
                        using (SqlBulkCopy bulkCopy = new SqlBulkCopy(conn))
                        {
                            bulkCopy.ColumnMappings.Add("dfdfdf", "dfdfdf");
                            bulkCopy.ColumnMappings.Add("fdfdf", "fdfdf");

                            bulkCopy.DestinationTableName = "table";
                            bulkCopy.WriteToServer(dt);
                        }

                        dt.Clear();

                    }
                    catch (Exception e)
                    {
                        Console.WriteLine(e);
                    }
                }

您可以逐行读取文件并逐行插入数据。这需要时间,但不应破坏server@MarkiianBenovskyi这已经是我正在做的事了,但是没有用。这需要24小时以上,服务设置为每24小时检查一次文件并执行一次。加上800万SQL事务是非常不可选择的…@Anas这对你的主题来说是一个重复吗?我正在尝试编写一个c#服务来导入ASCII文件;不使用某些工具导入.sql文件…这是一个问题,连接到DB并直接写入,写入大文件,然后导入到DB更容易。这就是为什么星展银行在哪里made@MarkiianBenovskyi这就是为什么我试图将文件分成多个块,然后使用SQLBulkCopy导入它们。这个文件不是我写的,它是我国所有街道的曲目,它是由政府发布的。是的,它必须是一个c#服务。现在有800万行,我估计导入时间为27小时。。。我不能用我的文件只填充一个DT,因为“内存不足异常”这就是为什么我试图用缓冲流填充多个DT。因此,您可以将这个伪代码行:foreach(源代码中的行)更改为循环(例如1-1M、1M-2M等)&根据您希望运行大容量拷贝的次数设置一个外部循环。
            using (FileStream stream = File.Open(file, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))


            using (BufferedStream bufferedStream = new BufferedStream(stream))


            using (StreamReader streamReader = new StreamReader(bufferedStream))
            {
                string connectionString = @"connectionstring";
                using (SqlConnection conn = new SqlConnection(connectionString))
                {
                    conn.Open();

                    while ((line = streamReader.ReadLine()) != null)
                    {
                        dfdfdf = line.Substring(42, 1);
                        fdfdf = line.Substring(45, 1);

                        DataRow row = dt.NewRow();
                        row["dfdfdf"] = dfdfdf;
                        row["fdfdf"] = fdfdf;

                        dt.Rows.Add(row);

                        if (dt.Rows.Count == batchSize)
                        {
                            try
                            {
                                Console.WriteLine("Batch sent");
                                using (SqlBulkCopy bulkCopy = new SqlBulkCopy(conn))
                                {
                            bulkCopy.ColumnMappings.Add("dfdfdf", "dfdfdf");
                            bulkCopy.ColumnMappings.Add("fdfdf", "fdfdf");

                                    bulkCopy.DestinationTableName = "table";
                                    bulkCopy.WriteToServer(dt);
                                }

                                dt.Clear();

                            }
                            catch (Exception e)
                            {
                                Console.WriteLine(e);
                            }

                        }
                    }

                    try
                    {
                        Console.WriteLine("Last batch sent");
                        using (SqlBulkCopy bulkCopy = new SqlBulkCopy(conn))
                        {
                            bulkCopy.ColumnMappings.Add("dfdfdf", "dfdfdf");
                            bulkCopy.ColumnMappings.Add("fdfdf", "fdfdf");

                            bulkCopy.DestinationTableName = "table";
                            bulkCopy.WriteToServer(dt);
                        }

                        dt.Clear();

                    }
                    catch (Exception e)
                    {
                        Console.WriteLine(e);
                    }
                }