C# 从Excel读取数据向SQL server写入

第一次写C#与sql的东西,主要任务是从Excel读取数据,再存到SQL server中。

  先上读取Excel文件的code如下。

public bool GetFiles(string equipName)
    {
      //choose all sheet? or all data in sheet?
      string strExcel = "select * from [Sheet1$]";
      //初始化system.IO的配置(路径)
      DirectoryInfo directoryInfo1 = new DirectoryInfo(WPath + equipName + "\\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
          OleDbDataAdapter dAdapter = new OleDbDataAdapter(strExcel, strConn);            //写入ds中的一个table
          dAdapter.Fill(ds);
          OledbConn.Dispose();
          OledbConn.Close();
        }
        catch (Exception ex)
        {

        }
      }
    }

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才算完事。

废话不多说先上后面的代码:(总的代码)

using System.IO;
using System.Data;
using System.Configuration;
using System.ServiceProcess;
using System.Data.SqlClient;
using System.Data.OleDb;
using System.Timers;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)

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 server写入的详细内容,更多关于c# 向SQL server写入数据的资料请关注我们其它相关文章!

(0)

相关推荐

  • C#实现Excel导入sqlite的方法

    本文实例讲述了C#实现Excel导入sqlite的方法,是非常实用的技巧.分享给大家供大家参考.具体方法如下: 首先需要引用system.date.sqlite 具体实现代码如下: system.date.sqlite system.date.sqlite.linq //导入--Excel导入sqlite private void button2_Click(object sender, EventArgs e) { DAL.Sqlite da = new DAL.Sqlite("DataByE

  • C#窗体读取EXCEL并存入SQL数据库的方法

    本文实例讲述了C#窗体读取EXCEL并存入SQL数据库的方法.分享给大家供大家参考.具体实现方法如下: windows窗体上放了一个Textbox1,2个按钮button1和button2~按button1选择excel文件~按button2进行相关处理 复制代码 代码如下: private  void button1_click(object sendeer,EventArgs e) {  OpenFileDialog  openFiledialog1=new OpenFileDialog()

  • C#将Sql数据保存到Excel文件中的方法

    本文实例讲述了C#将Sql数据保存到Excel文件中的方法,非常有实用价值.分享给大家供大家参考借鉴之用. 具体功能代码如下: public string ExportExcel( DataSet ds,string saveFileName) { try { if (ds == null) return "数据库为空"; bool fileSaved = false; Microsoft.Office.Interop.Excel.Application xlApp = new Mic

  • c#生成excel示例sql数据库导出excel

    复制代码 代码如下: using System;using System.Collections.Generic;using System.Linq;using System.Text;using Microsoft.Office.Interop.Excel;using System.Reflection; namespace ListToExcel{    class Program    {        static List<objtype> objs = new List<ob

  • C#实现Excel表数据导入Sql Server数据库中的方法

    本文实例讲述了C#实现Excel表数据导入Sql Server数据库中的方法.分享给大家供大家参考,具体如下: Excel表数据导入Sql Server数据库的方法很多,这里只是介绍了其中一种: 1.首先,我们要先在test数据库中新建一个my_test表,该表具有三个字段tid int类型, tname nvarchar类型, tt nvarchar类型 (注意:my_test表中的数据类型必须与Excel中相应字段的类型一致) 2. 我们用SELECT * FROM  OPENROWSET(

  • C# 从Excel读取数据向SQL server写入

    第一次写C#与sql的东西,主要任务是从Excel读取数据,再存到SQL server中. 先上读取Excel文件的code如下. public bool GetFiles(string equipName) { //choose all sheet? or all data in sheet? string strExcel = "select * from [Sheet1$]"; //初始化system.IO的配置(路径) DirectoryInfo directoryInfo1

  • python3:excel操作之读取数据并返回字典 + 写入的案例

    excel写入数据,使用openpyxl库 class WriteExcel: def __init__(self,path): self.path = path def write_excel(self, sheet_name, content): """ 在excel指定sheet中的写入指定内容,以追加方式 :return: """ wb = openpyxl.load_workbook(self.path) ws = wb[sheet_n

  • asp.net 使用SqlBulkCopy极速插入数据到 SQL Server

    按这个来算,我们那个发水票的时间就会由 10分钟-->20秒,这可太神奇了. 于是乎,下demo,测试,改成自己一般使用的方法测试,NND,还真可以说是极速. 在此贴上我的Demo:SqlBulkCopy.rar 复制代码 代码如下: using System; using System.Diagnostics; using System.Data; using System.Data.SqlClient; using Microsoft.ApplicationBlocks.Data; name

  • php实现文本数据导入SQL SERVER

    我测试是支持的CSV,SQL,TXT 其实其他格式也可以,只不过我用不到而已 速度是差不多是每秒一万吧 <?php set_time_limit(0); ignore_user_abort(true); include('sgk.php'); echo "<br><br>"; ?> <?php function array_iconv($data,$output = 'GBK') { $encode_arr = array('UTF-8','A

  • SQL SERVER 与ACCESS、EXCEL的数据转换方法分享

    在Transact-SQL语句中,我们主要使用OpenDataSource函数.OPENROWSET 函数,关于函数的详细说明,请参考SQL联机帮助.利用下述方法,可以十分容易地实现SQL SERVER.ACCESS.EXCEL数据转换,详细说明如下: 一.SQL SERVER 和ACCESS的数据导入导出 常规的数据导入导出: 使用DTS向导迁移你的Access数据到SQL Server,你可以使用这些步骤: 1在SQL SERVER企业管理器中的Tools(工具)菜单上,选择Data Tra

  • 精妙的SQL和SQL SERVER 与ACCESS、EXCEL的数据导入导出转换

    * 说明:复制表(只复制结构,源表名:a 新表名:b)       select * into b from a where 1<>1     * 说明:拷贝表(拷贝数据,源表名:a 目标表名:b)       insert into b(a, b, c) select d,e,f from b;     * 说明:显示文章.提交人和最后回复时间       select a.title,a.username,b.adddate from table a,(select max(adddate

  • SQL SERVER 与ACCESS、EXCEL的数据转换

    熟悉SQL SERVER 2000的数据库管理员都知道,其DTS可以进行数据的导入导出,其实,我们也可以使用Transact-SQL语句进行导入导出操作.在Transact-SQL语句中,我们主要使用OpenDataSource函数.OPENROWSET 函数,关于函数的详细说明,请参考SQL联机帮助.利用下述方法,可以十分容易地实现SQL SERVER.ACCESS.EXCEL数据转换,详细说明如下: 一.SQL SERVER 和ACCESS的数据导入导出 常规的数据导入导出: 使用DTS向导

  • SQL Server 2008中的数据表压缩功能详细介绍

    SQL Server 2005 SP2为我们带来了vardecimal功能,当时针对decimail和numeric数据类型推出了新的存储格式--vardecimal.vardecimal存储格式允许 decimal和numeric数据类型的存储作为一个可变长度列. 这项功能使得原来定长的decimal数据在数据文件中以可变长的格式存储,据称这项功能可以为典型的数据仓库节省30%的空间,而SQL Server 2008在这一基础上又进一步增强了数据压缩功能.SQL Server 2008现在支持

  • 如何在SQL Server 2005数据库中导入SQL Server 2008的数据

    1. 生成for 2005版本的数据库脚本 2008 的manger studio  -- 打开"对象资源管理器"(没有的话按F8), 连接到你的实例  -- 右键要转到2005的库  -- 任务  -- 生成脚本  -- 在"脚本向导"的"选择数据库"中, 确定选择的是要转到2005的库  -- 勾选"为所选数据库中的所有对象编写脚本"5-- 在接下来的"选择脚本选项"中, 将"编写创建数据库的

随机推荐