接上期

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

不 懂可以评论问楼主。

  接下来就是重要的SQLBulkCopy了:

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自己可以查查资料)

最后的最后,注意释放这些dataset,或者table。然后通道也记得close一下。

祝大家学习快乐。

最新文章

  1. 全国高校网安联赛Web专场~WriteUp
  2. Java追加文件内容的三种方法
  3. 通过简单的Linux内核启动程序代码窥探操作系统的启动原理
  4. hadoop cdh 4.5的安装配置
  5. MYSQL 查询缓存
  6. 如何看apache的版本号
  7. Angularjs interceptor
  8. Thymeleaf的超链接与AJAX的跳转问题
  9. 基于.net的微服务架构下的开发测试环境运维实践
  10. echo 与 printf的区别与联系
  11. bzoj 松鼠的新家
  12. MySQL firstmatch strategy
  13. SpringCloud服务负载均衡实现原理01
  14. [Android]-图片JNI(C++\Java)高斯模糊的实现与比較
  15. iPhone X 适配 ( iOS 11适配 )
  16. leecode第六十一题(旋转链表)
  17. 【JVM】内存分析<一>工具的使用
  18. luogu P1401 城市
  19. 【docker】 追加端口映射时 报错 WARNING: IPv4 forwarding is disabled. Networking will not work.
  20. myeclipse和ecplise中安装git插件的问题

热门文章

  1. 2020ICPC·小米 网络选拔赛第一场 J.Matrix Subtraction (贪心,二维差分)
  2. 升级到WLS2
  3. 【cpp上】课后正误小题
  4. SpringSecurity认证流程
  5. Deep Learning Specialization 笔记
  6. Bash on Ubuntu on Windows ( Windows Subsystem for Linux)
  7. GIF : 超好用的gif 图片制作工具: LICEcap
  8. i18n 和 L10n (internationalization and localization) 国际化与本地化(具有全球战略眼光的公司企业的必由之路)
  9. js swap array
  10. 稳定币USDN的算法调控