您的位置:首页 > 数据库

批量从Execl把数据导入到sql中 效率挺高

2012-12-20 11:06 141 查看
根据下面的这个方法就可以得到表格中的数据信息。(有时候得不到有的单元格,看是不是因为表格中一个列中存在两个数据格式)

#region 得到数据集,根据Execl路径
/// <summary>
/// 得到数据集,根据Execl路径
/// </summary>
/// <param name="ExeclPath">表格的路径</param>
/// <param name="ds">返回的数据集</param>
/// <returns>是否成功</returns>
private bool GetDataSetByExeclPath(string ExeclPath, out DataSet ds)
{
bool isOK = true;
ds = new DataSet();
Application.DoEvents();
try
{
string fileExt = System.IO.Path.GetExtension(ExeclPath);
string mystring;
if (fileExt.ToLower() == ".xls")//判断表的格式
{
mystring = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + ExeclPath + ";Extended Properties=\"Excel 8.0;HDR=YES;IMEX=1\"";
}
else
{
mystring = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + ExeclPath + ";Extended Properties=\"Excel 12.0;HDR=YES;IMEX=1\"";
}

System.Data.OleDb.OleDbConnection conn = new System.Data.OleDb.OleDbConnection(mystring);//创建连接
conn.Open();

DataTable dtDATAExcel = new System.Data.DataTable();
DataTable dtDATA = conn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, null);//得到所有表的信息
string table = "";
for (int i = 0; i < dtDATA.Rows.Count; i++)//循环所有表
{
try
{
DataTable dt = new DataTable();
table = dtDATA.Rows[i][2].ToString().Trim();//得到表名
System.Data.OleDb.OleDbDataAdapter objadp = new System.Data.OleDb.OleDbDataAdapter("select * from [" + table + "]", conn);
objadp.Fill(dt);//得到表格
if (dt.Rows.Count > 0)
{
ds.Tables.Add(dt);
}
}
catch
{
}
}
conn.Close();//关闭连接
}
catch
{
isOK = false;
}
return isOK;
}
#endregion


这个是这个方法的调用:

/// <summary>
/// 导入表格
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnExecl_Click(object sender, EventArgs e)
{
ofdExcel.FileName = "";
if (ofdExcel.ShowDialog() == DialogResult.OK)
{
DataSet ds = new DataSet();
if (GetDataSetByExeclPath(ofdExcel.FileName, out ds))
{
MessageBox.Show(ds.Tables.Count.ToString());
}
}
}


然后可以把经过处理的数据导入到sqlserver数据库:有时候会暴无效的列长度,可能是列 的长度超过了数据库定义的长度,在处理数据的时候要截取

#region  批量插入SQL表+ public int bulk_ins_table(DataTable _dt, string _tablename)
/// <summary>
/// 批量插入SQL表
/// 其中_dt的结构必须与_tablename指定的表结构完全一致
/// </summary>
/// <param name="_dt"></param>
/// <param name="_tablename"></param>
/// <returns></returns>
public bool bulk_ins_table(DataTable _dt, string _tablename)
{
bool isOK = true;
try
{
System.Data.SqlClient.SqlBulkCopy sqlbulkcopy = new System.Data.SqlClient.SqlBulkCopy("这是连接字符串", System.Data.SqlClient.SqlBulkCopyOptions.UseInternalTransaction);
sqlbulkcopy.DestinationTableName = _tablename;//数据库中的表名
sqlbulkcopy.WriteToServer(_dt);
}
catch //(Exception e)
{
//throw e;
isOK = false;
}
return isOK;
}

#endregion
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: