c# excel导入mysql_C#将Excel数据表导入SQL数据库的两种方法

48304ba5e6f9fe08f3fa1abda7d326ab.png

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();

}

}

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值