[ADO.NET] 如何使用 DataTable / 搜尋 過濾 資料

[ADO.NET] 如何使用 DataTable / 搜尋 過濾 資料

1.如果我們想要在搜尋 DataTable 的資料,可以使用 Select 方法。

快照-2009102032713

2.Select 方法會回傳 DataRow 陣列

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.DataColumnSetOrdinal 方法可以變更 DataTable 的欄位,下例的EmployeeID欄位,原本是在0現在則把它變到1的位置

dt.Columns["EmployeeID"].SetOrdinal(1);

 

 

6.還可以利用 DataRowCollectionFind 方法來搜尋 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.DataTableSelect方法因為需要維護Primary Key,若需要大量的Select DataTable,為了效能我們可以改用 DataView 。可參考以下:

[ADO.NET] 如何使用 DataView 物件(一) / 搜尋 過濾 資料

[ADO.NET] 如何使用 DataView 物件(二) / 新增 編輯 刪除 資料

 

  
 

System.Data.SqlClient

 

取得北風資料庫中的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;
}
}

 

範例下載:

CS_UseDataTable.rar

VB_UseDataTable.rar

快照-2009102052714

若有謬誤,煩請告知,新手發帖請多包涵


Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET

Image result for microsoft+mvp+logo