2014-10-07 140 views
0

我目前正在製作ASP.NET MVC應用程序,供用戶將其他用戶從csv和excel上傳到數據庫。 在處理csv-uploader方法時,我遇到了一個問題:TextFieldParser - csvReader只讀取第一個列名,然後繼續嘗試將它添加到DataTable中的每一列,因此它給出了「DuplicateNameException in System.Data.dll中」。 而且我試圖找到一個計數器來幫助解決這個問題,而且我還更改了分隔符類型,導致每列停留在第一個DataTable列中,這意味着分隔符不是問題。 並且有一個斷點,所以我可以看到colFields計數器管理查找csv文件中的所有列,儘管它只嘗試將第一個列添加到DataTable。爲什麼我得到一個DuplicateNameException?

當我搜索這個問題時,唯一遇到的問題是當有故意的代碼嘗試和反覆實施同一列時,但我不認爲我有這樣的事情。

該方法只是停止嘗試添加下一列,並嘗試添加相同的第一個來代替。 因此有「DuplicateNameException」, 任何人都可以看到這是爲什麼?

這裏是我的代碼,並將其放置在一個控制器:

[HttpPost] 
     public ActionResult Import(HttpPostedFileBase file) 
     { 

      DataTable csvData = new DataTable(); 
      if (file != null && file.ContentLength > 0) 
      { 

       try 
       { 
        using (TextFieldParser csvReader = new TextFieldParser(file.InputStream)) 
        { 

         //TODO:Skapa en lista eller liknande för delimiter val om möjligt. 
         csvReader.SetDelimiters(new string[] { ";" }); 
         csvReader.HasFieldsEnclosedInQuotes = false; 
         string[] colFields = csvReader.ReadFields(); 
         foreach (string column in colFields) 
         { 
          //TODO:Nuvarande error: DuplicateNameException, den lägger Author title på två olika kolumner och ger exception när detta upptäcks. 

          DataColumn Titel = new DataColumn(column); 
          Titel.AllowDBNull = true; 
          csvData.Columns.Add(Titel); 

          DataColumn FirstName = new DataColumn(column); 
          FirstName.AllowDBNull = true; 
          csvData.Columns.Add(FirstName); 

          DataColumn LastName = new DataColumn(column); 
          LastName.AllowDBNull = true; 
          csvData.Columns.Add(LastName); 

          DataColumn AbstrNum = new DataColumn(column); 
          AbstrNum.AllowDBNull = true; 
          csvData.Columns.Add(AbstrNum); 

          DataColumn PosterTitel = new DataColumn(column); 
          PosterTitel.AllowDBNull = true; 
          csvData.Columns.Add(PosterTitel); 

          DataColumn Workshop = new DataColumn(column); 
          Workshop.AllowDBNull = true; 
          csvData.Columns.Add(Workshop); 

          DataColumn Keywords = new DataColumn(column); 
          Keywords.AllowDBNull = true; 
          csvData.Columns.Add(Keywords); 

          DataColumn Institution = new DataColumn(column); 
          Institution.AllowDBNull = true; 
          csvData.Columns.Add(Institution); 

          DataColumn CollabEmail = new DataColumn(column); 
          CollabEmail.AllowDBNull = true; 
          csvData.Columns.Add(CollabEmail); 
         } 
         while (!csvReader.EndOfData) 
         { 
          string[] fieldData = csvReader.ReadFields(); 
          //Making empty value as null 
          for (int i = 0; i < fieldData.Length; i++) 
          { 
           if (fieldData[i] == "") 
           { 
            fieldData[i] = null; 
           } 
          } 
          csvData.Rows.Add(fieldData); 
         } 
        } 
        //Fortfarande i try... 

        SqlConnectionStringBuilder cb = new SqlConnectionStringBuilder(); 
        cb.DataSource="HELMER/SQLEXPRESS"; 
        cb.InitialCatalog="TestDB"; 
        cb.IntegratedSecurity=true; 
        SqlConnection cnn = new SqlConnection(cb.ConnectionString); 

        SqlCommand cmd = new SqlCommand("SELECT * FROM csvData", cnn); 
        cnn.Open(); 
        SqlDataReader rdr=cmd.ExecuteReader(); 

        SqlBulkCopy sbc= new SqlBulkCopy("server=.;database=TestDB;" + "Integrated Security=SSPI"); 
        sbc.DestinationTableName = "Users"; 
        sbc.WriteToServer(rdr); 

        sbc.Close(); 
        rdr.Close(); 
        cnn.Close(); 
       } 
       catch (Exception ex) 
       { 

       } 
      } 
      return RedirectToAction("Index", "Home", new { Message = "The Import was a success" }); 
     } 

我已經採取了一些源材料從該網站:

http://www.morgantechspace.com/2013/10/import-csv-file-into-sql-server-using.html

而且還我仍然很新的這個網站,雖然它已經有一週了,如果有什麼我做錯了。

+0

從MSDN'當DataSet中的添加操作過程中遇到重複的數據庫對象名稱 - 相關object' – 2014-10-07 11:06:51

+0

是的,我知道這意味着什麼,而不是我爲什麼在這種情況下,明白了嗎? – 2014-10-07 11:08:22

+0

@ E.A.O.S'column'包含什麼? – 2014-10-07 11:14:33

回答

1

試試這個:

foreach (string column in colFields) 
       { 
        DataColumn datecolumn = new DataColumn(column); 
        datecolumn.AllowDBNull = true; 
        csvData.Columns.Add(datecolumn); 
       } 

一旦你創建從colFields列,您可以添加行到創建的列。

while (!csvReader.EndOfData) 
        { 
         string[] fieldData = csvReader.ReadFields(); 
         //Making empty value as null 
         for (int i = 0; i < fieldData.Length; i++) 
         { 
          if (fieldData[i] == "") 
          { 
           fieldData[i] = null; 
          } 
         } 
         csvData.Rows.Add(fieldData); // Here rows are added to the created columns 
        } 
       } 
相關問題