Sqlserver数据库批量导入数据

时间:2022-03-23 04:20:58

最近抽空整理了一下项目中运用到的公共方法,打算增加自己的DLL文件的内容。突然发现sqlserver数据批量插入的一个东西。好像我的DLL文件里面没有,所以就加上了。这里说明一下:项目中所有的公共文件都是我自己建的,公共类库中的大部分方法都是我自己写的,不存在什么泄露代码不好的影响。并且这些代码稀松平常,没什么高深的东西,所以想也没想就直接放到我自己的DLL文件中了。

好了,废话不多说,下面看看我代码中的批量插入方法。这个其实没什么可将的,只能说是贴上代码大家一起参考参考罢了。一下代码只是我的第一稿,完全手写,可能还有不正确的地方,请大家指正哈!

	#region    表插入(批量插入数据)
/// <summary>
/// 根据数据库功能名称类型返回相应的数据库连接字符串
/// </summary>
/// <param name="DataBaseType"></param>
/// <returns></returns>
delegate string GetConnstringByDbType(int DataBaseType);
/// <summary>
/// 批量插入(请注意数据源表的要求)
/// </summary>
/// <param name="SourceList">数据源集合(集合中数据实例对象,其模型和目标数据库中的表的参数结构高度一致)</param>
/// <param name="Obj">数据对象模型</param>
/// <param name="MarkName">自增列主键ID</param>
/// <param name="DestinationTblName">数据库服务器中接收复制表的表名称(目标表)</param>
/// <param name="DataBaseType">数据库名称</param>
/// <param name="SpendTimeValue">复制消耗的时间</param>
/// <returns></returns>
public bool BatchInsertData<T>(List<T> SourceList, T Obj, string MarkName, string DestinationTblName, int DataBaseType, out long SpendTimeValue)
{
bool result = false;
SpendTimeValue = 0;
try
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();

//操作复制的表(装数据的表)
DataTable dataTable = new DataTable();

#region 账号格式
DataColumn[] AimColumns = null;
List<DataColumn> ColumnList = new List<DataColumn>();
DataColumn dcn = new DataColumn(MarkName);
ColumnList.Add(dcn);
foreach (var item in Obj.GetType().GetProperties())
{
dcn = new DataColumn(item.Name);
ColumnList.Add(dcn);
}
AimColumns = ColumnList.ToArray();
dataTable.Columns.AddRange(AimColumns);
#endregion

//循环添加值到表中
for (int i = 0; i < SourceList.Count; i++)
{
DataRow dataRow = dataTable.NewRow();
//默认赋值从下标第1列开始
for (int x = 1; x < AimColumns.Length; x++)
{
//由于之前对数据表中的格式做了处理,MarkName已经被放置到第一列,所以这里不用判断自增列了
dataRow[x] = SourceList[i].GetType().GetProperty(AimColumns[x].ColumnName);
}
dataTable.Rows.Add(dataRow);
}
//数据库连接字符串获取
GetConnstringByDbType GainConnStr = (DbNum) =>
{
if (DataBaseType == 1) { return TradeServerConn; }
else if (DataBaseType == 2) { return AccountServerConn; }
else { return string.Empty; }
};
SqlBulkCopy BulkObj = new SqlBulkCopy(GainConnStr(DataBaseType));
//设置服务器上面的表名(指定导入的是哪一个表中)
BulkObj.DestinationTableName = DestinationTblName;
BulkObj.BatchSize = dataTable.Rows.Count;

//数据库操作连接对象
SqlConnection sqlConnection = GetSqlconnection(DataBaseType);
sqlConnection.Open();
if (dataTable != null && dataTable.Rows.Count > 0)
{
BulkObj.WriteToServer(dataTable); //复制表数据(导表)
}
BulkObj.Close();
sqlConnection.Close();
stopwatch.Stop();
result = true;
SpendTimeValue = stopwatch.ElapsedMilliseconds;
}
catch (Exception ex)
{
result = false;
LogRecord.WriteTextLogs("SqlserverHelper", "BatchInsertData|" + ex.Message.ToString());
}
return result;
}
#endregion
上面代码中数据库连接对象实例化和数据库连接字符串赋值我就不贴出代码了,没什么营养的。应该是该有注释的地方应该都已经写得很清楚了,没有注释的地方目测大家应该都能看明白。看看上面应该还有一些地方需要改正才能让代码看上去更清爽。比如//连接字符串的获取,最后一个else返回了空字符串:这里大家可以想象怎么让代码改得更好看。还有上面参数传入的数据源集合以及集合里面的实例对象或许应该做一些判断才能继续执行后续代码,我当时写的时候都没考虑。上面的代码最终目的只是为了介绍sqlserver批量数据插入的方法,并非是最终版本,还有好些限制的,比如:必须要有自增列主键的实例对象模型。不过也可以放到程序中直接执行了,哈哈,走你!

后面我又修改了几行代码,让此方法看上去更加完美。并且也去掉了上面代码的诸多限制(比如:必须要有自增列主键,获取数据库连接字符串的值)。不过后续的代码我就补贴了,贴上来没什么意义,上面的代码应该可以直接拿去用了哈,其目的只是介绍sqlserver批量插入数据方法,所以后面最终版本就补贴代码了。

附:如果上述代码执行过程中有什么问题可以加qq:1044248553.如果想要最终版本的代码也可以来找这个秋秋号!

附:这篇文章不讲技术,我也讲不出什么技术的东西,只是以极少为主,希望大家多多指正代码中不规范的地方,最后祝大家生活愉快!