凯发娱发k8

利用c# 怎么将excel数据读取到sql server中 -凯发娱发k8

2024-01-04

这期内容当中小编将会给大家带来有关利用c# 怎么将数据读取到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自己可以查查资料)

上述就是小编为大家分享的利用c# 怎么将excel数据读取到sql server中了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注本站行业资讯频道。

网站地图