向数据库的一张表中添加数据,可以采用单个添加,即一条数据、一条数据的添加;也可以采用批量导入,依次将好些条数据写入数据库的一张表中。文本借助实例《添加系列信息》讲解一种向数据库批量导入数据的方法。
1.界面设计
观看一下添加系列信息部分的界面设计:
本文主要介绍批量导入系列信息的实现,单个添加的实现不在此文讲解之列!
2.框架结构
此项目的实现,我采用简单的三层,看一下项目框架
3.批量导入数据的实现
下面逐层介绍每层实现:
3.1 SqlHelper数据库助手类中添加向数据库表导入数据的方法(SqlHelper.cs)
#region 批量导入datatable
///
/// 批量导入datatable
///
/// 数据表
/// 数据表名
/// 列集合
public int InsertTable(DataTable dt, string TabelName, DataColumnCollection dtColum)
{
//打开数据库
GetConn();
try
{
//声明SqlBulkCopy ,using释放非托管资源
using (SqlBulkCopy sqlBC = new SqlBulkCopy(conn))
{
//一次批量的插入的数据量
//sqlBC.BatchSize = 1000;
//超时之前操作完成所允许的秒数,如果超时则事务不会提交 ,数据将回滚,所有已复制的行都会从目标表中移除
//sqlBC.BulkCopyTimeout = 60;
//設定 NotifyAfter 属性,以便在每插入10000 条数据时,呼叫相应事件。
//sqlBC.NotifyAfter = 10000;
// sqlBC.SqlRowsCopied += new SqlRowsCopiedEventHandler(OnSqlRowsCopied);
//设置要批量写入的表
sqlBC.DestinationTableName = TabelName;
//自定义的datatable和数据库的字段进行对应
for (int i = 0; i < dtColum.Count; i++)
{
sqlBC.ColumnMappings.Add(dtColum[i].ColumnName.ToString(), dtColum[i].ColumnName.ToString());
}
//批量写入
sqlBC.WriteToServer(dt);
}
//导入成功,返回1
return 1;
}
catch
{
//导入失败返回-1
return -1;
}
finally
{
//关闭数据库
conn.Close();
}
}
#endregion
3.2.DAL层批量导入数据的代码(DaoSeries.cs)
#region 批量导入系列信息
///
/// 批量导入系列信息
///
/// DataTable数据表-dt;
/// DataColumnCollection 列集合-dtColum
/// 整数:大于0代表导入成功;否则导入失败
public int ImportDatatable(DataTable dt, DataColumnCollection dtColum)
{
//定义一个整型标记变量
int result;
//调用sqlHelper的"批量导入datatable表"的方法
result = sqlheler.InsertTable(dt, "T_SeriesInfo", dtColum);
//返回结果
return result;
}
#endregion
3.3.BLL层批量导入数据的代码(MgrSeriesManager.cs)
#region 批量导入系列
///
/// 批量导入系列
///
/// 数据表
/// 数据列集合
/// 整数:大于0代表导入成功,否则导入失败
public int ImportDatatable(DataTable dt, DataColumnCollection dtColum)
{
DaoSeries series=new DaoSeries();
return series.ImportDatatable(dt, dtColum);
}
#endregion
3.4.界面层构造DataTable数据,向BLL层传递(FrmSeriesManager.aspx,FrmSeriesManager.aspx.cs)
这里构造DataTable数据,我是采用从界面上传Excel,然后从Excel获取输入然后存入DataTable的
3.4.1 从界面传入Excel,调用BLL层Excel转换成DataTable的方法实现
#region 批量导入系列
///
/// 批量导入系列
///
protected void btnImportSeries_Click(object sender, EventArgs e)
{
//BLL层,添加系列信息类
MgrSeriesManager series = new MgrSeriesManager();
//BLL层把excel转化为datatable的方法
MgrCreateExcelData createExcelData = new MgrCreateExcelData();
//获取上传文件地址
string url = fupImprotSeries.PostedFile.FileName.ToString();
if (url == "")
{
//数据源为空,弹出提示:请选择Excel文件!
Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "");
return;
}
string urlLocation = url.Substring(url.LastIndexOf("\\") + 1);//获取文件名
DataTable dt;
//在系统中建文件夹up,并将excel文件另存
this.fupImprotSeries.SaveAs(Server.MapPath("~\\up") + "\\" + urlLocation);//记录文件名到服务器相对应的文件夹中
// Response.Write(urlLocation);
//获得文件路径
string strpath = Server.MapPath("~\\up") + "\\" + urlLocation;
//string strpath = "c:\\abc.xls";
// Response.Write(strpath);
//把excel转换为datatable
dt = createExcelData.CreateExcelDataSource(strpath);
DataColumnCollection dcc = dt.Columns;
//导入数据库
int i = series.ImportDatatable(dt, dcc);
if (i > 0)
{
Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "");
}
else
{
Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "");
}
}
#endregion
3.4.2 BLL层Excel转换成DataTable的类(MgrCreateExcelData.cs)
/*************************************************
作者:jql
小组:一中考核系统
说明:把excel转化为datatable
创建日期:2012年11月25日14:17:06
版本号:v1.0
版权所有:信息技术提高班
**********************************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
//引用各命名空间
using System.Data;
using System.Data.OleDb;
using System.Data.SqlClient;
namespace BLL
{
public class MgrCreateExcelData
{
public MgrCreateExcelData()
{
}
///
/// 传入excel路径,转换为datatable
///
///
///
public DataTable CreateExcelDataSource(string url)
{
DataTable dt = null;
// string connetionStr = "Provider=Microsoft.Ace.OleDb.12.0;" + "Data Source="
// +url + ";" + "Extended Properties='Excel 8.0;HDR=Yes;IMEX=1';";
//获得excel数据
string connetionStr = "Provider=Microsoft.Jet.OleDb.4.0;" + "data source=" + url + ";Extended Properties='Excel 8.0; HDR=YES; IMEX=1'";
string strSql = "select * from [Sheet1$]";
OleDbConnection oleConn = new OleDbConnection(connetionStr);
OleDbDataAdapter oleAdapter = new OleDbDataAdapter(strSql, connetionStr);
try
{
//把excel数据填充给datatable
dt = new DataTable();
oleAdapter.Fill(dt);
return dt;
}
catch (Exception ex)
{
throw ex;
}
finally
{
oleAdapter.Dispose();
oleConn.Close();
oleConn.Dispose();
}
}
}
}
至此向数据库批量导入数据就实现了,如果你想对要导入数据库的数据做合法性判断,执行Excel转换成Datatable时,自己加些判断处理就行了!