最近,需要做个功能,从大文件【7百万+行】中导入数据到数据库。由于数据文件和DB不在同台服务器上,因此不太方便用BULK INSERT 这种超变态语句。怎么办呢,调用存储过程一条一条导 or 拼凑insert语句一次导入多条?前者肯定不现实的,后则经测试效果也极其不佳【每次导入2w条,大致需要45分钟+】。怎么办啊,my god?看看System.Data.SqlClient有没有什么超级变态的东东,呵呵,不小心,竟然又看到Bulk了,嘿嘿,只不过是SqlBulkCopy而已,太兴奋了,抓紧看msdn。很快就有了下面的实现方法:
try
{
string beg = DateTime.Now.ToLongTimeString();
string fileName = string.Format("Userinfo-{0}.txt", DateTime.Today.AddDays(DiffDay).ToString("yyyy-MM-dd")); //"Userinfo-2010-07-19.txt";
FileInfo file = new FileInfo(Server.MapPath("../Download/" + fileName));
if (!file.Exists)
{
//JScriptHelper.Alert(this.Page, string.Format("要导入的文件[{0}]不存在,请先ftp下载!", fileName));
return;
}
int nRowPer; //每次导入的最大行数控制内存
if (!int.TryParse(ConfigurationManager.AppSettings["ULROWPER"] as string, out nRowPer))
{
nRowPer = 4000000;
}
using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["SQLCONN"].ToString()))
{
using (SqlBulkCopy bulkCtrl = new SqlBulkCopy(con))
{
DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("PTAccount", System.Type.GetType("System.String")));
dt.Columns.Add(new DataColumn("GameID", System.Type.GetType("System.String")));
dt.Columns.Add(new DataColumn("Area", System.Type.GetType("System.String")));
dt.Columns.Add(new DataColumn("Groups", System.Type.GetType("System.String")));
dt.Columns.Add(new DataColumn("GameLevel", System.Type.GetType("System.String")));
bulkCtrl.DestinationTableName = "Sp_GameLevel";
bulkCtrl.ColumnMappings.Add(0, "PTAccount");
bulkCtrl.ColumnMappings.Add(1, "GameID");
bulkCtrl.ColumnMappings.Add(2, "Area");
bulkCtrl.ColumnMappings.Add(3, "Groups");
bulkCtrl.ColumnMappings.Add(4, "GameLevel");
bulkCtrl.BulkCopyTimeout = int.MaxValue;
StreamReader read = new StreamReader(Server.MapPath("../Download/" + fileName), Encoding.Default);
UserLevel userCtrl = new UserLevel();
userCtrl.TruncateUserLevel();
con.Open();
int nRow = 0;
int nCnt = 0;
string line = read.ReadLine();
while (line != null)
{
nRow = dt.Rows.Count;
if (nRow > nRowPer)//规避文件太大程序占用内存太多
{
bulkCtrl.BatchSize = nRow;
bulkCtrl.WriteToServer(dt);
//bulkCtrl.Close();
dt.Rows.Clear();
nCnt += nRow;
}
string[] str = line.Split('/t');
if (str.Length == 5)
{
DataRow dr = dt.NewRow();
dr[0] = str[0];
dr[1] = str[1];
dr[2] = str[2];
dr[3] = str[3];
dr[4] = str[4];
dt.Rows.Add(dr);
}
line = read.ReadLine();
}
nRow = dt.Rows.Count;
if (nRow > 0)
{
nCnt += nRow;
bulkCtrl.BatchSize = nRow;
if (con.State != ConnectionState.Open) con.Open();
bulkCtrl.WriteToServer(dt);
}
bulkCtrl.Close();
con.Close();
//LogHelper.Info(string.Format("导入完毕 Beg:{0}End{1}[Row]{2}", beg, DateTime.Now.ToLongTimeString(), nCnt));
//JScriptHelper.Alert(this.Page, string.Format("共成功导入{0}条记录!", nCnt));
}
}
}
catch (Exception ex)
{
//LogHelper.Error(string.Format("UserLevelMain btnInsert_Click [StackTrace]{0}[Message]{1}", ex.StackTrace, ex.Message));
}
运行之后,日志是这样的:导入完毕 Beg:16:42:42 End16:46:04 [Row]5452484
不到4秒5百万+,比以前的30分钟+,快了多少倍啊!
keywor:大文件,大数据量,导入sql数据库
分享到:
相关推荐
当需要处理Excel中的大量数据并将其快速导入到数据库时,C#提供了一些高效的方法来实现这一目标。本文将详细讲解如何利用C#实现Excel数据的高效导入。 首先,我们需要了解如何在C#中读取Excel文件。.NET Framework...
接下来,我们来看如何将CSV文件的数据导入SQL数据库。这通常涉及到以下步骤: 1. **连接数据库**:使用SqlConnection类建立与SQL Server的连接。你需要提供正确的连接字符串,包括服务器名、数据库名、用户名和密码...
本文将详细介绍如何使用 C# 来实现 Excel 文件中的数据高效导入至 SQL Server 数据库的过程,并且能够实现数据的备份与恢复功能。这种方法在很多场景下都非常实用,比如在进行数据迁移、批量更新数据或需要定期备份...
在本教程中,我们将深入探讨如何使用C#将Excel文档中的数据有效地导入到SQL Server数据库中。这个过程涉及到文件I/O操作、数据处理和数据库连接,是数据迁移和ETL(提取、转换、加载)流程中常见的一步。 首先,...
4. **SQL数据库连接与操作**:为了将Excel数据导入SQL数据库,项目使用了`SqlConnection`类建立与SQL Server的连接,`SqlCommand`类执行SQL语句,如INSERT INTO,将数据批量写入数据库。此外,可能还涉及到事务处理...
综上所述,C#将Excel数据导入SQL Server数据库涉及到文件读取、数据转换和数据库操作等技能。通过选择合适的库和优化操作,可以高效地完成这一任务。在实际开发中,还需要考虑到错误处理、性能优化以及数据一致性等...
本主题涉及的是如何使用C#高效地将Excel中的大量数据导入到数据库,这在数据分析、报表生成以及企业级应用中是非常常见的需求。源码提供了一种实现方式,可以在实际项目中直接应用。 首先,`Frm_ReadExcel.cs`可能...
本主题聚焦于使用C#语言与SQL技术来实现批量导入数据到数据库的三种方法:普通方法、SqlBulkCopy和使用表值参数(TVP)。我们将详细探讨这些方法及其优缺点。 首先,让我们来看看**普通方法**。这种方法通常涉及...
在IT行业中,C#是一种广泛使用的编程语言,尤其在开发Windows桌面应用和.NET框架相关项目时。本主题聚焦于如何利用...在实际应用中,你还需要考虑数据的复杂性,如合并单元格、公式处理以及处理大数据量时的性能优化。
因此,我们需要掌握如何通过TXT文件批量导入数据到Oracle数据库的方法。下面,我们将详细介绍这一过程。 首先,我们需要了解TXT文件的数据格式。通常,TXT文件中的数据是以特定分隔符(如逗号、制表符等)区分各个...
本教程将聚焦于使用C#编程语言实现从Excel文件批量导入数据到SQL Server数据库的过程,利用`SqlBulkCopy`类来高效地完成这一任务。 首先,`SqlBulkCopy`是.NET Framework中的一个强大工具,它提供了将大量数据一次...
同时,对于大文件,可能需要优化数据读取和写入的方式,比如使用流(Stream)。 "ExcelToAccessTest"可能是这个过程的一个测试项目或代码示例,可能包含了实现上述步骤的C#代码。通过学习和分析这个示例,你可以更...
本篇文章将详细探讨如何使用C#读取TXT文件并将其数据导入到数据库中。 首先,我们需要了解C#中读取TXT文件的基本步骤。在C#中,我们可以使用`System.IO`命名空间下的`StreamReader`类来实现这一功能。以下是一个...
本文将深入探讨如何使用C#语言实现100万条数据快速导入SQL Server数据库,仅需4秒的惊人速度。这个成就得益于一系列优化策略和技术手段的综合运用。 首先,我们需要理解SQL Server数据库的批量插入机制。在SQL ...
在C#编程环境中,我们可以利用各种库来处理Excel文件,并将其数据导入到数据库系统,如MySQL或SQL Server。本文将详细讲解如何实现这个过程,主要包括以下几个步骤和涉及的知识点: 1. **安装必要的库**: - 对于...
5. **错误处理**:在进行大数据量导入时,可能出现数据异常或网络问题。通过捕获并处理异常,可以确保程序的稳定运行,并提供错误日志以便于排查问题。 6. **多线程**:如果系统资源允许,可以考虑使用多线程或多...
在IT行业中,处理大量数据是常见的任务,尤其是在百万级数据量的情况下。Excel和SQL Server都是常用的工具,但它们各自在处理大数据方面的优缺点明显。本文将深入探讨如何在Excel和SQL Server之间有效地进行百万级...