zoukankan      html  css  js  c++  java
  • 批量从Execl把数据导入到sql中 效率挺高 下

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

     1 #region 得到数据集,根据Execl路径
     2         /// <summary>
     3         /// 得到数据集,根据Execl路径
     4         /// </summary>
     5         /// <param name="ExeclPath">表格的路径</param>
     6         /// <param name="ds">返回的数据集</param>
     7         /// <returns>是否成功</returns>
     8         private bool GetDataSetByExeclPath(string ExeclPath, out DataSet ds)
     9         {
    10             bool isOK = true;
    11             ds = new DataSet();
    12             Application.DoEvents();
    13             try
    14             {
    15                 string fileExt = System.IO.Path.GetExtension(ExeclPath);
    16                 string mystring;
    17                 if (fileExt.ToLower() == ".xls")//判断表的格式
    18                 {
    19                     mystring = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + ExeclPath + ";Extended Properties=\"Excel 8.0;HDR=YES;IMEX=1\"";
    20                 }
    21                 else
    22                 {
    23                     mystring = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + ExeclPath + ";Extended Properties=\"Excel 12.0;HDR=YES;IMEX=1\"";
    24                 }
    25 
    26                 System.Data.OleDb.OleDbConnection conn = new System.Data.OleDb.OleDbConnection(mystring);//创建连接
    27                 conn.Open();
    28 
    29                 DataTable dtDATAExcel = new System.Data.DataTable();
    30                 DataTable dtDATA = conn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, null);//得到所有表的信息
    31                 string table = "";
    32                 for (int i = 0; i < dtDATA.Rows.Count; i++)//循环所有表
    33                 {
    34                     try
    35                     {
    36                         DataTable dt = new DataTable();
    37                         table = dtDATA.Rows[i][2].ToString().Trim();//得到表名
    38                         System.Data.OleDb.OleDbDataAdapter objadp = new System.Data.OleDb.OleDbDataAdapter("select * from [" + table + "]", conn);
    39                         objadp.Fill(dt);//得到表格
    40                         if (dt.Rows.Count > 0)
    41                         {
    42                             ds.Tables.Add(dt);
    43                         }
    44                     }
    45                     catch
    46                     {
    47                     }
    48                 }
    49                 conn.Close();//关闭连接
    50             }
    51             catch
    52             {
    53                 isOK = false;
    54             }
    55             return isOK;
    56         }
    57         #endregion

    这个是这个方法的调用:

     1     /// <summary>
     2         /// 导入表格
     3         /// </summary>
     4         /// <param name="sender"></param>
     5         /// <param name="e"></param>
     6         private void btnExecl_Click(object sender, EventArgs e)
     7         {
     8             ofdExcel.FileName = "";
     9             if (ofdExcel.ShowDialog() == DialogResult.OK)
    10             {
    11                 DataSet ds = new DataSet();
    12                 if (GetDataSetByExeclPath(ofdExcel.FileName, out ds))
    13                 {
    14                     MessageBox.Show(ds.Tables.Count.ToString());
    15                 }
    16             }
    17         }

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

     1         #region  批量插入SQL表+ public int bulk_ins_table(DataTable _dt, string _tablename)
     2         /// <summary>
     3         /// 批量插入SQL表
     4         /// 其中_dt的结构必须与_tablename指定的表结构完全一致
     5         /// </summary>
     6         /// <param name="_dt"></param>
     7         /// <param name="_tablename"></param>
     8         /// <returns></returns>
     9         public bool bulk_ins_table(DataTable _dt, string _tablename)
    10         {
    11             bool isOK = true;
    12             try
    13             {
    14                 System.Data.SqlClient.SqlBulkCopy sqlbulkcopy = new System.Data.SqlClient.SqlBulkCopy("这是连接字符串", System.Data.SqlClient.SqlBulkCopyOptions.UseInternalTransaction);
    15                 sqlbulkcopy.DestinationTableName = _tablename;//数据库中的表名
    16                 sqlbulkcopy.WriteToServer(_dt);
    17             }
    18             catch //(Exception e)
    19             {
    20                 //throw e;
    21                 isOK = false;
    22             }
    23             return isOK;
    24         }
    25 
    26         #endregion
  • 相关阅读:
    为什么会决定进行分库分表,分库分表过程中遇到什么难题,如何解决的?
    MySQL主从复制什么原因会造成不一致,如何预防及解决?
    PyQt5(2)、垃圾分类小程序(2)——初代窗口程序可执行文件
    垃圾分类小程序(1)——实现查找垃圾的类别
    python上的数据库sqlite3——插入多行数据
    pandas.DataFrame——pd数据框的简单认识、存csv文件
    Beautiful Soup 4.2.0 doc_tag、Name、Attributes、多值属性
    第一个爬虫——豆瓣新书信息爬取
    Decorator——Python初级函数装饰器
    正则表达式——字符类、分支条件、分组
  • 原文地址:https://www.cnblogs.com/haowuji/p/2826069.html
Copyright © 2011-2022 走看看