c# -数据集(在多个表中/插入/更新)

本文关键字:插入 更新 数据集 | 更新日期: 2023-09-27 18:18:24

我不知道如何很好地处理数据集(用于在VB中使用RecordSet),所以我做了一个看起来非常混乱的方法。想知道使用DataSet的正确方法。

我想解决的问题:

  • 是真的有必要使用2个实例的DataAdapter, 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;
}

c# -数据集(在多个表中/插入/更新)

我建议您使用类型化数据集。这些将解决你所有的问题,并将提高代码质量。