无法在对象'dbo.Zoopla'中插入重复键。重复键值为(35268380)

时间:2015-09-09 09:17:06

标签: asp.net sql-server csv

所以在上次参考CSV导入回答我的问题之后,我注意到因为我的地址数据包含逗号,所以它影响了每行的列数。我已经解决了这个问题,但是对于csv中的一个条目,它似乎认为存在重复的ID?代码如下:

protected void Upload(object sender, EventArgs e)
    {
        //Upload and save the file
        string csvPath = Server.MapPath("~/Files/") + Path.GetFileName(FileUpload1.PostedFile.FileName);
        FileUpload1.SaveAs(csvPath);

        DataTable dt = new DataTable();
        dt.Columns.AddRange(new DataColumn[13] { new DataColumn("ID", typeof(int)),
        new DataColumn("ZooplaURL", typeof(string)),
        new DataColumn("Branch",typeof(string)),
        new DataColumn("HouseNumber",typeof(string)),
        new DataColumn("PropAddress",typeof(string)),
        new DataColumn("Town",typeof(string)),
        new DataColumn("County",typeof(string)),
        new DataColumn("Postcode",typeof(string)),
        new DataColumn("Price",typeof(string)),
        new DataColumn("PropType",typeof(string)),
        new DataColumn("Beds",typeof(string)),
        new DataColumn("PropStatus",typeof(string)),
        new DataColumn("Weeks",typeof(string))  });

        string csvData = File.ReadAllText(csvPath);
        foreach (string row in csvData.Split('\r'))
        {
            if (!string.IsNullOrEmpty(row))
            {
                dt.Rows.Add();
                int i = 0;

                foreach (string cell in row.Split(','))
                {
                    dt.Rows[dt.Rows.Count - 1][i] = cell;
                    i++;
                }
            }


            string consString = ConfigurationManager.ConnectionStrings["TortoiseDBConnectionString"].ConnectionString;
            using (SqlConnection con = new SqlConnection(consString))
            {
                using (SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(con))
                {
                    //Set the database table name
                    sqlBulkCopy.DestinationTableName = "dbo.Zoopla";
                    con.Open();
                    sqlBulkCopy.WriteToServer(dt);
                    con.Close();
                }
            }
        }
    }

我的CSV显示如下:

35268380,www.zoopla.com,Fine Country Stamford,12,Bullock Road,Peterborough,,PE7 3TT,1350000,Detached,4,For Sale,37

33333333,www.zoopla.com,Tortoise,7,Tabor Court,Peterborough,,PE7 8GF,180000,Detached,4,For Sale,13

第一个条目出现问题,尝试提交两次第一个条目的ID,因此我将这个ID作为主键,因此抛出了这个错误。

...帮助

1 个答案:

答案 0 :(得分:2)

你的foreach循环不正确所以它试图再次插入相同的数据,第一个foreach循环应该关闭为

 foreach (string row in csvData.Split('\r'))
    {
        if (!string.IsNullOrEmpty(row))
        {
            dt.Rows.Add();
            int i = 0;

            foreach (string cell in row.Split(','))
            {
                dt.Rows[dt.Rows.Count - 1][i] = cell;
                i++;
            }
        }
  }//loop should be closed here 

        string consString = ConfigurationManager.ConnectionStrings["TortoiseDBConnectionString"].ConnectionString;
        using (SqlConnection con = new SqlConnection(consString))
        {
            using (SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(con))
            {
                //Set the database table name
                sqlBulkCopy.DestinationTableName = "dbo.Zoopla";
                con.Open();
                sqlBulkCopy.WriteToServer(dt);
                con.Close();

            }
        }
    }

那是在你的连接字符串初始化之前。因为它不正确它执行sqlBulkCopy.WriteToServer(dt);很多时候错误。