一。建立一個記憶體表,下面的代碼會用到它
DataTable auto = new DataTable();
auto.Columns.Add("ID");
auto.Columns.Add("Name");
for(int i=1;i<=10;i++)
{
auto.Rows.Add(new object[]{i,"baibaoqing"});
}
二。下面介紹DataTable對象經常使用的方法
1. DataTable 的複製和複製
建立DataTable的完全副本(full copu 複製表的結構和資料),通過DataTable的Copy方法實現
DataTable copy_Table=auto.Copy()
for(int i=0;i<copy_Table.Rows.Length;i++)
{
Response.Write("<script>alert("+copy_Table.Rows[i][0]+");</script>");
}
輸出的結果為從0到10 的數字
有時需要複製DataTable 的表模式(表結果)而不複製資料,可以使用DataTable的Clone方法
DataTable clone_Table=auto.Clone();
在複製了一個DataTable後,可能需要DataTable對象中的某些DataRow對象(行資料)複製到複製的DataTabel 中,可以使用DataTable 的ImPortRow方法
clone_Table.ImportRow(auto.Rows[0]);
2.枚舉DataTable
通過Foreach迴圈遍曆DataTable的行和列
System.Text.StringBuilder buffer=new System.Text.StringBuiler();
foreach(DataColumn dc in auto.Colmns)
{
buffer.Append(String.Format(“{0,15}”,dc.ColumnName));
}
buffer.Append("/r/t");
foreach(DataRow dr in auto.Rows)
{
foreach(DataColumn dc in auto.Colmns)
{
buffer.Append(String.Format("{0,15}",dr[dc]));
}
buffer.Append("/r/t");
}
textbox1.Text=buffer.ToString();
三. 使用DataView
1. Sort排序
DataView view=new DataView(auto);
view.Sort="Make ASC,Year DESC";
不過我很少使用DataView 的排序功能,我的作法是在SQL語句中使用Order by
2. 使用RowFilter 精確尋找
DataView view=new DataView(auto);
view.RowFilter="Make like 'AA%' and Year>2001";
同樣也可以在SQL語句中設定查詢條件,看個人的習慣和實際的需要了。
3 將DataView 匯出到一個新表
DataTable new_Table=view.ToTable("MyTable",true,"id","name");
MyTable 新表的名稱,true 表示顯示不同的值,將相同的行刪除(相當於Sql 的distinct),
id 和name 為新表的列ID.
4. 枚舉DataView
和枚舉DataTabe大同小異
System.Text.StringBuilder buffer=new System.Text.StringBuiler();
foreach(DataColumn dc in auto.Colmns)
{
buffer.Append(String.Format(“{0,15}”,dc.ColumnName));
}
buffer.Append("/r/t");
foreach(DataRowView dv in view)
{
foreach(DataColumn dc in auto.Colmns)
{
buffer.Append(String.Format("{0,15}",dv[dc]));
}
buffer.Append("/r/t");
}
textbox1.Text=buffer.ToString();
另外在.net 2.0中DataTable對象可以處理XML檔案,和DataSet一樣,DataTable對象也有ReadXml和WriteXml 的方法,沒有具體用過,有機會使用時再做總結。
------------------------------------------------------------------------------------------------------------------------------------------
通過DataTable獲得表的主鍵
很多情形下我們需要知道表的主鍵是什麼。在ADO.Net中提供了DataTable可以映射資料庫的表。於是便可以利用DataTable的屬性PrimaryKey,它是DataColumn[] 類型是一個數組。我們可以使用如下的代碼
DataColumn[] cols;
cols = Table.PrimaryKey;
//注意不是cols是DataColumn數組,不是DataColumn變數。這樣做主要是為了處理聯合主鍵的問題。
for(int i = 0; i < cols.Length; i++)
{
MessageBox.Show(cols[i].ColumnName);
}
按理這個問題就已經解決了,但是cols.Length卻是0。原來在預設的情況下填充DataTable時並沒有從資料庫中取的主鍵的資訊。如何獲得主鍵呢。經過研究發現在填充Dataset的時候可以使用DataAdapter的MissingSchemaAction屬性協助我們解決這個問題,於是有如下的代碼:
//使用DataAdapter填充DataTable
dataadapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;
dataadapter.Fill(Table);
DataColumn[] cols;
cols = Table.PrimaryKey;
//注意不是cols是DataColumn數組,不是DataColumn變數。這樣做主要是為了處理聯合主鍵的問題。
for(int i = 0; i < cols.Length; i++)
{
MessageBox.Show(cols[i].ColumnName);
}
這樣我們便可以如願以償了。MissingSchemaAction屬性是確定現有Dataset(或DataTable)架構與傳入資料不匹配時需要執行的操作。MissingSchemaAction.AddWithKey是枚舉值,它的作用是添加必需的列和主鍵資訊以完成架構,利用它使用者可以在每個 DataTable上顯式設定主鍵約束。
------------------------------------------------------------------------------------------------------------------------------------------
DataTable中資料記錄的統計
我們在使用Sql Server這些資料庫時,可以輕鬆的通過Sum、Aver、Count等統計出相關結果,那麼,在已經把資料檢索出來的DataSet(DataTable)中呢。特別是通過Web Service獲得了DataSet,這個時候,可是沒有辦法回頭去修改Select語句來擷取這些統計了。那麼在DataSet/DataTable中是否可以進行統計呢。
在MSDN中,有一篇MS推薦的統計方法,就是逐行對資料進行求和統計,這個方法,其實有等於無(或許這個方法只是針對於DataGrid求取小計用吧),因為這個方法中採用的是DataGrid的ItemDataBind事件來對資料進行累加,同我們手動寫代碼統計沒有什麼區別。
本文介紹一個簡單的方法,不需要逐條記錄進行計算就可以輕鬆的獲得DataTable中的記錄統計結果。這個簡單的方法就是調用功能強大的DataTable的函數Compute。
一、調用說明(僅以C#為例,下同):
public object Compute(string strExpression,string strFilter)
參數:
strExpression:要計算的運算式字串,基本上類似於Sql Server中的統計運算式
strFilter:統計的過濾字串,只有滿足這個過濾條件的記錄才會被統計
二、調用舉例:
以下樣本,假設一個產品銷售表table,描述某商場中各促銷員銷售的實際記錄,包含欄位為:姓名(Name)、性別(Sex,0為女,1為男)、生日(Birthday)、銷售產品的代碼(ProID)、銷售的數量(Quantity)、銷售價格(Price)。
1。統計所有性別為女的銷售人員的數量:
table.Compute("Count(*)","Sex=0");
2。統計所有銷售人員中年齡大於20歲的
table.Compute("Count(*)","Birthday<'"+today);//today為今天的日期文字
3。統計銷售產品的平均價格
table.Compute("Aver(Price)","true");
4。統計產品代碼為1的產品銷售數量:
table.Compute("Sum(Quantity)","ProID=1");
5。統計所有產品的銷售總金額:
要統計總銷售金額,由於table中不存在某項產品某個促銷員銷售的金額資料,但我們可以通過Quantity*Price來獲得。比如:
table.Compute("Sum(Quantity*Price)","true");
這裡一個問題是:DataTable的統計功能沒有SqlServer強,這個統計是錯誤的,因為Compute的統計不具備Sum(Quantity*Price)這樣資料的功能。那怎麼辦呢。
對於這樣複雜資料的統計,我們可以在DataTable中建立一個新的欄位來完成,比如Amount,同時設定該欄位的Expression為Quantity*Price,這樣我們就可以使用統計功能了:
table.Compute("Sum(Amount)","true");
以上都是計算每一列的合計,要添加一行求合計可以使用下面的方法:
System.Data.DataRow dataRow=dataSet.Tables[0].NewRow()
'假設你的DataSet為dataSet,表在索引0位置,同時假設你的所有欄位都是可以求合計的。
System.DataRow dataRow = new System.DataRow();
dataRow=DT.NewRow();
然後就是統計了:
int i ;
int fldCnt ;
fldCnt=DT.Cols.Count;
for( i=0 ;i< fldCnt-1;i++)
dataRow(i)=DT.Compute("Sum("+i.ToString()+")","true");
DT.Rows.Add(dataRow);
好了,大功告成。希望對大家有用。
-------------------------------------------------------------------------------------------
在下面的例子中實現了3個Join方法,其目的是把兩個DataTable串連起來,相當於Sql的Inner Join方法,返回DataTable的所有列。
如果兩個DataTable中的DataColumn有重複的話,把第二個設定為ColumnName+"_Second",下面是代碼,希望對大家有所協助。
using System;
using System.Data; CHINAZ
namespace WindowsApplication1
{
public class SQLOps
{
public SQLOps()
{
}
public static DataTable Join (DataTable First, DataTable Second, DataColumn[] FJC, DataColumn[] SJC)
{
//建立一個新的DataTable
DataTable table = new DataTable("Join");
// Use a DataSet to leverage DataRelation
using(DataSet ds = new DataSet()) CHINAZ
CHINAZ
{
//把DataTable Copy到DataSet中
ds.Tables.AddRange(new DataTable[]{First.Copy(),Second.Copy()});
CHINAZ
DataColumn[] parentcolumns = new DataColumn[FJC.Length];
CHINAZ
for(int i = 0; i < parentcolumns.Length; i++)
{
parentcolumns[i] = ds.Tables[0].Columns[FJC[i].ColumnName];
}
DataColumn[] childcolumns = new DataColumn[SJC.Length];
for(int i = 0; i < childcolumns.Length; i++)
{
childcolumns[i] = ds.Tables[1].Columns[SJC[i].ColumnName]; CHINAZ
CHINAZ
}
//建立關聯
DataRelation r = new DataRelation(string.Empty,parentcolumns,childcolumns,false);
ds.Relations.Add(r); CHINAZ
//為關聯表建立列
for(int i = 0; i < First.Columns.Count; i++)
{
table.Columns.Add(First.Columns[i].ColumnName, First.Columns[i].DataType);
}
for(int i = 0; i < Second.Columns.Count; i++)
{
//看看有沒有重複的列,如果有在第二個DataTable的Column的列明後加_Second
CHINAZ
if(!table.Columns.Contains(Second.Columns[i].ColumnName))
table.Columns.Add(Second.Columns[i].ColumnName, Second.Columns[i].DataType);
else
table.Columns.Add(Second.Columns[i].ColumnName + "_Second", Second.Columns[i].DataType);
}
table.BeginLoadData();
foreach(DataRow firstrow in ds.Tables[0].Rows)