接上期

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一下。

祝大家学习快乐。

C#连接Excel读取与写入数据库SQL ( 下 )的更多相关文章

  1. C#连接Excel读取与写入数据库SQL ( 上 )

    第一次写C#与sql的东西,主要任务是从Excel读取数据,再存到SQL server中. 先上读取Excel文件的code如下. public bool GetFiles(string equipN ...

  2. Php连接及读取和写入mysql数据库的常用代码

    在这里我总结了常用的PHP连接MySQL数据库以及读取写入数据库的方法,希望能够帮到你,当然也是作为我自己的一个回顾总结. 1.为了更好地设置数据连接,一般会将数据连接所涉及的值定义成变量. $mys ...

  3. 通过POI实现上传EXCEL的批量读取数据写入数据库

    最近公司新增功能要求导入excel,并读取其中数据批量写入数据库.于是就开始了这个事情,之前的文章,记录了上传文件,本篇记录如何通过POI读取excel数据并封装为对象上传. 上代码: 1.首先这是一 ...

  4. Pandas之Dateframe 实现Excel读取与写入

    目的:有时需对数据进行到出到Excel,直观的给别人参阅,或从Excel中读取数据进行操作和分析依赖库 pandas 可简单的读出和写入 1,根据Excel读取( 需安装xlrd库) import n ...

  5. Laravel 上传excel,读取并写入数据库 (实现自动建表、存记录值

    <?php namespace App\Http\Controllers; use Illuminate\Foundation\Bus\DispatchesJobs; use Illuminat ...

  6. C#中excel读取和写入

    1.方法一:采用OleDB读取EXCEL文件: 把EXCEL文件当做一个数据源来进行数据的读取操作,实例如下: public DataSet ExcelToDS(string Path) { stri ...

  7. python使用 openpyxl包 excel读取与写入

    '''### 写入操作 ###from openpyxl import Workbook#实例化对象wb=Workbook()#创建表ws1=wb.create_sheet('work',0) #默认 ...

  8. 使用java进行excel读取和写入

    1:添加处理excel的依赖jar包 <!-- 引入poi,解析workbook视图 --> <dependency> <groupId>org.apache.po ...

  9. Python调用百度地图API实现批量经纬度转换为实际省市地点(api调用,json解析,excel读取与写入)

    1.获取秘钥 调用百度地图API实现得申请百度账号或者登陆百度账号,然后申请自己的ak秘钥.链接如下:http://lbsyun.baidu.com/apiconsole/key?applicatio ...

随机推荐

  1. P1020 导弹拦截(LIS)

    题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某天,雷达捕捉到敌国的导弹 ...

  2. Educational DP Contest F - LCS (LCS输出路径)

    题意:有两个字符串,求他们的最长公共子序列并输出. 题解:首先跑个LCS记录一下dp数组,然后根据dp数组来反着还原路径,只有当两个位置的字符相同时才输出. 代码: char s[N],t[N]; i ...

  3. 01、mysql安装配置

    1.下载mysql软件安装包 MySQL版本:5.7.17 mysql下载地址:http://rj.baidu.com/soft/detail/12585.html?ald 2.配置mysql数据库与 ...

  4. SSM框架整合(Spring + SpringMVC + MyBatis)

    搭建环境 使用Spring(业务层)整合其他的框架SpringMVC(表现层)和MyBatis(持久层) Spring框架 创建数据库表 CREATE DATABASE ssm; USE ssm; C ...

  5. ++i和i++的区别

    它们两个的数值变化的区别,我这里就不多说了 这里主要说明两者在效率上的区别 (1)首先如果是自带的数据类型,比如int型,++i和i++,编译器的实现方式是相同的,两者并没有效率上的区别,虽然也有副本 ...

  6. 析构函数 & 构造函数

    析构函数 & 构造函数 C++ 析构函数(destructor) 与构造函数相反,当对象结束其生命周期,如对象所在的函数已调用完毕时,系统自动执行析构函数. 析构函数往往用来做"清理 ...

  7. 算法型稳定币USDN是如何保持稳定的?

    数据显示,2019年稳定币市场总市值25亿美元,在整个加密货币市场占比 1.3%.可别小瞧了看似微小的1.3%这个数据,它其实是一个庞大的市场.稳定币不仅仅是货币的电子化,它还是一种可编程的加密货币, ...

  8. 为什么Linux需要虚拟内存

    本文转载自为什么 Linux 需要虚拟内存 导语 操作系统中的 CPU 和主内存(Main memory)都是稀缺资源,所有运行在当前操作系统的进程会共享系统中的 CPU 和内存资源,操作系统会使用 ...

  9. C++实现String类

    1 #include<iostream> 2 #include<cstring> 3 4 class String 5 { 6 public: 7 String(); 8 St ...

  10. js获取数字数组最大值的几种方式

    原生Math.max方法 Math.max 方法不能接收数组,可以使用ES6的...将数组打散 const arr = [111, 12, 111, 34, 2, 5, 76]; console.lo ...