2014-10-07 3 views
0

В настоящее время я создаю приложение ASP.NET MVC для пользователей, чтобы загружать других пользователей в базу данных csv и excel. И, работая над методом csv-uploader, я столкнулся с проблемой, когда TextFieldParser - csvReader только считывает имя первого столбца, а затем перебирается, чтобы попытаться добавить его в каждый столбец в DataTable, и, таким образом, он дает «DuplicateNameException в 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 'когда повторяющееся имя объекта базы данных встречаются во время операции добавления в наборе данных о связанных object' –

+0

Да, я знаю, что это значит, но не то, почему я получил его в этом случае? –

+0

@ E.A.O.S что содержит 'column'? Столбец –

ответ

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

 Смежные вопросы

  • Нет связанных вопросов^_^