2011-12-21 3 views
0

DataSet을 매우 잘 처리하는 방법을 잘 모르겠습니다. VB에서 RecordSet과 함께 사용하는 방법을 알고 있으므로 매우 난잡 해 보이는 메서드를 만들었습니다. DataSet을 사용하는 올바른 방법은 무엇인지 궁금합니다.DataSet (여러 테이블에서/Insert/Update)

문제 내가 해결하고 싶은 :

  • 이 정말 필요한 사용을 DataSet에 데이터 어댑터의 두 인스턴스인가 ..?
  • 변경 사항을 적용하는 올바른 방법 (행을 추가 할 때가 아니라 업데이트 할 때 사용)
  • finally 블록에 무엇을 처리해야합니까?

감사합니다.

반복 및 일관성이 있기 때문에 코드가 길지만 코드 집합을 사용하여 행을 편집하거나 삽입하는 것이 혼란 스럽습니다.

public bool SaveData() 
{ 
    bool resp = false; 
    this.pObs = null; 
    bool editing = false; 

    //StringBuilder stringBuilder;  
    string sqlQuery = "SELECT * FROM BooksTemp"; 
    string sqlQuery2 = "SELECT * FROM Categories;";  

    using (SqlConnection sqlConnection = new SqlConnection(connectionString)) 
    { 
     SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(sqlQuery, connectionString); 
     SqlCommandBuilder sqlCommandBuilder = new SqlCommandBuilder(sqlDataAdapter); 

     SqlDataAdapter sqlDataAdapter2 = new SqlDataAdapter(sqlQuery2, connectionString); 
     SqlCommandBuilder sqlCommandBuilder2 = new SqlCommandBuilder(sqlDataAdapter2); 
     DataSet dataSet2 = new DataSet(); 

     DataSet dataSet = new DataSet(); 
     DataTable dataTable = null; 
     DataRow Row = null; 

     try 
     { 
      sqlDataAdapter.Fill(dataSet, "BooksTemp"); 
      dataTable = dataSet.Tables["BooksTemp"]; 

      sqlDataAdapter2.Fill(dataSet2, "Categories"); 
      DataTable tableCategorias = dataSet2.Tables["Categories"]; 

      int i = 0; 
      foreach (Ebook ebook in pListEbooks) 
      { 
       editing = false; 

       #region loop_categories 

       /* Loop all book categories before save in temporary book table*/ 
       string codCategorias = null; 
       if (ebook.categories != null) 
       { 
        bool aux; 
        string catID; 

        try 
        { 
         foreach (Categorias categoria in ebook.categories) 
         { 
          aux = false; 
          /* Search the categorie in DB */ 
          if(tableCategorias.Select("CDD = '" + categoria.code + "'").Length > 0) 
           aux = true; 

          /* Include categorie in DB */ 
          if (!aux) 
          { 
           /* Generate an ID */ 
           catID = Strings.Codify(); 

           //tableCategorias.Rows.Find(catID) didnt work 
           while (tableCategorias.Select("ID = '" + catID + "'").Length > 0) 
           { 
            catID = Strings.Codifica(); 
           } 
           Row = tableCategorias.NewRow(); 
           Row.BeginEdit(); 

           Row["ID"] = catID; 
           Row["Nome"] = categoria.description; 

           tableCategorias.Rows.Add(Row); 
           sqlDataAdapter2.Update(tableCategorias); 
          } 
         } 
        } 
        catch { } 
        finally 
        { 
         // Shoud I dispose or close something here? 
        } 
       } 

       #endregion 

       /* Verify if the book already have changes in DB */     
       if (dataTable.Select("DistribuidorLivroID = '" + ebook.id + "'").Length == 1) 
       { 
        /* Edit row with new ebook changes */ 
        editing = true; 
        Row = dataTable.Rows[i]; 
        Row.BeginEdit(); 
        Row["UpdatedOn"] = DateTime.Now; 
       } 
       else 
       { 
        /* Add new row with ebook changes */ 
        Row = dataTable.NewRow(); 
        Row.BeginEdit(); 
        Row["CreatedOn"] = DateTime.Now; 
       } 
       Row["DistribuidorLivroID"] = ebook.id; 

       if (ebook.price != null) 
        Row["Price"] = ebook.price; 
       if (ebook.sorting_title != null) 
        Row["Title"] = ebook.title; 
       if (ebook.cover_image != null) 
        Row["Foto"] = ebook.cover_image; 

       if (!editing) 
        dataTable.Rows.Add(Row); 
       // else 
       //  Row.AcceptChanges(); 

       // Commiting only when I add new row and not when I edit a row 
       sqlDataAdapter.Update(dataTable); 
       i++; 
      } 
     } 
     catch { } 
     finally 
     { 
      // What should I dispose here?    
     } 
    } 
    return resp; 
} 
+0

구문 강조 표시는 코드 앞에 4 칸 (대부분의 빌더 복사 붙여 넣기 공간이 자동으로 있습니다.) – Moonlight

+0

이것은 내 눈을 아프게합니다. – ThePower

+0

코드의 관련성이없는 부분을 제거합니다. –

답변

0

입력 된 데이터 집합을 사용하는 것이 좋습니다. 이것들은 모든 문제를 해결할 것이고 코드 품질을 향상시킬 것입니다.

+0

내가 DataSet을 사용하는 친절한 멍청이라고 말했듯이, 나는 올바른 구조와 사용법을 이해하지 못했습니다. (나는 그것에 대해 정말로 연구했다. 그래서 나는 왜 여기에서 묻고 있는가). 자세한 내용은 도움이 될 것입니다. –