我目前的任务是从ASCII文件向SQL数据库导入800万行。
我已经将行格式化为可操作的实体,但是我找不到将这个巨大的文件分解为多个DataTable以便与SQLBulkCopy一起使用的方法...
你们对如何进行有任何想法吗?我想使用此解决方案Process large file in chunks or not,但我不知道从哪里开始分解1Go文件...
感谢您的帮助。
答案 0 :(得分:0)
现代数据库和内存不足8M行。
您看过SSIS吗?将数据从CSV导入数据库非常容易。
如果您确实需要使用C#,则应该能够在C#中构建数据表,然后使用大容量复制来加载数据 EG
DataTable newTable = new DataTable("Test");
// Add column objects to the table.
DataColumn ID = new DataColumn();
ID.DataType = System.Type.GetType("System.Int32");
ID.ColumnName = "Col1";
newTable.Columns.Add(ID);
foreach ( row in your source)
{
DataRow row = newTable.NewRow();
row["col1"] = modified.ToString();
newTable.Rows.Add(row);
}
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(con))
{
bulkCopy.DestinationTableName = "dbo.test1";
bulkCopy.WriteToServer(newTable);
}
答案 1 :(得分:0)
我为有同样问题的人们找到了解决方案。 只需读取每一行,然后将其添加到datable中,一旦DT达到批处理大小,我们就将其发送,然后为下一个批处理清除它,最后,即使datable不在批处理大小中,我们也会剩余剩余的内容:
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);
}
}