2013-07-02 3 views
1

LinkedIn에서 데이터를 가져와 데이터베이스에 저장하려고합니다.C#에서 foreach를 사용하는 방법?

은 내가 데이터를 삽입하고있어

1.In 첫 번째 foreach는 반복에 몇 가지 문제를했습니다.

2. (user_id)를 두 번째 삽입 문에 전달합니다.

3.Once 두 번째 foreach는 내가 처음 foreach는

가이 코드

public void customerM() 
    { 
     XmlDocument d = new XmlDocument(); 
     d.LoadXml(content); 
     XmlNodeList customer = d.SelectNodes("//posts/post/creator"); 
     foreach (XmlNode cus in customer) 
     { 
      user_id = cus["id"].InnerText; 
      customerFirst_name = cus["first-name"].InnerText; 
      customerLast_name = cus["last-name"].InnerText; 
      customerName = string.Format("{0} {1}", customerFirst_name, customerLast_name); 
      DbConnection.Open(); 
      DbCommand = new OleDbCommand("select count(*) from mw_customer where customer_id='" + user_id + "'", DbConnection); 
      OleDbDataReader DbReader = DbCommand.ExecuteReader(); 
      while (DbReader.Read()) 
      { 
       count = DbReader[0].ToString(); 
       cnt = Convert.ToInt32(count); 
       if (cnt == 0) 
       { 
        DbCommand = new OleDbCommand("insert into mw_customer(customer_id,name,first_name,last_name,user_id,cust_date,community) values('" + user_id + "','" + customerName + "','" + customerFirst_name + "','" + customerLast_name + "','" + user_id + "','" + post_timestamp + "','LinkedIn')", DbConnection); 
        DbCommand.ExecuteNonQuery(); 
       } 
       else 
       { 
        DbCommand = new OleDbCommand("UPDATE mw_customer set name='" + customerName + "',first_name='" + customerFirst_name + "',last_name='" + customerLast_name + "',user_id='" + user_id + "',community = 'LinkedIn',cust_date='" + post_timestamp + "' where customer_id = '" + user_id + "'", DbConnection); 
        DbCommand.ExecuteNonQuery(); 
       } 
      } 
      DbReader.Close(); 

      XmlNodeList title = d.SelectNodes("//posts/post"); 

      foreach (XmlNode post in title) 
      { 
       posts = post["title"].InnerText; 
       post_id = post["id"].InnerText; 
       string postTimeStamp = post["creation-timestamp"].InnerText; 
       double postTimeStamp1 = Convert.ToDouble(postTimeStamp); 
       DateTime post_timestamp1 = new DateTime(1970, 1, 1, 0, 0, 0, 0).AddSeconds(Math.Round(postTimeStamp1/1000d)).ToLocalTime(); 
       post_timestamp = post_timestamp1.ToString("dd-MMM-yy"); 

       DbCommand = new OleDbCommand("select count(*) from mw_post where post_id = '" + post_id + "'", DbConnection); 
       OleDbDataReader DbReader1 = DbCommand.ExecuteReader(); 
       while (DbReader1.Read()) 
       { 
        count = DbReader1[0].ToString(); 
        cnt = Convert.ToInt32(count); 
        if ((cnt == 0) && (posts != "")) 
        { 
         DbCommand = new OleDbCommand("insert into mw_post(post_id,customer_id,post,post_date,community) values('" + post_id + "','" + user_id + "','" + posts + "', '" + post_timestamp + "','LinkedIn')", DbConnection); 
         DbCommand.ExecuteNonQuery(); 

         if (posts.ToUpper().Contains("Personal Loan".ToUpper())) 
         { 
          DbCommand = new OleDbCommand("UPDATE mw_post set prod_id = '2',customer_id='" + user_id + "' where post = '" + posts + "'", DbConnection); 
          DbCommand.ExecuteNonQuery(); 
         } 
         else if (posts.ToUpper().Contains("Credit Card".ToUpper())) 
         { 
          DbCommand = new OleDbCommand("UPDATE mw_post set prod_id = '1',customer_id='" + user_id + "' where post = '" + posts + "'", DbConnection); 
          DbCommand.ExecuteNonQuery(); 
         } 
         else if (posts.ToUpper().Contains("Home Loan".ToUpper())) 
         { 
          DbCommand = new OleDbCommand("UPDATE mw_post set prod_id = '3',customer_id='" + user_id + "' where post = '" + posts + "'", DbConnection); 
          DbCommand.ExecuteNonQuery(); 
         } 
         else if (posts.ToUpper().Contains("Car Loan".ToUpper())) 
         { 
          DbCommand = new OleDbCommand("UPDATE mw_post set prod_id = '4',customer_id='" + user_id + "' where post = '" + posts + "'", DbConnection); 
          DbCommand.ExecuteNonQuery(); 
         } 
         else if (posts.ToUpper().Contains("Deposit".ToUpper())) 
         { 
          DbCommand = new OleDbCommand("UPDATE mw_post set prod_id = '5',customer_id='" + user_id + "' where post = '" + posts + "'", DbConnection); 
          DbCommand.ExecuteNonQuery(); 
         } 
         else if (posts.ToUpper().Contains("Debit Card".ToUpper())) 
         { 
          DbCommand = new OleDbCommand("UPDATE mw_post set prod_id = '7',customer_id='" + user_id + "' where post = '" + posts + "'", DbConnection); 
          DbCommand.ExecuteNonQuery(); 
         } 
         else 
         { 
          DbCommand = new OleDbCommand("UPDATE mw_post set prod_id = '6',customer_id='" + user_id + "' where post = '" + posts + "'", DbConnection); 
          DbCommand.ExecuteNonQuery(); 
         } 
        } 
       } 
       DbReader1.Close(); 
       DbConnection.Close(); 
      } 
     } 
    } 

XML 파일

<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n 
    <posts total=\"1\">\n <post>\n  
    <creation-timestamp> 
    1362659632000 
    </creation-timestamp>\n 
    <id> 
     g-4891367-S-dfdsfd 
    </id>\n  
    <title> 
    dfsdfsdf 
    </title>\n  
    <creator>\n 
    <id> 
     dfdsfsdf 
    </id>\n  
    <first-name> 
    dfsdfsd 
    </first-name>\n  
     <last-name> 
      dsfsdfd 
    </last-name>\n  
    <picture-url> 
     http://m3.licdn.com/mpr/mprx/0_zR-    8Kkl9rtYlGl1YcyCPK6tMrqDrGlCYBM60KFPQftdfsdfsdOJSfTn_tq4rYx8Svbl9K 
    </picture-url>\n  
    <headline> 
      dfsdfsd 
    </headline>\n  
    </creator>\n 
    <comments total=\"1\">\n 
    <comment>\n 
    <creation-timestamp> 
     1372061224000 
    </creation-timestamp>\n 
    <id> 
     g-4891367-S-dsfsdfsd 
    </id>\n   
    <text> 
     dfsdfsd. 
    </text>\n   
    <creator>\n   
    <id> 
     C-dfsdfsd 
    </id>\n   
    <first-name> 
     dfsdfsd 
    </first-name>\n 
    <last-name> 
     dfsdfsd 
    </last-name>\n   
    <headline> 
     dsfsdsd 
    </headline>\n 
    <picture-url> 
       http://m3.licdn.com/mpr/mprx/0_OSEuUB4ZdfsdfUzsFvCLad5Y2yfY1Uqo4EXAO93Wutws8zNY9U75AECxh0metNPq6zdHm 
    </picture-url>\n   
    </creator>\n   
    <creation-timestamp> 
     1372061224895 
    </creation-timestamp>\n   
    <relation-to-viewer>\n   
    <available-actions total=\"1\">\n 
     <action>\n 
     <code>delete</code>\n   
     </action>\n   
    </available-actions>\n  
    </relation-to-viewer>\n  
    </comment>\n  
    </comments>\n 
    <likes total=\"2\">\n  
    <like>\n  
    <person>\n   
     <id> 
     dfsfwe 
     </id>\n   
    <first-name> 
     dfsdfsd 
    </first-name>\n   
    <last-name> 
     dfsd 
     </last-name>\n  
     <headline> 
    dfsdf 
     </headline>\n   
     <picture-url> 
    http://m3.licdn.com/mpr/mprx/0dfsdfsdda7-q79MqA-X55lrEa7- tssMzKfRilTfaJfyrYdcvX3oeLmPSf_AzuRntGlAaCl 
     </picture-url>\n 
    </person>\n 
    </like>\n <like>\n   
     <person>\n   
     <id> 
     S4Er-sdjfjd 
    </id>\n   
    <first-name> 
     fdsfs 
    </first-name>\n   
     <last-name> 
     dfsdd 
     </last-name>\n   
    <headline> 
    sdfsdfsdfds 
    </headline>\n   
<picture-url> 
     http://m3.licdn.com/mpr/mprx/0_kdfsdfdsfsdo 
</picture-url>\n  
     </person>\n 
     </like>\n </likes>\n  
     <relation-to-viewer>\n 
     <is-following>true</is-following>\n 
     <is-liked>false</is-liked>\n  
     <available-actions total=\"6\">\n <action>\n 
<code>add-comment</code>\n   
     </action>\n <action>\n 
     <code>categorize-as-job</code>\n 
</action>\n <action>\n 
<code>categorize-as-promotion</code>\n 
    </action>\n <action>\n 
<code>delete</code>\n 
</action>\n <action>\n 
<code>like</code>\n 
</action>\n <action>\n 
<code>unfollow</code>\n 
</action>\n </available-actions>\n 
</relation-to-viewer>\n </post>\n</posts>\n" 

어떤 아이디어를 작성한 가고 싶어 다시 다음, 데이터를 삽입? 미리 감사드립니다. 두 번째 foreach는 일단

+2

나는 당신이 무엇을 요구하고 있는지 전혀 모른다. 뭐가 문제 야? 어떤 오류가 있었습니까? –

+0

고객 XmlNodeList에서 오류가 발생하지 않았습니다. 3 레코드가 있습니다. mw_post에 user_id를 전달하려고합니다. 동일한 user_id가 mw_post의 모든 레코드에 삽입됩니다. – user2500094

+0

프로그램을 디버그하여 정확히 알려주십시오 문제의 코드 라인은 무엇입니까? 그리고 여기에 xml 파일을 올리시겠습니까? – Rezoan

답변

0

다시 내가

두 번째 foreach 루프가 첫 번째 foreach 루프 안에 중첩되어 있기 때문에

, 나는 첫 번째 foreach 루프를 재설정 할 가정 첫번째 foreach 문을 가고 싶어, 데이터를 삽입 . 이 경우 for 루프 (for (int i = 0; i < customer.Count; i++))가 더 좋을 수도 있습니다. 단지 루프 카운터를 다시 초기 값으로 재설정하십시오.

물론 이것은 최소한의 재 코딩이 필요한 빠른 수정입니다. 적절한 수정을 위해서는 독립적 인 메소드에 대한 제안과 필요할 때 호출하거나 심지어 재귀를 사용하는 것이 아마 이것에 접근하는 더 적절한 방법 일 것입니다.

+0

귀중한 답장을 보내 주셔서 감사합니다. 코드로 답을 업데이트하십시오. 여전히 혼란 스럽네요. – user2500094

1

"//posts/post/creator" 번 반복 한 다음 다시 "//posts/post" 번으로 반복하는 것처럼 보입니다. 아마도 루프를 뒤집은 것일 수도 있습니다. 이것을 시도하십시오 :

XmlNodeList title = d.SelectNodes("//posts/post"); 
foreach (XmlNode post in title) 
{ 
    // Note: I only want creators of the current post 
    XmlNodeList customer = post.SelectNodes("creator"); 
    foreach (XmlNode cus in customer) 
    { 
     // insert into mw_customer ... 

     // insert into mw_post ... 
    } 
} 

참고로 SQL 매개 변수를 사용하십시오. 현재 코드가 SQL injection에 매우 취약하기 때문에 훨씬 안전합니다. 또한, 하나의 인서트를 삽입하는 것보다는 여러 개의 인서트를 수행하는 것이 좋습니다. 마지막으로 SELECT COUNT(*) ...으로 키를 생성하는 대신 IDENTITY 열을 사용하십시오.

+0

귀중한 답장을 보내 주셔서 감사합니다. 그러나 일단 두 번째 foreach를 완료하면 나는 foreach를 먼저 수행하려고합니다. – user2500094

+0

그 길은 길입니다. 작업. 내부 루프를 완료하면 외부 루프가 계속됩니다. –

+0

네, 바깥 쪽 루프에 2 개의 레코드가 있고 안쪽 루프에 2 개의 레코드가 있습니다. 바깥 쪽 루프에는 첫 번째 레코드 user_id를 안쪽 루프에 전달하고 싶습니다. 일단 다시 삽입하면 두 번째 레코드를 꺼내기 위해 바깥 쪽 루프로 가고 싶습니다. 여기 내부 루프 반올림 2 회 – user2500094

관련 문제