asp.net 導入CSV 文件內容 到 SQL Server 數據庫 解決CSV內容數據重複添加問題

 說明:上傳控件沒有用ASP.NET自帶的FileUpload控件,用的第三方控件:Brettle.Web.NeatUpload.dll

步驟:

1.添加  Brettle.Web.NeatUpload.dll 引用

2.aspx:

 <form id="form1" runat="server" enctype="multipart/form-data">
    <div id="files" runat="server">
        <asp:FileUpload ID="FileUpload1" runat="server" /><br /><br />
        <Upload:InputFile ID="InputFile1" runat="server" />
         &nbsp;&nbsp;
        <asp:Button ID="btnImport" runat="server" Text="導入" onclick="btnImport_Click" />
   
    </div>
    </form>

3.CS:

protected void btnImport_Click(object sender, EventArgs e)
        {
            String connectionString = "server=localhost;uid=sa;pwd=123456;database=UpgradeDB";//連接數據庫

            string FileName = this.InputFile1.FileName;//獲取上傳文件的文件名,包括後綴

            string filepath = Request.PhysicalPath;
            filepath = filepath.Substring(0, filepath.LastIndexOf('\\'));
            filepath = filepath + "\\up_file\\";
            string SaveFileName = System.IO.Path.Combine(filepath, FileName);//合併兩個路徑爲上傳到服務器上的全路徑

            InputFile1.MoveTo(SaveFileName, Brettle.Web.NeatUpload.MoveToOptions.Overwrite);//先將需要導入的文件上傳到服務器的某個文件夾中,因爲如果要直接讀取客戶端的路徑比較困難,我是上傳到項目的up_file文件夾裏


            DataTable dt = ReadCsvFileToTable(true, ',', SaveFileName);//調用方法
            
            if (dt.Rows.Count > 0)
            {
                this.files.InnerHtml = "";
                int sta = 0;
                for (int i = 0; i < dt.Rows.Count; i++)//循環獲取CSV文件的內容
                {
                    string date = Convert.ToDateTime(dt.Rows[i][5].ToString()).ToString("yyyy-MM-dd");
                    string lastdate = Convert.ToDateTime(dt.Rows[i][6].ToString()).ToString("yyyy-MM-dd");
                    string state = dt.Rows[i][4].ToString();

                    if (state.Equals("已燒錄"))//這個是我的項目需要,文件中爲字符串,數據庫裏是一個int類型的狀態值,所以我需要轉換一下
                    {
                        sta = 2;
                    }
                    else {
                        sta = 1;
                    }

                    string emac = dt.Rows[i][3].ToString();
                    string sql = "";
                    if (!string.IsNullOrEmpty(emac))//無線MAC不爲空(如果你需要判斷這個字段,但是值又是可以爲空的話,就有必要判斷一下了,因爲如果數據只要超過1條並且這個字段的內容爲空的話,數據庫是不會再添加進去的)
                    {

//此SQL語句就是解決重複添加數據的問題,詳情見:http://blog.csdn.net/yxy353245805/article/details/7751796
                        sql = "if  not exists(select * from ProductInfo where checksum(SN)=checksum('" + dt.Rows[i][1].ToString() + "'))"
                                  + "if  not exists(select * from ProductInfo where checksum(MAC)=checksum('" + dt.Rows[i][2].ToString() + "'))"
                                  + "if  not exists(select * from ProductInfo where checksum(EMAC)=checksum('" + dt.Rows[i][3].ToString() + "'))"
                                  + "insert into ProductInfo(WorkNo,SN,MAC,EMAC,time,lastupdatetime,state) "
                                  + "values('" + dt.Rows[i][0].ToString() + "','" + dt.Rows[i][1].ToString() + "','" + dt.Rows[i][2].ToString() + "','"
                                  + dt.Rows[i][3].ToString() + "','" + date + "','" + lastdate + "'," + sta + ")";
                    }
                    else {
                        sql = "if  not exists(select * from ProductInfo where checksum(SN)=checksum('" + dt.Rows[i][1].ToString() + "'))"
                                      + "if  not exists(select * from ProductInfo where checksum(MAC)=checksum('" + dt.Rows[i][2].ToString() + "'))"
                                      //+ "if  not exists(select * from ProductInfo where checksum(EMAC)=checksum('" + dt.Rows[i][3].ToString() + "'))"
                                      + "insert into ProductInfo(WorkNo,SN,MAC,EMAC,time,lastupdatetime,state) "
                                      + "values('" + dt.Rows[i][0].ToString() + "','" + dt.Rows[i][1].ToString() + "','" + dt.Rows[i][2].ToString() + "','"
                                      + dt.Rows[i][3].ToString() + "','" + date + "','" + lastdate + "'," + sta + ")";
                    }
                    SqlConnection conn = new SqlConnection(connectionString);
                    conn.Open();
                    SqlCommand command = new SqlCommand(sql, conn);

                    //command.ExecuteScalar();
                    command.ExecuteNonQuery();
                    conn.Close();
                }
            }
        }

    

        /// <summary>
        /// 導入CSV文件方法
        /// </summary>
        /// <param name="HeadYes">是否有標題</param>
        /// <param name="span">分隔符</param>
        /// <param name="path"></param>
        /// <param name="fileName"></param>
        /// <returns></returns>
        public DataTable ReadCsvFileToTable(bool HeadYes, char span, string path)
        {
            //文件路徑和文件名
            string files = path;
            DataTable dt = new DataTable();
            StreamReader fileReader = new StreamReader(files, Encoding.Default);
            try
            {
                //是否爲第一行(如果HeadYes爲TRUE,則第一行爲標題行)
                int lsi = 0;
                //列之間的分隔符
                char cv = span;
                while (fileReader.EndOfStream == false)
                {
                    string line = fileReader.ReadLine();
                    string[] y = line.Split(cv);
                    //第一行爲標題行
                    if (HeadYes == true)
                    {
                        //第一行
                        if (lsi == 0)
                        {
                            for (int i = 0; i < y.Length; i++)
                            {
                                dt.Columns.Add(y[i].Trim().ToString());
                            }
                            lsi++;
                        }
                        //從第二列開始爲數據列
                        else
                        {
                            DataRow dr = dt.NewRow();
                            for (int i = 0; i < y.Length; i++)
                            {
                                dr[i] = y[i].Trim();
                            }
                            dt.Rows.Add(dr);
                        }
                    }
                    //第一行不爲標題行
                    else
                    {
                        if (lsi == 0)
                        {
                            for (int i = 0; i < y.Length; i++)
                            {
                                dt.Columns.Add(i.ToString());
                            }
                            lsi++;
                        }
                        DataRow dr = dt.NewRow();
                        for (int i = 0; i < y.Length; i++)
                        {
                            dr[i] = y[i].Trim();
                        }
                        dt.Rows.Add(dr);
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                fileReader.Close();
                fileReader.Dispose();
            }
            return dt;

        }

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章