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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。