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;
}
구문 강조 표시는 코드 앞에 4 칸 (대부분의 빌더 복사 붙여 넣기 공간이 자동으로 있습니다.) – Moonlight
이것은 내 눈을 아프게합니다. – ThePower
코드의 관련성이없는 부분을 제거합니다. –