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

#MVC收尾 CSV 匯入匯出

CSV 讀檔 到資料庫或畫面

批次新增

讀進去 讀出來

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

BIG5 不會有字碼問題

UNCODE 有字碼問題

##匯出sql資料寫入 excel

首先SQL Server 連接

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

接著去加入控制器DefaultController.cs

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

用 ADO.NET 比較簡單

Using

System.Data.SqlClient

System.Configuration;

System.IO

有架構的寫法

SqlConnection

ConfigurationManager

SqlDataAdapter

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檔案然後匯入資料庫

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

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

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

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

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

insert into ( 不要寫value 要用 select的

Cobe後的只差在沒指定pk

然後把資料刪除 接著要做

上傳get post action

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

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

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

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

接著一樣 操作 sqldatadapter

然後fill丟資料到 dataset

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

利用方法Readline方法

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

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

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

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

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

因為不知道幾欄所以用 for

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

幾筆資料 幾欄

然後加到 datatable 裡面去

##那如何寫回資料庫呢?

利用 datacommandbuilder 物件

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

接著新增 view

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

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

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

Dataset 可以用放大鏡看

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

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

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

但這樣就會比較不活

所以讀檔相對麻煩

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

所以要再多一個判斷不能等於空””

以上 inport 與 outport

###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>

Last updated