C# - 数据集(/插入/更新多个表)
Posted
技术标签:
【中文标题】C# - 数据集(/插入/更新多个表)【英文标题】:C# - DataSet (/Insert/Update in Multiple tables) 【发布时间】:2011-12-21 12:48:43 【问题描述】:我不知道如何很好地处理 DataSet(以前在 VB 中使用 RecordSet)所以我做了一个看起来很乱的方法。想知道哪种是使用 DataSet 的正确方法。
我想解决的问题:
真的有必要使用 2 个 DataAdapter 实例,DataSet..吗? 提交更改的正确方法(添加行时有效,更新时无效) 我应该在 finally 块中处理什么?感谢关注。
代码很长,因为存在一些循环和一致性,但令我困惑的是使用 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;
【问题讨论】:
语法高亮是代码前面的4个空格(大多数复制粘贴生成器都有空格,所以这是自动的) 我将删除一些不相关的代码部分。 【参考方案1】:我建议您使用类型化数据集。这些将解决您的所有问题并提高代码质量。
【讨论】:
正如我所说,我是使用 DataSet 的菜鸟,我完全不了解正确的结构和正确的使用方式。 (我真的对此进行了研究,所以这就是我在这里问的原因)。更多细节会有所帮助。以上是关于C# - 数据集(/插入/更新多个表)的主要内容,如果未能解决你的问题,请参考以下文章