C# 从Excel读取数据向SQL server写入
第一次写C#与sql的东西,主要任务是从Excel读取数据,再存到SQLserver中。
先上读取Excel文件的code如下。
publicboolGetFiles(stringequipName) { //chooseallsheet?oralldatainsheet? stringstrExcel="select*from[Sheet1$]"; //初始化system.IO的配置(路径) DirectoryInfodirectoryInfo1=newDirectoryInfo(WPath+equipName+"\\Working"); //用文件流来获取文件夹中所有文件,存放到 FileInfo[]files1=directoryInfo1.GetFiles(); foreach(FileInfofileinfiles1)//Directory.GetFiles(srcFolder) { //连接到excel数据源,xlsx要用ACE stringstrConn=("Provider=Microsoft.ACE.OLEDB.12.0;"+"DataSource="+file.FullName+";ExtendedProperties='Excel12.0';"); OleDbConnectionOledbConn=newOleDbConnection(strConn); if(IsUsed(file.FullName)) { flag=IsUsed(file.FullName); continue; } try { OledbConn.Open(); //存入datatable OleDbDataAdapterdAdapter=newOleDbDataAdapter(strExcel,strConn);//写入ds中的一个table dAdapter.Fill(ds); OledbConn.Dispose(); OledbConn.Close(); } catch(Exceptionex) { } } }
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才算完事。
废话不多说先上后面的代码:(总的代码)
usingSystem.IO; usingSystem.Data; usingSystem.Configuration; usingSystem.ServiceProcess; usingSystem.Data.SqlClient; usingSystem.Data.OleDb; usingSystem.Timers;usingSystem; namespaceDataCollection_model_HD { publicpartialclassService1:ServiceBase { publicService1() { InitializeComponent(); InitTimer(); } #region各种配置的全局定义 //定义一个dataset用于暂时存放excel中的数据,后续要存入datatable DataSetds=newDataSet(); TimerTimModel=newTimer(); publicstaticstringLogPath=ConfigurationManager.AppSettings["LogPath"].ToString(); publicstaticstringWPath=ConfigurationManager.AppSettings["WorkingPath"].ToString(); publicstaticstringAPath=ConfigurationManager.AppSettings["ArchivePath"].ToString(); //数据库登录 //注意IntegratedSecurity不写(false)表示必须要用pwd登录,true表示不用密码也能进入数据库 publicstaticstringConnStr=ConfigurationManager.AppSettings["ConnStr"].ToString(); //用于记录log的时候,机台名字 publicstaticstringmachineName="test"; #endregion #region定时器的初始化,及其事务 //这个按钮用于模拟服务(定时器)启动 publicvoidInitTimer() { //DFL的定时器 TimModel.Interval=15*1000; //定时器的事务 TimModel.Elapsed+=newElapsedEventHandler(ElapsedEventDFL); TimModel.Enabled=true; TimModel.AutoReset=true; } privatevoidElapsedEventDFL(objectsource,ElapsedEventArgse) { if(GetFiles("test")) { //多次读取数据,存在多个文件时但其中某个文件在使用的bug ds.Tables.Clear(); Log4App.WriteLine("----Endthecollect!----",LogPath,machineName,System.Threading.Thread.CurrentThread.ManagedThreadId.ToString(),Log4AES.Type.Information); } else { DataToSql("test"); BackupData("test"); Log4App.WriteLine("----Endthecollect!----",LogPath,machineName,System.Threading.Thread.CurrentThread.ManagedThreadId.ToString(),Log4AES.Type.Information); } } #endregion //log初始化设置 Log4ApplicationLog4App=newLog4Application(); /*用于移动源文件到指定文件夹,也就是备份源数据文件 copyallfileinfolderWorkingtoAchieve*/ publicvoidBackupData(stringequipName) { //需要存放(备份)的文件夹路径(Achieve) stringArchivePath=APath+equipName+"EquipmentTemp.monitoringbythirdtool\\Archive"; //读取数据源文件的文件夹路径(Working) stringWorkingPath=WPath+equipName+"EquipmentTemp.monitoringbythirdtool\\Working"; //初始化system.IO的配置(路径) DirectoryInfodirectoryInfo=newDirectoryInfo(WorkingPath); //用文件流来获取文件夹中所有文件,存放到 FileInfo[]files=directoryInfo.GetFiles(); //循环的把所有机台数据备份到Achieve文件夹 try { foreach(FileInfofileinfiles)//Directory.GetFiles(srcFolder) { //使用IO中的Moveto函数进行移动文件操作 file.MoveTo(Path.Combine(ArchivePath,file.Name)); } } catch(Exceptionex) { } } //判断Excel是否在被人使用 publicboolIsUsed(StringfileName) { boolresult=false; try { FileStreamfs=File.OpenWrite(fileName); fs.Close(); } catch { result=true; } returnresult; } //将xls文件投入datatable,返回一个datatable为ds.table[0] publicboolGetFiles(stringequipName) { boolflag=false; //chooseallsheet?oralldatainsheet? stringstrExcel="select*from[Sheet1$]"; //初始化system.IO的配置(路径) DirectoryInfodirectoryInfo1=newDirectoryInfo(WPath+equipName+"EquipmentTemp.monitoringbythirdtool\\Working"); //用文件流来获取文件夹中所有文件,存放到 FileInfo[]files1=directoryInfo1.GetFiles(); foreach(FileInfofileinfiles1)//Directory.GetFiles(srcFolder) { //连接到excel数据源,xlsx要用ACE stringstrConn=("Provider=Microsoft.ACE.OLEDB.12.0;"+"DataSource="+file.FullName+";ExtendedProperties='Excel12.0';"); OleDbConnectionOledbConn=newOleDbConnection(strConn); if(IsUsed(file.FullName)) { flag=IsUsed(file.FullName); continue; } try { OledbConn.Open(); //存入datatable,Excel表示哪一个sheet,conn表示连接哪一个Excel文件(jet、ACE) OleDbDataAdapterdAdapter=newOleDbDataAdapter(strExcel,strConn); dAdapter.Fill(ds); OledbConn.Dispose(); OledbConn.Close(); } catch(Exceptionex) { } } returnflag; } //将datatable中的数据存入SQLserver publicvoidDataToSql(stringequipName) { //初始化配置sqlserver的服务器名用户等 SqlConnectionConn=newSqlConnection(ConnStr); Conn.Open(); //配置SQLBulkCopy方法,真正用于复制数据到数据库的方法 SqlBulkCopybulkCopy=newSqlBulkCopy(ConnStr,SqlBulkCopyOptions.UseInternalTransaction) { DestinationTableName="ModelTest_HD" }; try { foreach(DataColumniteminds.Tables[0].Columns) { //只复制所选的相关列 bulkCopy.ColumnMappings.Add(item.ColumnName,item.ColumnName); } //开始复制到sql,每次在数据库中添加 bulkCopy.WriteToServer(ds.Tables[0]); bulkCopy.Close(); //copy完了,要清空ds的内容,不然会引起循环写入上一个内容 ds.Tables.Clear(); } catch(Exceptionex) { } finally { //关闭数据库通道 Conn.Close(); } } protectedoverridevoidOnStart(string[]args) { //启动服务时做的事情 } protectedoverridevoidOnStop() { //停止服务时做的事情 } } }
认真看注释可以看出本程序的逻辑就是:
1、读取到Excel数据
2、存Excel数据到SQLserver
3、备份Excel文件到另一个文件夹
其中一些功能大家可以看一看,注释也写的很清楚。对于初学者configurationmanager的内容是在app.config中设置的,这里直接去配置就行(类似html)
foreach(DataColumniteminds.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自己可以查查资料)
最后的最后,注意释放这些dataset,或者table。然后通道也记得close一下。
祝大家学习快乐。
以上就是C#从Excel读取数据向SQLserver写入的详细内容,更多关于c#向SQLserver写入数据的资料请关注毛票票其它相关文章!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。