2012-02-23 53 views
2

我有多個foreach遍歷對此我取的工作經歷,從Facebook用戶的教育歷史和插入到這些數據庫:問題環路

Result soap = serializer.Deserialize<Result>(ser); 
foreach (var item in soap.data) 
{ 
    int length = item.education_history.Length; 
    int lenght2 = item.work_history.Length; 

    foreach (var edu in item.education_history) 
    { 
     length--; 
     ftr = ftr + "," + edu.name.ToString(); 
    } 

    foreach (var wrk in item.work_history) 
    { 
     lenght2--; 
     ftr1 = ftr1 + "," + wrk.company_name.ToString(); 
    } 

    string str1 = "Insert into [Snaps] (Loc_city,Loc_state,Loc_country,Edu_Hist1,Work_Hist1) values ('" + item.current_location.city.ToString() + "','" + item.current_location.state.ToString() + "','" + item.current_location.country.ToString() + "','" + ftr + "','" + ftr1 + "')"; 
    SqlCommand cmd1 = new SqlCommand(str1, con); 
    cmd1.ExecuteNonQuery(); 
} 

PS:此代碼只是爲了測試目的因此不使用參數化SQL查詢

我我遇到的問題是,當我計算的ftr和父foreach循環的第一個項目的ftr1

foreach (var item in soap.data) 

當我將這些值插入到數據庫中時,它會追加item中的第二個數組索引並將其保存在數據庫中。此外值ftrftr1沒有得到刷新它追加新的值與以前的那些

我在這裏做錯了什麼?

感謝

回答

4

的問題是,ftrftr1 v在主循環的每次迭代之後,易變的是未被重置,因此值保持與它們連接。

一個解決方案是在主循環的結束同時設置ftrftr1null或空字符串:

foreach (var item in soap.data) 
{ 
    foreach (var edu in item.education_history) 
    { 
     // ... 
    } 

    foreach (var wrk in item.work_history) 
    { 
     // ... 
    } 

    // ... 

    ftr = null; 
    ftr1 = null; 
} 

然而,更簡單的方法將是使用Enumerable.Select方法在LINQ提取值從education_historywork_history數組列表,並使用String.Join將它們連接成兩個字符串:

foreach (var item in soap.data) 
{ 
    var educationNames = item.education_history.Select(i => i.name.ToString()); 
    var ftr = String.Join(",", educationNames); 

    var previousCompaniesNames = item.work_history.Select(i => i.company_name.ToString()); 
    var ftr1 = String.Join(",", previousCompaniesNames); 

    var statement = "INSERT INTO [Snaps] (Loc_city,Loc_state,Loc_country,Edu_Hist1,Work_Hist1) VALUES (@city, @state, @country, @educationNames, @previousCompaniesNames)"; 
    var command = new SqlCommand(statement, con); 
    command.Parameters.Add("@city", SqlDbType.VarChar, 255).Value = item.current_location.city.ToString(); 
    command.Parameters.Add("@state", SqlDbType.VarChar, 255).Value = item.current_location.state.ToString(); 
    command.Parameters.Add("@country", SqlDbType.VarChar, 255).Value = item.current_location.country.ToString(); 
    command.Parameters.Add("@educationNames", SqlDbType.VarChar, 4000).Value = ftr 
    command.Parameters.Add("@previousCompaniesNames", SqlDbType.VarChar, 4000).Value = ftr1 
    command.ExecuteNonQuery();  
} 

這樣ftrftr1變量是在每次迭代處聲明的,因此不需要手動重置它們的值。

+0

它仍然不能正常工作:/ – vini 2012-02-23 12:43:12

+0

@vini您實施了哪種解決方案? – 2012-02-23 12:56:12

+0

第二個記錄被多次插入 – vini 2012-02-23 13:00:00

0

FTR和FTR1沒有得到刷新其追加與 前幾次

新的價值觀是你不刷新它,如果你要使用的每一個新的值迭代然後用

ftr = ""; 
ftr1 = ""; 
+0

將這些行放在第一個循環的開頭。 – 2012-02-23 09:57:57