C#操作DataTable类
⼀、DataTable简介
(1)构造函数
名称说明
DataTable() 不带参数初始化DataTable 类的新实例
DataTable(string tableName)⽤指定的表名初始化DataTable 类的新实例DataTable(string tableName, string tableNamespace) ⽤指定的表名和命名空间初始化DataTable类的新实例
(2)常⽤属性
名称说明
CaseSensitive指⽰表中的字符串⽐较是否区分⼤⼩写
ChildRelations获取此DataTable 的⼦关系的集合
Columns获取属于该表的列的集合
Constraints获取由该表维护的约束的集合
DataSet获取此表所属的DataSet
DefaultView获取可能包括筛选视图或游标位置的表的⾃定义视图
HasErrors获取⼀个值,该值指⽰该表所属的DataSet 的任何表的任何⾏中是否有错误MinimumCapacity获取或设置该表最初的起始⼤⼩。该表中⾏的最初起始⼤⼩。默认值为50
Rows获取属于该表的⾏的集合
TableName 获取或设置DataTable的名称
(3)常⽤⽅法
名称说明
AcceptChanges() 提交⾃上次调⽤AcceptChanges() 以来对该表进⾏的所有更改
BeginInit() 开始初始化在窗体上使⽤或由另⼀个组件使⽤的DataTable。初始化发⽣在运⾏时Clear()清除所有数据的DataTable
Clone()克隆DataTable 的结构,包括所有DataTable 架构和约束
EndInit()结束在窗体上使⽤或由另⼀个组件使⽤的DataTable 的初始化。初始化发⽣在运⾏
时
ImportRow(DataRow
row)将DataRow 复制到DataTable 中,保留任何属性设置以及初始值和当前值
Merge(DataTable table)将指定的DataTable 与当前的DataTable 合并
NewRow()创建与该表具有相同架构的新DataRow
⼆、DataTable使⽤技巧
(1)查Select
using System;
using System.Data;
using System.Text;
namespace ConsoleApp
{
class Program
{
static void Main(string[] args)
{
DataTable dt = new DataTable("temp");
dt.Columns.Add("Id"); //添加列
dt.Columns.Add("Name");
dt.Rows.Add("1", "刘备"); //添加⾏
dt.Rows.Add("2", "关⽻");
dt.Rows.Add("3", "张飞");
dt.Rows.Add("4", "赵云");
dt.Rows.Add("5", "黄忠");
SelectFun(dt);
Console.ReadKey();
}
#region遍历范例
///<summary>
///遍历⽅式⼀
/
//</summary>
///<param name="dt"></param>
static void TraversalFun1(DataTable dt)
{
for (int i = 0; i < dt.Rows.Count; i++)
{
Console.WriteLine("编号:{0};名称:{1}",
dt.Rows[i]["Id"].ToString(),
dt.Rows[i]["Name"].ToString());
}
}
/
//<summary>
///遍历⽅式⼆
///</summary>
///<param name="dt"></param>
static void TraversalFun2(DataTable dt)
{
foreach (DataRow myRow in dt.Rows)
{
Console.WriteLine("编号:{0};名称:{1}",
myRow[0].ToString(),
myRow[1].ToString());
}
}
///<summary>
///遍历⽅式三
///</summary>
///<param name="dt"></param>
static void TraversalFun3(DataTable dt)
{
foreach (DataRow dr in dt.Rows)
{
Console.WriteLine("编号:{0};名称:{1}",
dr["Id"].ToString(),
dr["Name"].ToString());
}
}
///<summary>
///遍历⽅式四
///</summary>
///<param name="dt"></param>
static void TraversalFun4(DataTable dt)
{
StringBuilder msg = new StringBuilder();
foreach (DataRow dr in dt.Rows)
{
msg.Clear();
foreach (DataColumn dc in dt.Columns)
{
msg.AppendFormat("{0}:{1};", dc.ColumnName, dr[dc.ColumnName]); }
Console.WriteLine(msg.ToString());
}
}
#endregion
#region查范例
static void SelectFun(DataTable dt)
{
//条件查询
Console.WriteLine("条件查询⽰例语句:Id > 1 and Name <> '关⽻'");
Display(dt.Select("Id > 1 and Name <> '关⽻'", "Id desc"));
//like⽰例
Console.WriteLine("like⽰例语句:Name like '关%");
Display(dt.Select("Name like '关%'", "Id desc"));
}
static void Display(DataRow[] drArr)
{
foreach (DataRow dr in drArr)
{
Console.WriteLine(dr["Name"]);
}
}
#endregion
}
}
View Code
(2)排序、聚合
using System;
using System.Data;
namespace ConsoleApp
{
class Program
{
static void Main(string[] args)
{
DataTable dt = new DataTable();
dt.Columns.Add("Id");
dt.Columns.Add("Name");
dt.Columns.Add("Age", typeof(Int32)); //注意要计算平均值要设置列类型为数字
dt.Rows.Add("1", "刘备", 31);
dt.Rows.Add("2", "关⽻", 29);
dt.Rows.Add("3", "张飞", 28);
dt.Rows.Add("4", "赵云", 27);
dt.Rows.Add("5", "黄忠", 50);
dt.DefaultView.Sort = "Age DESC"; //排序
dt = dt.DefaultView.ToTable();
foreach (DataRow dr in dt.Rows)
{
Console.WriteLine(dr["Name"]);
}
object obj = dt.Compute("Count(Id)", "Age>26"); //输出3 查询年龄⼤于26的⼈数
Console.WriteLine(obj.ToString());
object obj2 = dt.Compute("Avg(Age)", "true"); //输出33 查询所有⼈的平均年龄(要设置列为整型,否则不能计算) Console.WriteLine(obj2.ToString());
object obj3 = dt.Compute("Sum(Age)", "true"); //输出165
Console.WriteLine(obj3.ToString());
Console.ReadKey();
}
}
}
View Code
(3)⾃增列
using System;
using System.Data;
namespace ConsoleApp
{
class Program
{
static void Main(string[] args)
{
DataTable dt = new DataTable();
DataColumn dc = dt.Columns.Add("Id", Type.GetType("System.Int32"));
dc.AutoIncrement = true; //⾃动增加
dc.AutoIncrementSeed = 1; //起始为1
dc.AutoIncrementStep = 1; //步长为1
dc.AllowDBNull = false; //不允许为空
dt.Columns.Add("Name", Type.GetType("System.String"));
dt.Columns.Add("Age", typeof(Int32)); //注意要计算平均值要设置列类型为数字
dt.Rows.Add(null, "刘备", 31); //注意这次添加不⽤在⼿输Id了,但是要给个null
dt.Rows.Add(null, "关⽻", 29);
dt.Rows.Add(null, "张飞", 28);
dt.Rows.Add(null, "赵云", 27);
dt.Rows.Add(null, "黄忠", 50);
foreach (DataRow dr in dt.Rows)
{
Console.WriteLine(dr["Id"]); //输出1 2 3 4 5
}writeline方法属于类
Console.ReadKey();
}
}
}
View Code
(4)System.DBNull
null在.Net中表⽰⽆效的对象引⽤。即空对象。
DBNull是⼀个类(System.DBNull)。这个类直接继承于Object,它只有继承下来的属性与⽅法,只有⼀个⾃⼰的字段value。表⽰它⾃⼰。指数据库中数据为空(NULL)时,在.Net中的值。DBNull.Value表⽰⼀个对象在数据库中的值为空,或者说未初始化,DBNull.Value对象是指向有效的对象。
但是为什么 DBNull 可以表⽰数据库中的字符串,数字,或⽇期呢?原因是.Net储存这些数据的类(DataRow等)都是以 object 的形式来储存数据的。
对于 DataRow , 它的 row["column"] 返回的值永远不为null ,要么就是具体的为column的类型的值。要么就是DBNull 。所以
row[column].ToString() 这个写法永远不会在ToString那⾥发⽣NullReferenceException,但有可能抛下标越界的异常。
DBNull 实现了 IConvertible 。但是,除了 ToString 是正常的外,其他的ToXXX都会抛出不能转换的错误。
在 IDbCommand() 的ExecuteScalar的返回值中,情况可以这样分析:
SELECT 1 --这样返回的object是1。
SELECT null --这样返回的是DBNull.Value。
eg:假设在DataSet中我设置了⼀个int类型,但是在显⽰的时候,我想让为0的地⽅显⽰为空⽩该怎么实现呢?
using System;
using System.Data;
namespace ConsoleApp
{
class Program
{
static void Main(string[] args)
{
DataTable dt = new DataTable();
dt.Columns.Add("Name", typeof(String));
dt.Columns.Add("Age", typeof(Int32));
dt.Rows.Add("撼地神⽜", 0);
dt.Rows.Add("刘备", 21);
for (int i = 0; i < dt.Rows.Count; i++)
{
if (dt.Rows[i]["Age"].ToString() == "0")
{
//dt.Rows[i]["Age"] = null; 这样写会提⽰如下错误:不能将 Column“Age”设置为 null。请改⽤ DBNull。
dt.Rows[i]["Age"] = DBNull.Value;
}
Console.WriteLine(dt.Rows[i]["Name"] + ":" + dt.Rows[i]["Age"]);
}
Console.ReadKey();
}
}
}
View Code
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论