以下是DataTable中對數據的選擇和更新操作。采用DataTable.Select()方法。采用該方法獲取的結果是DataRow對象數組。Select()有三種重載(以下資料來自MSDN):
MSDN關於Select()方法內容鏈接
以下依次進行說明:
1.Select() 獲取DataTable中的所有行,轉換成DataRow的格式。這里不做過多說明,以下對dtTest(非空的DataTable)使用Select()
DataRow[] rows = dtTest.Select();
1
2.Select(String expression) 如以下例子所示,expression代表篩選的表達式(sql語句where之后的部分),但不包含排序方式。
DataRow[] rows = dtTest.Select("id<5");
1
3.Select(String expression , String sortOrder ) 其中sortOrder 代表排序方式(字段名稱+正序或者倒序)。
DataRow[] rows = dtTest.Select("id<5","id ASC");
1
4.DataTable.Select (String expression , String sortOrder , DataViewRowState dVRState) 其中dVRState代表這一個數據集合的狀態。枚舉類型。詳細內容可參考以下鏈接:
DataViewState詳細介紹
DataRow[] rows = dtTest.Select("id<5","id ASC",DataViewRowState.Added);
1
!!!更新DataTable
有了以上的基礎我們即可以根據條件輕松的獲取DataTable中的想要的內容了。只不過通過Select()方法獲取的結果是DataRow[ ]形式,如果需要將其轉換為DataTable格式,可采用如下的方法(全是自己碼的,覺得好用給我點個贊,^_^):
//建立一張數據表
DataTable dtInitial = new DataTable("Orders");
dtInitial.Columns.Add("id", typeof(Int32));
dtInitial.Columns.Add("name", typeof(string));
//向表中添加數據
for (int i = 0; i < 10; i++)
{
DataRow newRow = dtInitial.NewRow();
newRow["id"] = i;
newRow["name"] = "未命名";
dtInitial.Rows.Add(newRow);
}
//更新表的條件
string expression = "id < 5 ";
//要更新的字段
string variable = "name";
//更新字段的值
string value = "Clear_mind";
//不重復字段
string primaryKey = "id";
DataTable dtReturn = null; //用於返回結果的DataTable
DataRow[] arrRow = dtInitial.Select(expression); //選出滿足更新條件的行
dtReturn = arrRow[0].Table.Clone(); //復制需要更新的表的結構
bool[] rowChanged = new bool[dtInitial.Rows.Count]; //用於保存修改的行的索引號
for (int i = 0; i < dtInitial.Rows.Count; i++)
{
rowChanged[i] = false;
}
//將修改的行存入dtReturn
foreach (DataRow row in arrRow)
{
row[variable] = value; //將要更新的值寫入需要更新的行的對應字段
for (int i = 0; i < dtInitial.Rows.Count; i++)
{
//找到修改過的行
if (dtInitial.Rows[i][primaryKey].ToString() == row[primaryKey].ToString())
{
dtReturn.ImportRow(row); //將修改過的行存入dtReturn
rowChanged[i] = true; //將修改過的行號對應的標志位置1
break;
}
}
}
//將未修改的行存入dtReturn
for (int i = 0; i < dtInitial.Rows.Count; i++)
{
if (rowChanged[i] == false)
dtReturn.ImportRow(dtInitial.Rows[i]);
}
//打印結果
for (int i = 0; i < dtReturn.Rows.Count; i++)
{
Console.WriteLine(dtReturn.Rows[i]["name"].ToString());
}
————————————————
版權聲明:本文為CSDN博主「DurableHumor」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/my_clear_mind/article/details/79673205