C#将Excel数据表导入SQL数据库的两种方法(转)

2023-05-16

最近用写个winform程序想用excel 文件导入数据库中,网上寻求办法,找到了这个经过尝试可以使用。

方法一:

实现在c#中可高效的将excel数据导入到sqlserver数据库中,很多人通过循环来拼接sql,这样做不但容易出错而且效率低下,最好的办法是使用bcp,也就是System.Data.SqlClient.SqlBulkCopy 类来实现。

using System;    
using System.Collections.Generic;    
using System.ComponentModel;    
using System.Data;    
using System.Drawing;    
using System.Linq;    
using System.Text;    
using System.Windows.Forms;    
using System.Data.OleDb;    
    
namespace ExcelToSQL    
{    
    public partial class Form1 : Form    
    {    
        public Form1()    
        {    
            InitializeComponent();    
        }    
    
        private void button1_Click(object sender, EventArgs e)    
        {    
            //测试,将excel中的student导入到sqlserver的db_test中,如果sql中的数据表不存在则创建        
            string connString = "server = (local); uid = sa; pwd = sa; database = db_test";    
            System.Windows.Forms.OpenFileDialog fd = new OpenFileDialog();       
            if (fd.ShowDialog() == DialogResult.OK)       
            {    
                TransferData(fd.FileName, "student", connString);    
            }       
        }       
    
        public void TransferData(string excelFile, string sheetName, string connectionString)       
        {       
            DataSet ds = new DataSet();    
            try      
            {    
                //获取全部数据     
                string strConn = "Provider = Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + excelFile + ";" + "Extended Properties = Excel 8.0;";       
                OleDbConnection conn = new OleDbConnection(strConn);    
                conn.Open();    
                string strExcel = "";    
                OleDbDataAdapter myCommand = null;       
                strExcel = string.Format("select * from [{0}$]", sheetName);    
                myCommand = new OleDbDataAdapter(strExcel, strConn);    
                myCommand.Fill(ds, sheetName);    
      
                //如果目标表不存在则创建,excel文件的第一行为列标题,从第二行开始全部都是数据记录     
                string strSql = string.Format("if not exists(select * from sysobjects where name = '{0}') create table {0}(", sheetName);   //以sheetName为表名     
    
                foreach (System.Data.DataColumn c in ds.Tables[0].Columns)    
                {       
                    strSql += string.Format("[{0}] varchar(255),", c.ColumnName);       
                }       
                strSql = strSql.Trim(',') + ")";       
      
                using (System.Data.SqlClient.SqlConnection sqlconn = new System.Data.SqlClient.SqlConnection(connectionString))       
                {    
                    sqlconn.Open();       
                    System.Data.SqlClient.SqlCommand command = sqlconn.CreateCommand();       
                    command.CommandText = strSql;       
                    command.ExecuteNonQuery();       
                    sqlconn.Close();    
                }       
                //用bcp导入数据        
                //excel文件中列的顺序必须和数据表的列顺序一致,因为数据导入时,是从excel文件的

第二行数据开始,不管数据表的结构是什么样的,反正就是第一列的数据会插入到数据表的第一列字段中,第二列的数据插入到数据表的第二列字段中,以此类推,它本身不会去判断要插入的数据是对应数据表中哪一个字段的

         

using (System.Data.SqlClient.SqlBulkCopy bcp = new System.Data.SqlClient.SqlBulkCopy(connectionString))       
                {       
                    bcp.SqlRowsCopied += new System.Data.SqlClient.SqlRowsCopiedEventHandler(bcp_SqlRowsCopied);       
                    bcp.BatchSize = 100;//每次传输的行数        
                    bcp.NotifyAfter = 100;//进度提示的行数        
                    bcp.DestinationTableName = sheetName;//目标表        
                    bcp.WriteToServer(ds.Tables[0]);    
                }       
            }       
            catch (Exception ex)       
            {       
                System.Windows.Forms.MessageBox.Show(ex.Message);       
            }     
        }       
      
        //进度显示        
        void bcp_SqlRowsCopied(object sender, System.Data.SqlClient.SqlRowsCopiedEventArgs e)       
        {       
            this.Text = e.RowsCopied.ToString();       
            this.Update();       
        }      
    }       
}   


方法二:

先将Excel文件转换成DataTable,然后再循环将记录插入到数据库表中,这种方式可以任由程序员来选择将哪列数据导入到数据表的哪个字段中

using System;  
using System.Collections.Generic;  
using System.ComponentModel;  
using System.Data;  
using System.Drawing;  
using System.Linq;  
using System.Text;  
using System.Windows.Forms;  
using System.Data.OleDb;  
using System.Data.SqlClient;  
 
namespace ExcelToSQL  
{  
    public partial class Form2 : Form  
    {  
        public Form2()  
        {  
            InitializeComponent();  
        }  
 
        DataTable dt = new DataTable();  
        string connString = "server = (local); uid = sa; pwd = sa; database = db_test";  
        SqlConnection conn;  
 
        private void button1_Click(object sender, EventArgs e)  
        {  
            System.Windows.Forms.OpenFileDialog fd = new OpenFileDialog();  
            if (fd.ShowDialog() == DialogResult.OK)  
            {  
                string fileName = fd.FileName;  
                bind(fileName);  
            }  
        }  
        private void bind(string fileName)  
        {  
            string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" +  
                 "Data Source=" + fileName + ";" +  
                 "Extended Properties='Excel 8.0; HDR=Yes; IMEX=1'";  
            OleDbDataAdapter da = new OleDbDataAdapter("SELECT *  FROM [student$]", strConn);  
            DataSet ds = new DataSet();  
            try 
            {  
                da.Fill(ds);  
                dt = ds.Tables[0];  
                this.dataGridView1.DataSource = dt;  
            }  
            catch (Exception err)  
            {  
                MessageBox.Show("操作失败!" + err.ToString());  
            }  
        }  
 
        //将Datagridview1的记录插入到数据库    
        private void button2_Click(object sender, EventArgs e)  
        {  
            conn = new SqlConnection(connString);  
            conn.Open();  
            if (dataGridView1.Rows.Count > 0)  
            {  
                DataRow dr = null;  
                for (int i = 0; i < dt.Rows.Count; i++)  
                {  
                    dr = dt.Rows[i];  
                    insertToSql(dr);  
                }  
                conn.Close();  
                MessageBox.Show("导入成功!");  
            }  
            else 
            {  
                MessageBox.Show("没有数据!");  
            }  
        }  
        private void insertToSql(DataRow dr)  
        {  
            //excel表中的列名和数据库中的列名一定要对应  
            string name = dr["StudentName"].ToString();  
            string sex = dr["Sex"].ToString();  
            string no = dr["StudentIDNO"].ToString();  
            string major = dr["Major"].ToString();  
            string sql = "insert into student values('" + name + "','" + sex + "','" + no + "','" + major +"')";           
            SqlCommand cmd = new SqlCommand(sql, conn);             
            cmd.ExecuteNonQuery();  
        }  
    }  
} 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C#将Excel数据表导入SQL数据库的两种方法(转) 的相关文章

随机推荐

  • 记一次创建云硬盘失败的解决过程

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 一 背景 登录dashboard xff0c 点击创建云硬盘失败 xff0c 而且是点击完就直接报error错误 二 解决经过 思路一 xff1a 新上传的image镜像
  • linux samba 配置

    1 所需要软件包 samba common软件包中提供了samba服务器和客户中都必须使用的公共文件 samba软件包中包括了samba服务器程序的所有文件 samba client软件包中提供了Samabe客户机器的所有文件 system
  • tightvnc 远程开机_如何在Linux中安装和访问TightVNC远程桌面?

    tightvnc 远程开机 TightVNC is a very handy remote desktop application which is based on VNC protocol TightVNC is mostly used
  • linux grub命令行,引导工具GRUB详解

    导读 引导程序是驻留在硬盘第一个扇区 MBR 主引导记录 的程序 GRUB是一个功能强大的多系统引导程序 xff0c 专门处理Linux与其它操作系统共存的问题 下面就由我介绍一下grub conf文件里的具体内容及其含义 使用一下命令可以
  • Formik官方应用案例解析(三)使用react-select

    react select简介 React Select是github上一个极其火的控件库 xff0c 星数达到13004 xff0c 它是React开发中几乎是你必需打交道的一个内容 React Select的基本功能实现的是一个表单中的常
  • Juniper MPLS Static LSP

    MPLS Static LSP 1 配置接口去接收和处理MPLS帧 user 64 R1 set interface ge 1 0 0 unit 0 family inet family mpls 2 指定哪个接口运行MPLS user 6
  • 201803考试批次2C 程序设计语言,重庆大学201803批次2可视化程序设计(VB)D卷答案...

    201803考试批次2可视化程序设计 VB D卷 5 O0 R K G l可视化程序设计 VB l K 3 Z t 一 单项选择题 共 10 题 0 20 分 c c N G1 F4 D6 39 64 1 下列程序段的执行结果为 Dim x
  • VNC注册码

    5D7L8 ZQXSA 2L5D4 4UFB4 PWDLA 转载于 https blog 51cto com ciscolinux 1320541
  • matlab中矩阵可视化,matlab-如何可视化显示颜色和值的矩阵?

    您可以使用内置功能 39 X Y Z TickLabelRotation 39 和 39 X Y Z TickLabelRotation 39 并调整图形对象的许多参数 xff0c 轻松地自己创建此类绘图 这是一个例子 xff1a mat
  • Formik与antd-mobile的表单实践(上)

    概览 本文主要用于记录该次使用Formik时用到的相关接口 xff0c 而侧重点不在antd mobile xff0c 对antd mobile会贴出对应组件API 文章需要基础知识点 xff1a React基本知识ES6基本知识 文章实践
  • AT&T CORD架构解读

    这一两年 xff0c 我们时常听到CORD项目 xff08 Central Office Re Architected as a Data Center xff09 AT amp T希望通过CORD项目将运营商网络中的传统端局 xff08
  • 发送端口25,465,587端口疑问解答

    25端口 xff08 SMTP xff09 xff1a 25端口为SMTP xff08 Simple Mail Transfer Protocol xff0c 简单邮件传输协议 xff09 服务所开放的 xff0c 是用于发送邮件 如今绝大
  • brctl 命令详解

    安装网桥管理工具包 xff1a bridge utile 96 96 96 yum install bridge utils y 96 96 96 96 96 96 使用brctl命令创建网桥br1 96 96 96 brctl addbr
  • 缓存缓存CSS的策略

    浏览器缓存CSS将带来主要的性能提升 您确保服务器设置为发送标头 xff0c 这些标头告诉浏览器在给定的时间内挂接到CSS文件 最好的做法是 xff0c 即使不是大多数站点 xff0c 许多站点已经在这样做 与浏览器缓存紧密结合的是缓存清除
  • John the Ripper 安装用使用

    试着在ubuntu下安装了John the Ripper最新版本 xff11 7 9 xff0c 非常不给面子 xff0c 不成功 xff0c 总是报 34 No password hashes loaded 34 的错误 最终参照这篇文章
  • Vue父组件接收不到子组件$emit事件的原因分析

    通常有两种情况 xff1a 事件名称不全是小写 事件名称要求全小写 不是父子关系 这里的父子关系是严格的父子关系 xff0c 祖孙关系也不行 只能一层一层触发 xff0c 这在写树形组件时 xff0c 很容易掉坑里
  • NUMA的关闭方法【转】

    Centos 6 在 etc grub conf 在kernel 添加numa 61 off 就行了 一 检查OS是否开启NUMA numactl hardware available 1 nodes 0 如果是2或多个nodes就说明nu
  • java 网站用户在线和客服聊天

    注 xff1a 本文来源于 java 网站用户在线和客服聊天 这是应用到项目中的一个例子 实现原理是将信息存储到Application域里面 然后使用Struts2 Action 用json格式的数据进行前后台交互 截图 xff1a 前台用
  • Linux中文乱码问题终极解决方法

    方法一 xff1a 修改 root bash profile文件 xff0c 增加export LANG 61 zh CN GB18030 该文件在用户目录下 xff0c 对于其他用户 xff0c 也必须相应修改该文件 使用该方法时putt
  • C#将Excel数据表导入SQL数据库的两种方法(转)

    最近用写个winform程序想用excel 文件导入数据库中 xff0c 网上寻求办法 xff0c 找到了这个经过尝试可以使用 方法一 实现在c 中可高效的将excel数据导入到sqlserver数据库中 很多人通过循环来拼接sql xff