接上期

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. 分块 && 例题 I Hate It HDU - 1754

    分块算法: 分块就是对暴力方法的一种优化:                          _ 假设我们总共的序列长度为n,然后我们把它切成√n 块,然后把每一块里的东西当成一个整体来看,完整块:被 ...

  2. Python 实现多线程的几种方式

    threading.Thread 模块 继承实现: import threading import time class TestThread(threading.Thread): def __ini ...

  3. 如何自己绘制fcitx4输入法皮肤?

    先来给大家看看我自己修改后的结果 当然你可以自己设计,自己定义喜欢的颜色和样式 但是注意,这个教程仅仅针对使用fcitx皮肤面板的输入法,例如rime.sunpinyin等. 搜狗输入法.讯飞输入法. ...

  4. Caffe入门:对于抽象概念的图解分析

    Caffe的几个重要文件 用了这么久Caffe都没好好写过一篇新手入门的博客,最近应实验室小师妹要求,打算写一篇简单.快熟入门的科普文. 利用Caffe进行深度神经网络训练第一步需要搞懂几个重要文件: ...

  5. Gym - 101981D Country Meow(模拟退火)题解

    题意: 给\(n\)个三维点,问最小覆盖球的半径. 思路: 模拟退火. 代码: #include<set> #include<map> #include<cmath> ...

  6. windows 10 remote desktop

    windows 10 remote desktop https://support.microsoft.com/en-us/help/4028379/windows-10-how-to-use-rem ...

  7. SQL All In One

    SQL All In One Structured Query Language SQL is an ANSI (American National Standards Institute) stan ...

  8. how to close macos eject icon from menu bar

    how to close macOS eject icon from the menu bar close eject https://apple.stackexchange.com/question ...

  9. input change only trigger once bug

    input change only trigger once bug clear first https://stackoverflow.com/a/11280934/5934465 upload E ...

  10. C++ 中的智能指针-基础

    简介 在现代 C++ 编程中,标准库包含了智能指针(Smart pointers). 智能指针用来确保程序不会出现内存和资源的泄漏,并且是"异常安全"(exception-safe ...