为什么我得到DuplicateNameException?

时间:2014-10-07 11:02:42

标签: c# asp.net-mvc csv datacolumn

我目前正在为用户创建一个ASP.NET MVC应用程序,以便将其他用户从csv和excel上传到数据库。 在处理csv-uploader方法时,我遇到了一个问题,即TextFieldParser - csvReader只读取第一个列名,然后继续尝试将其添加到DataTable中的每一列,因此它给出了" System.Data.dll"中的DuplicateNameException。 我试图找到一个有助于解决这个问题的计数器,我也改变了分隔符类型,导致每个列停留在第一个DataTable列中,这意味着分隔符不是问题。 并且有一个断点,所以我可以看到colFields计数器设法找到csv文件中的所有列,尽管它只是尝试将第一个列添加到DataTable。

在搜索问题时,我遇到的唯一问题是当有故意的代码尝试反复实现相同的列时,但我不认为我有类似的东西。

该方法只是停止尝试添加下一列并尝试添加相同的第一列。 结果就是" 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

而且我对这个网站还是一个新手,虽然如果有什么我做错了已经有一个星期了。

1 个答案:

答案 0 :(得分: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
                    }
                }