所以在上次参考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作为主键,因此抛出了这个错误。
...帮助
答案 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);很多时候错误。