I dont know how to handle with DataSet very well (used to work with RecordSet in VB) so I made a method that looks very messy. Wondering which is the correct way to use DataSet.
Problems I would like to solve:
- Is really necessary use 2 instances of DataAdapter, DataSet..?
- Correct way to commit changes (working when add rows and not when update)
- What should I dispose in finally blocks?
Thanks for attention.
Code is long because there are some loopings and consistences but what is confusing me is Editing or Insert rows using DataSet.
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;
}
I suggest you to use typed Datasets. These will solve all your problems and will improve the code quality.