C#中如何将Excel中的数据批量导入到sql server?

C#中如何将Excel中的数据批量导入到sql server?,第1张

1.本文实现在c#中可高效的将excel数据导入到sqlserver数据库中,很多人通过循环来拼接sql,这样做不但容易出错而且效率低下,最好的办法是使用bcp,也就是System.Data.SqlClient.SqlBulkCopy 类来实现。不但速度快,而且代码简单,下面测试代码导入一个6万多条数据的sheet,包括读取(全部读取比较慢)在我的开发环境中只需要10秒左右,而真正的导入过程只需要4.5秒。\x0d\x0a2.代码如下:\x0d\x0ausing System \x0d\x0ausing System.Data \x0d\x0ausing System.Windows.Forms \x0d\x0ausing System.Data.OleDb \x0d\x0anamespace WindowsApplication2 \x0d\x0a{ \x0d\x0apublic partial class Form1 : Form \x0d\x0a{ \x0d\x0apublic Form1() \x0d\x0a{ \x0d\x0aInitializeComponent() \x0d\x0a} \x0d\x0a\x0d\x0aprivate void button1_Click(object sender, EventArgs e) \x0d\x0a{ \x0d\x0a//测试,将excel中的sheet1导入到sqlserver中 \x0d\x0astring connString = "server=localhostuid=sapwd=sqlgisdatabase=master" \x0d\x0aSystem.Windows.Forms.OpenFileDialog fd = new OpenFileDialog() \x0d\x0aif (fd.ShowDialog() == DialogResult.OK) \x0d\x0a{ \x0d\x0aTransferData(fd.FileName, "sheet1", connString) \x0d\x0a} \x0d\x0a} \x0d\x0a\x0d\x0apublic void TransferData(string excelFile, string sheetName, string connectionString) \x0d\x0a{ \x0d\x0aDataSet ds = new DataSet() \x0d\x0atry\x0d\x0a{ \x0d\x0a//获取全部数据 \x0d\x0astring strConn = "Provider=Microsoft.Jet.OLEDB.4.0" + "Data Source=" + excelFile + "" + "Extended Properties=Excel 8.0" \x0d\x0aOleDbConnection conn = new OleDbConnection(strConn) \x0d\x0aconn.Open() \x0d\x0astring strExcel = "" \x0d\x0aOleDbDataAdapter myCommand = null \x0d\x0astrExcel = string.Format("select * from [{0}$]", sheetName) \x0d\x0amyCommand = new OleDbDataAdapter(strExcel, strConn) \x0d\x0amyCommand.Fill(ds, sheetName) \x0d\x0a\x0d\x0a//如果目标表不存在则创建 \x0d\x0astring strSql = string.Format("if object_id('{0}') is null create table {0}(", sheetName) \x0d\x0aforeach (System.Data.DataColumn c in ds.Tables[0].Columns) \x0d\x0a{ \x0d\x0astrSql += string.Format("[{0}] varchar(255),", c.ColumnName) \x0d\x0a} \x0d\x0astrSql = strSql.Trim(',') + ")" \x0d\x0a\x0d\x0ausing (System.Data.SqlClient.SqlConnection sqlconn = new System.Data.SqlClient.SqlConnection(connectionString)) \x0d\x0a{ \x0d\x0asqlconn.Open() \x0d\x0aSystem.Data.SqlClient.SqlCommand command = sqlconn.CreateCommand() \x0d\x0acommand.CommandText = strSql \x0d\x0acommand.ExecuteNonQuery() \x0d\x0asqlconn.Close() \x0d\x0a} \x0d\x0a//用bcp导入数据 \x0d\x0ausing (System.Data.SqlClient.SqlBulkCopy bcp = new System.Data.SqlClient.SqlBulkCopy(connectionString)) \x0d\x0a{ \x0d\x0abcp.SqlRowsCopied += new System.Data.SqlClient.SqlRowsCopiedEventHandler(bcp_SqlRowsCopied) \x0d\x0abcp.BatchSize = 100//每次传输的行数 \x0d\x0abcp.NotifyAfter = 100//进度提示的行数 \x0d\x0abcp.DestinationTableName = sheetName//目标表 \x0d\x0abcp.WriteToServer(ds.Tables[0]) \x0d\x0a} \x0d\x0a} \x0d\x0acatch (Exception ex) \x0d\x0a{ \x0d\x0aSystem.Windows.Forms.MessageBox.Show(ex.Message) \x0d\x0a}\x0d\x0a} \x0d\x0a\x0d\x0a//进度显示 \x0d\x0avoid bcp_SqlRowsCopied(object sender, System.Data.SqlClient.SqlRowsCopiedEventArgs e) \x0d\x0a{ \x0d\x0athis.Text = e.RowsCopied.ToString() \x0d\x0athis.Update() \x0d\x0a}\x0d\x0a} \x0d\x0a} \x0d\x0a3.上面的TransferData基本可以直接使用,如果要考虑周全的话,可以用oledb来获取excel的表结构,并且加入ColumnMappings来设置对照字段,这样效果就完全可以做到和sqlserver的dts相同的效果了。

1.使用PHP

Excel

Parser

Pro软件,但是这个软件为收费软件;

2.可将EXCEL表保存为CSV格式,然后通过phpmyadmin或者SQLyog导入,SQLyog导入的方法为:

·将EXCEL表另存为CSV形式;

·打开SQLyog,对要导入的表格右击,点击“导入”-“导入使用加载本地CSV数据”;

·在d出的对话框中,点击“改变..”,把选择“填写excel友好值”,点击确定;

·在“从文件导入”中选择要导入的CSV文件路径,点击“导入”即可导入数据到表上;

3.一个比较笨的手工方法,就是先利用excel生成sql语句,然后再到mysql中运行,这种方法适用于excel表格导入到各类sql数据库:

·假设你的表格有A、B、C三列数据,希望导入到你的数据库中表格tablename,对应的字段分别是col1、col2、col3

·在你的表格中增加一列,利用excel的公式自动生成sql语句,具体方法如下:

1)增加一列(假设是D列)

2)在第一行的D列,就是D1中输入公式:

=CONCATENATE("insert

into

tablename

(col1,col2,col3)

values

(",A1,",",B1,",",C1,")")

3)此时D1已经生成了如下的sql语句:

insert

into

table

(col1,col2,col3)

values

('a','11','33')

4)将D1的公式复制到所有行的D列(就是用鼠标点住D1单元格的右下角一直拖拽下去啦)

5)此时D列已经生成了所有的sql语句

6)把D列复制到一个纯文本文件中,假设为sql.txt

·把sql.txt放到数据库中运行即可,你可以用命令行导入,也可以用phpadmin运行。

实现步骤:

1、打开MicroSoft Excel

2、文件(F)→新建(N)→工作簿→

3、输入SQL*Loader将Excel数据后,存盘为test.xls,

4、文件(F)→另存为(A)→

保存类型为:制表符分隔,起名为text.txt,保存到C: (也可以保存为csv文件,以逗号分隔)

5、须先创建表结构:

连入SQL*Plus,以system/manager用户登录,

以下是代码片段:SQL>conn system/manager

创建表结构

以下是代码片段:

SQL>create table test(id number,——序号

usernamevarchar2(10),——用户名

passwordvarchar2(10),——密码

sj varchar2(20) ——建立日期);

6、创建SQL*Loader输入数据Oracle数据库所需要的文件,均保存到C:,用记事本编辑:

控制文件:input.ctl,内容如下:

load data ——1、控制文件标识

infile ´test.txt´ ——2、要输入的数据文件名为test.txtappend

into table test——3、向表test中追加记录

fields terminated by X´09´——4、字段终止于X´09´,是一个制表符(TAB),如果是csv文件,这里要改为: fields terminated by ´,´

(id,username,password,sj) ——定义列对应顺序

a、insert,为缺省方式,在SQL*Loader将Excel数据装载开始时要求表为空

b、append,在表中追加新记录

c、replace,删除旧记录,替换成新装载的记录

d、truncate,同上

7、在DOS窗口下使用SQL*Loader命令实现数据的输入 www.111cn.net

以下是代码片段:C:>sqlldr system/manager control=input.ctl

默认日志文件名为:input.log

默认坏记录文件为:input.bad

如果是远程对SQL*Loader将Excel数据库进行导入Oracle数据库 *** 作,则输入字符串应改为:

以下是代码片段:

C:>sqlldr userid=system/manager@serviceName_192.168.1.248 control=input.ctl

8、连接到SQL*Plus中,查看是否成功输入,可比较input.log与原test.xls文件,查看Oracle数据库是否全部导入,是否导入成功。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/6423735.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-21
下一篇 2023-03-21

发表评论

登录后才能评论

评论列表(0条)

保存