这期内容当中小编将会给大家带来有关利用c# 怎么将数据读取到sql server中,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
先上读取excel文件的code如下。
public bool getfiles(string equipname) { //choose all sheet? or all data in sheet? string strexcel = "select * from [sheet1$]"; //初始化system.io的配置(路径) directoryinfo directoryinfo1 = new directoryinfo(wpath equipname "\\working"); //用文件流来获取文件夹中所有文件,存放到 fileinfo[] files1 = directoryinfo1.getfiles(); foreach (fileinfo file in files1) // directory.getfiles(srcfolder) { // 连接到excel 数据源, xlsx要用ace string strconn = ("provider=microsoft.ace.oledb.12.0;" "data source= " file.fullname "; extended properties='excel 12.0';"); oledbconnection oledbconn = new oledbconnection(strconn); if (isused(file.fullname)) { flag = isused(file.fullname); continue; } try { oledbconn.open(); // 存入datatable oledbdataadapter dadapter = new oledbdataadapter(strexcel, strconn); //写入ds中的一个table dadapter.fill(ds); oledbconn.dispose(); oledbconn.close(); } catch (exception ex) { } } }
foreach用于遍历所有excel文件;
strexcel用于选择excel文件中sheet的内容,select * 表示选取sheet中所有行和列;
strconn用于设置读取的方法,provider的设置很重要,ace表示最新的.xlsx文件,jet 表示读取.xls文件,两者有点区别,datasource表示文件名,包括路径。
oledbdataadapter 用于按(命令)去执行填充dataset的功能
dataset简而言之可以理解为 虚拟的 数据库或是excel文件。而dataset里的datatable 可以理解为数据库中的table活着excel里的sheet(excel里面不是可以新建很多表吗)。
这样说应该很容易懂了,相当于dataset只是暂时存放下数据,微软官方解释是存在内存中。至于为啥要找个“中介”来存数据,这个估计是为了和sql匹配。
好了,接下来说下这次的重点。
在把excel的数据存到dataset后,我们要把dataset的数据存入sql才算完事。
废话不多说先上后面的代码:(总的代码)
using system.io; using system.data; using system.configuration; using system.serviceprocess; using system.data.sqlclient; using system.data.oledb; using system.timers;using system; namespace datacollection_model_hd { public partial class service1 : servicebase { public service1() { initializecomponent(); inittimer(); } #region 各种配置的全局定义 //定义一个dataset 用于暂时存放excel中的数据,后续要存入datatable dataset ds = new dataset(); timer timmodel = new timer(); public static string logpath = configurationmanager.appsettings["logpath"].tostring(); public static string wpath = configurationmanager.appsettings["workingpath"].tostring(); public static string apath = configurationmanager.appsettings["archivepath"].tostring(); //数据库登录 //注意integrated security不写(false)表示必须要用pwd登录,true表示不用密码也能进入数据库 public static string connstr = configurationmanager.appsettings["connstr"].tostring(); //用于记录log的时候,机台名字 public static string machinename = "test"; #endregion #region 定时器的初始化,及其事务 //这个按钮用于模拟服务(定时器)启动 public void inittimer() { //dfl的定时器 timmodel.interval = 15 * 1000; //定时器的事务 timmodel.elapsed = new elapsedeventhandler(elapsedeventdfl); timmodel.enabled = true; timmodel.autoreset = true; } private void elapsedeventdfl(object source, elapsedeventargs e) { if (getfiles("test")) { //多次读取数据,存在多个文件时但其中某个文件在使用的bug ds.tables.clear(); log4app.writeline(" ---- end the collect ! ----", logpath, machinename, system.threading.thread.currentthread.managedthreadid.tostring(), log4aes.type.information); } else { datatosql("test"); backupdata("test"); log4app.writeline(" ---- end the collect ! ----", logpath, machinename, system.threading.thread.currentthread.managedthreadid.tostring(), log4aes.type.information); } } #endregion //log初始化设置 log4application log4app = new log4application(); /*用于移动源文件到指定文件夹,也就是备份源数据文件 copy all file in folder working to achieve*/ public void backupdata(string equipname) { //需要存放(备份)的文件夹路径(achieve) string archivepath = apath equipname " equipment temp. monitoring by third tool\\archive"; //读取数据源文件的文件夹路径(working) string workingpath = wpath equipname " equipment temp. monitoring by third tool\\working"; //初始化system.io的配置(路径) directoryinfo directoryinfo = new directoryinfo(workingpath); //用文件流来获取文件夹中所有文件,存放到 fileinfo[] files = directoryinfo.getfiles(); //循环的把所有机台数据备份到achieve文件夹 try { foreach (fileinfo file in files) // directory.getfiles(srcfolder) { //使用io中的moveto函数进行移动文件操作 file.moveto(path.combine(archivepath, file.name)); } } catch (exception ex) { } } //判断excel是否在被人使用 public bool isused(string filename) { bool result = false; try { filestream fs = file.openwrite(filename); fs.close(); } catch { result = true; } return result; } //将xls文件投入datatable , 返回一个datatable为 ds.table[0] public bool getfiles(string equipname) { bool flag = false; //choose all sheet? or all data in sheet? string strexcel = "select * from [sheet1$]"; //初始化system.io的配置(路径) directoryinfo directoryinfo1 = new directoryinfo(wpath equipname " equipment temp. monitoring by third tool\\working"); //用文件流来获取文件夹中所有文件,存放到 fileinfo[] files1 = directoryinfo1.getfiles(); foreach (fileinfo file in files1) // directory.getfiles(srcfolder) { // 连接到excel 数据源, xlsx要用ace string strconn = ("provider=microsoft.ace.oledb.12.0;" "data source= " file.fullname "; extended properties='excel 12.0';"); oledbconnection oledbconn = new oledbconnection(strconn); if (isused(file.fullname)) { flag = isused(file.fullname); continue; } try { oledbconn.open(); // 存入datatable,excel表示哪一个sheet,conn表示连接哪一个excel文件(jet、ace) oledbdataadapter dadapter = new oledbdataadapter(strexcel, strconn); dadapter.fill(ds); oledbconn.dispose(); oledbconn.close(); } catch (exception ex) { } } return flag; } // 将datatable中的数据存入sql server public void datatosql(string equipname) { //初始化配置 sqlserver的服务器名用户等 sqlconnection conn = new sqlconnection(connstr); conn.open(); //配置sqlbulkcopy方法,真正用于复制数据到数据库的方法 sqlbulkcopy bulkcopy = new sqlbulkcopy(connstr, sqlbulkcopyoptions.useinternaltransaction) { destinationtablename = "modeltest_hd" }; try { foreach (datacolumn item in ds.tables[0].columns) { //只复制所选的相关列 bulkcopy.columnmappings.add(item.columnname, item.columnname); } //开始复制到sql,每次在数据库中添加 bulkcopy.writetoserver(ds.tables[0]); bulkcopy.close(); //copy完了,要清空ds的内容,不然会引起循环写入上一个内容 ds.tables.clear(); } catch (exception ex) { } finally { //关闭数据库通道 conn.close(); } } protected override void onstart(string[] args) { //启动服务时做的事情 } protected override void onstop() { //停止服务时做的事情 } } }
认真看注释可以看出本程序的逻辑就是:
1、读取到excel数据
2、存excel数据到sql server
3、备份excel文件到另一个文件夹
其中一些功能大家可以看一看,注释也写的很清楚。对于初学者 configurationmanager的内容是在 app.config中设置的,这里直接去配置就行(类似html)
foreach (datacolumn item in ds.tables[0].columns) { //只复制所选的相关列 bulkcopy.columnmappings.add(item.columnname, item.columnname); }
注意这一段代码,表示只复制数据库与excel表中 “列名”一致的数据,如果不一致就不复制。(注意数据的格式,int还char 这些必须弄清楚)
然后bulkcopy.writetoserver(ds.tables[0])这里,就是把ds.tables的数据复制到sqlserver ,tables[0]表示ds第一张表(其实我们也只有一张表,至于怎么在dataset中新建table自己可以查查资料)
上述就是小编为大家分享的利用c# 怎么将excel数据读取到sql server中了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注本站行业资讯频道。