最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C# 從Excel讀取數(shù)據(jù)向SQL server寫入

 更新時(shí)間:2021年03月08日 08:34:34   作者:Tayoop  
這篇文章主要介紹了C# 從Excel讀取數(shù)據(jù)向SQL server寫入的方法,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下

  第一次寫C#與sql的東西,主要任務(wù)是從Excel讀取數(shù)據(jù),再存到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 數(shù)據(jù)源,  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中的一個(gè)table
          dAdapter.Fill(ds);
          OledbConn.Dispose();
          OledbConn.Close();
        }
        catch (Exception ex)
        {

        }
      }
    }

foreach用于遍歷所有Excel文件;

strExcel用于選擇Excel文件中sheet的內(nèi)容,select * 表示選取sheet中所有行和列;

strConn用于設(shè)置讀取的方法,provider的設(shè)置很重要,ACE表示最新的.xlsx文件,jet 表示讀取.xls文件,兩者有點(diǎn)區(qū)別,DataSource表示文件名,包括路徑。

OleDbDataAdapter 用于按(命令)去執(zhí)行填充dataset的功能

dataset簡而言之可以理解為 虛擬的 數(shù)據(jù)庫或是Excel文件。而dataset里的datatable 可以理解為數(shù)據(jù)庫中的table活著Excel里的sheet(Excel里面不是可以新建很多表嗎)。

這樣說應(yīng)該很容易懂了,相當(dāng)于dataset只是暫時(shí)存放下數(shù)據(jù),微軟官方解釋是存在內(nèi)存中。至于為啥要找個(gè)“中介”來存數(shù)據(jù),這個(gè)估計(jì)是為了和SQL匹配。

好了,接下來說下這次的重點(diǎn)。

在把Excel的數(shù)據(jù)存到dataset后,我們要把dataset的數(shù)據(jù)存入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 各種配置的全局定義
    //定義一個(gè)dataset 用于暫時(shí)存放excel中的數(shù)據(jù),后續(xù)要存入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();
    //數(shù)據(jù)庫登錄
    //注意Integrated Security不寫(false)表示必須要用pwd登錄,true表示不用密碼也能進(jìn)入數(shù)據(jù)庫
    public static string ConnStr = ConfigurationManager.AppSettings["ConnStr"].ToString();
    //用于記錄log的時(shí)候,機(jī)臺名字
    public static string machineName = "test";
    #endregion
    #region 定時(shí)器的初始化,及其事務(wù)
    //這個(gè)按鈕用于模擬服務(wù)(定時(shí)器)啟動(dòng)
    public void InitTimer()
    {
      //DFL的定時(shí)器 
      TimModel.Interval = 15 * 1000;
      //定時(shí)器的事務(wù)
      TimModel.Elapsed += new ElapsedEventHandler(ElapsedEventDFL);
      TimModel.Enabled = true;
      TimModel.AutoReset = true;
    }
    private void ElapsedEventDFL(object source, ElapsedEventArgs e)
    {
      
      if (GetFiles("test"))
      {
        //多次讀取數(shù)據(jù),存在多個(gè)文件時(shí)但其中某個(gè)文件在使用的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初始化設(shè)置
    Log4Application Log4App = new Log4Application();

    /*用于移動(dòng)源文件到指定文件夾,也就是備份源數(shù)據(jù)文件
    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";
      //讀取數(shù)據(jù)源文件的文件夾路徑(Working)
      string WorkingPath = WPath + equipName + " Equipment Temp. monitoring by third tool\\Working";
      //初始化system.IO的配置(路徑)
      DirectoryInfo directoryInfo = new DirectoryInfo(WorkingPath);
      //用文件流來獲取文件夾中所有文件,存放到
      FileInfo[] files = directoryInfo.GetFiles();
      //循環(huán)的把所有機(jī)臺數(shù)據(jù)備份到Achieve文件夾
      try
      {
        foreach (FileInfo file in files) // Directory.GetFiles(srcFolder)
        {
          //使用IO中的Moveto函數(shù)進(jìn)行移動(dòng)文件操作
          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 , 返回一個(gè)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 數(shù)據(jù)源,  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表示哪一個(gè)sheet,conn表示連接哪一個(gè)Excel文件(jet、ACE)
          OleDbDataAdapter dAdapter = new OleDbDataAdapter(strExcel, strConn);
          dAdapter.Fill(ds);
          OledbConn.Dispose();
          OledbConn.Close();

        }
        catch (Exception ex)
        {

        }
      }
      return flag;
    }

    // 將datatable中的數(shù)據(jù)存入SQL server
    public void DataToSql(string equipName)
    {
      //初始化配置 sqlserver的服務(wù)器名用戶等

      SqlConnection Conn = new SqlConnection(ConnStr);
      Conn.Open();

      //配置SQLBulkCopy方法,真正用于復(fù)制數(shù)據(jù)到數(shù)據(jù)庫的方法
      SqlBulkCopy bulkCopy = new SqlBulkCopy(ConnStr, SqlBulkCopyOptions.UseInternalTransaction)
      {
        DestinationTableName = "ModelTest_HD"
      };
      try
      {
        foreach (DataColumn item in ds.Tables[0].Columns)
        {
          //只復(fù)制所選的相關(guān)列
          bulkCopy.ColumnMappings.Add(item.ColumnName, item.ColumnName);
        }
        //開始復(fù)制到sql,每次在數(shù)據(jù)庫中添加
        bulkCopy.WriteToServer(ds.Tables[0]);
        bulkCopy.Close();
        //copy完了,要清空ds的內(nèi)容,不然會引起循環(huán)寫入上一個(gè)內(nèi)容
        ds.Tables.Clear();

      }
      catch (Exception ex)
      {

      }
      finally
      {
        //關(guān)閉數(shù)據(jù)庫通道
        Conn.Close();
      }
    }

    protected override void OnStart(string[] args)
    {
      //啟動(dòng)服務(wù)時(shí)做的事情

    }
    protected override void OnStop()
    {
      //停止服務(wù)時(shí)做的事情

    }
  }
}

認(rèn)真看注釋可以看出本程序的邏輯就是:

1、讀取到Excel數(shù)據(jù)

2、存Excel數(shù)據(jù)到SQL server

3、備份Excel文件到另一個(gè)文件夾

其中一些功能大家可以看一看,注釋也寫的很清楚。對于初學(xué)者 configurationmanager的內(nèi)容是在 app.config中設(shè)置的,這里直接去配置就行(類似html)

foreach (DataColumn item in ds.Tables[0].Columns)
{
//只復(fù)制所選的相關(guān)列
bulkCopy.ColumnMappings.Add(item.ColumnName, item.ColumnName);
}

注意這一段代碼,表示只復(fù)制數(shù)據(jù)庫與Excel表中  “列名”一致的數(shù)據(jù),如果不一致就不復(fù)制。(注意數(shù)據(jù)的格式,int還char 這些必須弄清楚)

然后bulkCopy.WriteToServer(ds.Tables[0])這里,就是把ds.tables的數(shù)據(jù)復(fù)制到SQLserver ,Tables[0]表示ds第一張表(其實(shí)我們也只有一張表,至于怎么在dataset中新建table自己可以查查資料)

最后的最后,注意釋放這些dataset,或者table。然后通道也記得close一下。

祝大家學(xué)習(xí)快樂。

以上就是C# 從Excel讀取數(shù)據(jù)向SQL server寫入的詳細(xì)內(nèi)容,更多關(guān)于c# 向SQL server寫入數(shù)據(jù)的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C#中實(shí)現(xiàn)插入、刪除Excel分頁符的方法

    C#中實(shí)現(xiàn)插入、刪除Excel分頁符的方法

    這篇文章主要給大家介紹了關(guān)于在C#中實(shí)現(xiàn)插入、刪除Excel分頁符的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-05-05
  • 改進(jìn)c# 代碼的五個(gè)技巧(二)

    改進(jìn)c# 代碼的五個(gè)技巧(二)

    這篇文章主要介紹了改進(jìn)c# 代碼的五個(gè)技巧(二),幫助大家更好的理解和使用c#,感興趣的朋友可以了解下
    2021-01-01
  • C++實(shí)現(xiàn)日期類的示例詳解

    C++實(shí)現(xiàn)日期類的示例詳解

    這篇文章主要為大家詳細(xì)介紹了四個(gè)C++常用的日期類的實(shí)現(xiàn),文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)C++有一定的幫助,需要的可以參考一下
    2023-02-02
  • C#獲取漢字字符串拼音首字母的方法

    C#獲取漢字字符串拼音首字母的方法

    這篇文章主要介紹了C#獲取漢字字符串拼音首字母的方法,實(shí)例分析了C#操作漢字及字符串的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-03-03
  • C#加密在實(shí)際中的應(yīng)用

    C#加密在實(shí)際中的應(yīng)用

    在系統(tǒng)的管理員有著實(shí)際的應(yīng)用,對于一個(gè)數(shù)據(jù)庫管理系統(tǒng)來說,數(shù)據(jù)庫安全還是挺重要的,所以在存入到數(shù)據(jù)庫的密碼通常都是加密的
    2012-11-11
  • 詳解C#面相對象編程中的繼承特性

    詳解C#面相對象編程中的繼承特性

    這篇文章主要介紹了C#面相對象編程中的繼承特性,是C#入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2016-01-01
  • WPF實(shí)現(xiàn)類似ChatGPT逐字打印效果的示例代碼

    WPF實(shí)現(xiàn)類似ChatGPT逐字打印效果的示例代碼

    前一段時(shí)間ChatGPT類的應(yīng)用十分火爆,這類應(yīng)用在回答用戶的問題時(shí)逐字打印輸出,像極了真人打字回復(fù)消息,本文就來利用WPF模擬一下這種逐字打印的效果吧
    2023-08-08
  • WPF通過使用C#代碼給控件賦值

    WPF通過使用C#代碼給控件賦值

    開發(fā)中偶爾會用到使用c#代碼給控件賦值,這里需要通過F12找到控件的賦值類型,然后在看控件可以使用那種方式賦值,花點(diǎn)時(shí)間研究一下,基本都可以通過c#代碼給控件賦值的,需要的朋友可以參考下
    2023-09-09
  • C# 讀取指定路徑配置文件的方法

    C# 讀取指定路徑配置文件的方法

    為了實(shí)現(xiàn)多個(gè)C#程序共用一個(gè)config文件,需要程序讀取指定路徑的config文件。代碼如下:
    2013-03-03
  • C# Invoke,begininvoke的用法詳解

    C# Invoke,begininvoke的用法詳解

    這篇文章主要介紹了C# Invoke,begininvoke的用法詳解,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下
    2021-01-01

最新評論

长海县| 浦城县| 怀柔区| 胶州市| 扎鲁特旗| 鄢陵县| 纳雍县| 中阳县| 延寿县| 天全县| 县级市| 叙永县| 资兴市| 阳信县| 漳浦县| 黄石市| 长汀县| 象山县| 鹰潭市| 顺昌县| 惠州市| 望奎县| 鄂温| 浮山县| 建水县| 德清县| 长白| 江安县| 江津市| 平度市| 宣武区| 三穗县| 鹿邑县| 清河县| 哈密市| 安徽省| 包头市| 南澳县| 建德市| 广平县| 桂东县|