# 2019/0620/MVC補充C#MS SQL匯入CSV+上傳CSV存入MS SQL

\#MVC收尾 CSV 匯入匯出




CSV 讀檔 到資料庫或畫面



批次新增



讀進去 讀出來&#x20;





單純的 CSV 連插件都不用，讀檔方式都是，逗點相隔





BIG5 不會有字碼問題&#x20;



UNCODE 有字碼問題





### ##匯出sql資料寫入 excel&#xD;







首先SQL Server 連接



設計模式去用精靈設定Sqldatasourse 或自己寫



接著去加入控制器DefaultController.cs



其實很簡單 就是讀到一個dataset 檔案 io 物件 讀寫 stream reader writer



用 ADO.NET 比較簡單&#x20;



Using



System.Data.SqlClient



System.Configuration;



System.IO

有架構的寫法



SqlConnection



ConfigurationManager



SqlDataAdapter&#x20;



DataSet



利用這幾個物件



SqlDataAdapter 資料查詢完後 Fill 填進 dataset



利用 DataTable 建立資料表物件



利用 streamWriter 物件寫入



建立一個資料夾放輸出的檔案 fileoutput



實體與邏輯路徑轉換 server.mappath



Append 覆蓋或不覆蓋 true false



Encoding.default 抓預設字符編碼



宣告一個字串預備使用





不知道有幾筆資料

所以用 foreach()



Datacolumn 讀欄位



Column 欄位



Datarow 一筆資料就是一個 datarow



Row 資料















讀完之後要寫入datatable 所以



矩陣 欄位 與 資料 所以要用 雙迴圈





Trim() 去掉頭尾空白



加 \n 然後要把資料寫進去 打開 write() 物件



用完要關掉 dispose







接著 新增 view 執行測試 執行完後 檢視資料夾 確實有一個 csv 檔案叫 output







邏輯很簡單其實只是複雜







### ##上傳excel檔案然後匯入資料庫&#xD;



批次新增資料時使用，且不是由開發維護人員放入，

而是開發一個介面由員工來用













如果要cobe 學生資料表 關聯都必須要一樣

Select \* into 學生2 from 學生  ( 這個必須要沒有學生2這個表

![](https://1902678905-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVJQfuBXyvHwCd1Nadk%2F-LiC5s4Lh0oKPAv5IHNw%2F-LiCHG623TUl_HEW6SSH%2Fimage.png?alt=media\&token=1749accd-946a-4124-9afd-456a9412f902)

如我要從一個存在的資料表塞資料

insert into ( 不要寫value 要用 select的









Cobe後的只差在沒指定pk



然後把資料刪除 接著要做



上傳get post action&#x20;



檔案當成參數 傳進來 所以用 httppostedfilebase 物件型態





做判斷 不能為空值 不然報錯



Ie chrome  path 抓值方式不同 ( 附檔名差異





所以要再多一個 if 判斷 且報錯或 修正 ie 問題



接著一樣 操作 sqldatadapter

然後fill丟資料到 dataset



接著利用 streamreader 物件去編碼讀檔



利用方法Readline方法&#x20;



第一行是欄位所以要記得避過



接著做一個 string陣列預備使用



接著用迴圈把 欄位 值 讀出來 因為每筆只有一行 所以用endstream控制次數



用逗點為依據split方法分割字串



接著把切個出來的字串 餵入 datarow



因為不知道幾欄所以用 for



最尾端不能有逗點 不然會多一筆空字串值 所以 這邊環圈的最大值要注意





幾筆資料 幾欄



然後加到 datatable 裡面去





### ##那如何寫回資料庫呢?&#xD;



利用 datacommandbuilder 物件



讀dataset update 即可  ( 如果忘記就在去查察都有講過





接著新增 view



必須要搞定上傳介面 且 一定要放在form 標籤內 因為不是純 get url 傳值



因為要上傳資料 enctype 藥用 multipart/form-data





Action 要打url.action(@upload) 才知道訪問目標&#x20;





Dataset 可以用放大鏡看

![](https://1902678905-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVJQfuBXyvHwCd1Nadk%2F-LiC5s4Lh0oKPAv5IHNw%2F-LiCBGvBmSDXVaGkkq-L%2Fimage.png?alt=media\&token=951b31a0-446f-4ef2-9bd2-9f723c74aff2)

偵錯 視覺化顯示 !?  ( 要回放影片檢視 不小心走神了

{% embed url="https://dotblogs.com.tw/dotjum/2010/04/17/14656" %}



日期沒做隱含轉換必須要再做處理



所以我們要先抓最後一串進行轉形態



但這樣就會比較不活



所以讀檔相對麻煩



如果資料庫是 null 的話 讀到excell就會是空字串

所以要再多一個判斷不能等於空”” &#x20;





以上 inport 與 outport



#### &#xD;###Controllers/DefaultController.cs

```
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using System.IO;


namespace File_Import_Outport.Controllers
{
    public class DefaultController : Controller
    {
        SqlConnection Conn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString);
        SqlDataAdapter da;
        DataSet ds;

        // GET: Default
        public ActionResult Index()
        {
            da = new SqlDataAdapter("select * from 學生",Conn);
            ds = new DataSet();
            da.Fill(ds);
            DataTable dt = new DataTable();
            dt = ds.Tables[0];

            StreamWriter wr = new StreamWriter(Server.MapPath("~\\FileOutput\\output.csv"),false,System.Text.Encoding.Default);
            string data = "";
            foreach (DataColumn colume in dt.Columns)
            {
                data += colume.ColumnName + ",";
            }
            data += "\n";
            wr.Write(data);
            data = "";

            foreach (DataRow row in dt.Rows)
            {
                foreach (DataColumn colume in dt.Columns)
                {
                    data += row[colume].ToString().Trim() + ",";
                }
                data += "\n";
                wr.Write(data);
                data = "";

            }

            wr.Dispose();
            wr.Close();

            return View();
        }


        public ActionResult UpLoad()
        {
            return View();
        }
        [HttpPost]
        public ActionResult UpLoad(HttpPostedFileBase upfile)
        {
            if(upfile!=null)
            {
                if(Path.GetExtension(upfile.FileName)==".csv")
                {
                    da = new SqlDataAdapter("select * from 學生2", Conn);
                    ds = new DataSet();
                    da.Fill(ds);

                    StreamReader sr = new StreamReader(upfile.InputStream,System.Text.Encoding.Default);

                    sr.ReadLine();
                    string data = "";
                    string[] arrData;
                    while (!sr.EndOfStream)
                    {
                        data=sr.ReadLine();
                        arrData = data.Split(',');
                        DataRow dr = ds.Tables[0].NewRow();
                        int k = ds.Tables[0].Columns.Count;
                        for (int i=0;i<k;i++)
                        {
                            if(i==(k-1))
                            {
                                if(arrData[i]!="")
                                 dr[ds.Tables[0].Columns[i]]= Convert.ToDateTime(arrData[i]);

                            }
                            else
                                dr[ds.Tables[0].Columns[i]] = arrData[i];

                        }
                        ds.Tables[0].Rows.Add(dr);
                    }

                    SqlCommandBuilder sc = new SqlCommandBuilder(da);
                    da.Update(ds);

                   
                }
            }



            return View();
        }

    }
}
```

#### ###Views/Default/Index.cshtml

```
@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>
```

#### ###Views/Default/UpLoad.cshtml

```
@{
    ViewBag.Title = "UpLoad";
}

<h2>UpLoad</h2>

<form action="@Url.Action("UpLoad")" method="post" enctype="multipart/form-data">
    <input id="File1" name="upfile" type="file" />
    <input id="Submit1" type="submit" value="submit" />
</form>
```

