[ADO.NET] 如何使用 DataTable / 搜尋 過濾 資料
1.如果我們想要在搜尋 DataTable 的資料,可以使用 Select 方法。
DataRow[] dr = myDataTable.Select(textBox1.Text);
3.Select 預設會以 Primary Key 的方式排序,若沒有 Primary Key 則以 DataRowCollection 順序為主,以下是為DataTable設定主鍵的方法
dt.PrimaryKey = new DataColumn[] { dt.Columns["EmployeeID"] };
4.降冪(由大排到小)用Desc,升冪(由小排到大)用Acs。
//升冪
DataRow[] dr = myDataTable.Select("", comboBox1.Text + " asc");
//降冪
DataRow[] dr = myDataTable.Select("", comboBox1.Text + " desc");
5.DataColumn 的 SetOrdinal 方法可以變更 DataTable 的欄位,下例的EmployeeID欄位,原本是在0現在則把它變到1的位置
dt.Columns["EmployeeID"].SetOrdinal(1);
6.還可以利用 DataRowCollection 的 Find 方法來搜尋 DataRow 的資料,此法必須要設定Primary Key,否則會出錯哩。
DataTable dt = myDataTable;
//1.設定主鍵盤
dt.PrimaryKey = new DataColumn[] { dt.Columns[comboBox3.Text] };
//2.搜尋DataRow
DataRow dr = dt.Rows.Find(textBox5.Text.Trim());
7.如果我們有多個欄位要搜尋就傳陣列給它
DataTable dt = myDataTable;
//1.設定多個主鍵
dt.PrimaryKey = new DataColumn[] { dt.Columns[comboBox4.Text], dt.Columns[comboBox5.Text] };
//2.欲查詢的資料
object[] search = new object[] { textBox6.Text, textBox7.Text };
//3.搜尋DataRow
DataRow dr = dt.Rows.Find(search);
8.DataTable的Select方法因為需要維護Primary Key,若需要大量的Select DataTable,為了效能我們可以改用 DataView 。可參考以下:
[ADO.NET] 如何使用 DataView 物件(一) / 搜尋 過濾 資料
[ADO.NET] 如何使用 DataView 物件(二) / 新增 編輯 刪除 資料
取得北風資料庫中的Employees資料表,並建立一個DataTable,myDataTable就是我的 DataTable。
private void Form1_Load(object sender, EventArgs e)
{
cs = "Data Source=localhost;Initial Catalog=Northwind;Integrated Security=True";
qs = "SELECT * FROM Employees";
//資料庫連結,建立DataTable
using (SqlConnection cn = new SqlConnection(cs))
{
cn.Open();
using (SqlCommand cmd = new SqlCommand(qs, cn))
{
using (SqlDataReader dr = cmd.ExecuteReader())
{
using (DataTable dt = new DataTable())
{
dt.Load(dr);
myDataTable = dt;
}
}
}
}
}
如何使用Select 方法,查尋日期、資料、關鍵字
private void button1_Click(object sender, EventArgs e)
{
DataRow[] dr = myDataTable.Select(textBox1.Text);
this.dataGridView2.DataSource = SearchData(dr);
}
private void button2_Click(object sender, EventArgs e)
{
DataRow[] dr = myDataTable.Select(textBox2.Text);
this.dataGridView2.DataSource = SearchData(dr);
}
private void button3_Click(object sender, EventArgs e)
{
DataRow[] dr = myDataTable.Select(textBox3.Text);
this.dataGridView2.DataSource = SearchData(dr);
}
private DataTable SearchData(DataRow[] dr)
{
//建立新的DataTable
DataTable dt = new DataTable();
//建立新的DataTable Columns
foreach (DataColumn dc in myDataTable.Columns)
{
dt.Columns.Add(dc.ToString());
dt.Columns[dc.ToString()].DataType = dc.DataType;
}
int i = 0;
//讀取過濾的資料
foreach (DataRow item in dr)
{
DataRow row = dt.NewRow();
i = 0;
foreach (DataColumn dc in myDataTable.Columns)
{
//建立DataRow的資料
row[dc.ToString()] = item.ItemArray[i];
i++;
}
dt.Rows.Add(row);
}
return dt;
}
如何使用Find方法搜尋資料(單一主鍵)
private void button7_Click(object sender, EventArgs e)
{
DataTable dt = myDataTable;
//1.設定主鍵盤
dt.PrimaryKey = new DataColumn[] { dt.Columns[comboBox3.Text] };
//2.搜尋DataRow
DataRow dr = dt.Rows.Find(textBox5.Text.Trim());
if (dr != null)
{
//3.將找到的資料放到另一個DataTable
DataTable newdt = new DataTable();
foreach (DataColumn column in dt.Columns)
{
newdt.Columns.Add(column.ToString());
}
DataRow newdr = newdt.NewRow();
int i = 0;
//讀取過濾的資料
newdr = newdt.NewRow();
foreach (var item in dr.ItemArray)
{
newdr[i] = dr.ItemArray[i];
i++;
}
newdt.Rows.Add(newdr);
this.dataGridView2.DataSource = newdt;
}
else
{
MessageBox.Show("找不到 " + textBox5.Text);
this.dataGridView2.DataSource = null;
}
}
如何使用Find方法搜尋資料(組合主鍵)
private void button8_Click(object sender, EventArgs e)
{
DataTable dt = myDataTable;
//1.設定多個主鍵
dt.PrimaryKey = new DataColumn[] { dt.Columns[comboBox4.Text], dt.Columns[comboBox5.Text] };
//2.欲查詢的資料
object[] search = new object[] { textBox6.Text, textBox7.Text };
//3.搜尋DataRow
DataRow dr = dt.Rows.Find(search);
if (dr != null)
{
//4.將找到的資料放到另一個DataTable
DataTable newdt = new DataTable();
foreach (DataColumn column in dt.Columns)
{
newdt.Columns.Add(column.ToString());
}
DataRow newdr = newdt.NewRow();
int i = 0;
//讀取過濾的資料
newdr = newdt.NewRow();
foreach (var item in dr.ItemArray)
{
newdr[i] = dr.ItemArray[i];
i++;
}
newdt.Rows.Add(newdr);
this.dataGridView2.DataSource = newdt;
}
else
{
MessageBox.Show("找不到 " + textBox6.Text + " 及 " + textBox7.Text);
this.dataGridView2.DataSource = null;
}
}
範例下載:
若有謬誤,煩請告知,新手發帖請多包涵
Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET