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