DataSet操作数据库
DataSet操作数据库
________________________________________________________________________________________________________
SqlConnection thisConnection = new SqlConnection(@"Data Source=(local);Integrated Security=SSPI;Initial Catalog=数据库名");
thisConnection.Open();//打开数据库连接
SqlDataAdapter 适配器一 = new SqlDataAdapter("select * from 顾客", thisConnection);
DataSet thisDataSet = new DataSet();//数据集
适配器一.Fill(thisDataSet, "表名");//填充数据集
thisDataSet.Tables["表名"].Rows[0]["列名"]="更新";//在内存中更新数据
thisAdapter.Update(thisDataSet, "表名");//更新数据库
thisConnection.Close();//关闭数据库连接
********************************************************************************************************
ADO.net的主要对象元素:_______________________________________________________________________________________________________
1.添加记录 (添加行)
添加记录首先需要声明两个变量 DataTable ,DataRow
其中DataTable需要实例化到具体的数据集中的某个table
DataRow = DataTable.NewRow() 声明为Table的新Row
再对DataRow进行赋值,调用DataTable.Rows.Add(DataRow)即可
DataColumn[] keys = new DataColumn[1];
keys[0] = thisDataSet.Tables["表名"].Columns["列名"];
________________________________________________________________________________________________________
2.删除纪录
如下 DataTable.Rows[5].Delete();
推想:应该可以这样,首先申明一个变量 DataRow[] objRows 用来存储要删除的行
objRows = DataTable.Select("查询条件");
thisDataSet.Tables["表名"].PrimaryKey = keys;//设置主键,可以定义多个主键,无非就是keys[0]、key[1]、key[2]...多定义几个就可以了
DataRow findRow = thisDataSet.Tables["表名"].Rows.Find("列数据");//查找行,这种方法只能用于查找主键,也就是在表中惟一地标识行的值或值集合
if (findRow == null)
{
Console.WriteLine("未找到,将添加行");
DataRow thisRow = thisDataSet.Tables["表名"].NewRow();
thisRow["列名"] = "新数据";
thisDataSet.Tables["表名"].Rows.Add(thisRow);//添加行
}
else if (findRow != null)
{
Console.WriteLine("找到,将删除行");
findRow.Delete();
}
thisAdapter.Update(thisDataSet, "表名");//更新数据库
________________________________________________________________________________________________________
3.修改纪录 (编辑行)
首先声明一个变量 DataRow[] objRows用来存储要编辑的行
objRows = DataTable.Select("查询条件");
如果是一行,可以这样 objRows = DataTable.Rows[3];
再对其进行修改 如 objRows[0][FIELD1]="" objRows[0][FIELD2]=""
thisDataSet.Tables["表名"].Rows[0]["列名"] = "更新";//在内存中更新数据
thisAdapter.Update(thisDataSet, "表名");//更新数据库
实际上Delete()等方法并不执行删除等操作,它仅仅标记要删除的行,在Rows集合中的每一个DateRow对象都有RowState,它跟踪记录此行是被删除、添加、修改,还是不变,实际上在此中的操作全部在内存中进行,而Update()方法才真正更新数据库。Delete()方法将行的RowState设置为Deleted,然后Update()就在数据库中将在Rows集合中标记为Deleted的所有行删除。
Visual Studio.NET在线文档会提示您在执行Delete()方法之后调用DataSet的AcceptChanges()方法;但是,这仅能删除DataSet中的行,却不影响数据库中的行,因为Update()仅影响在Rows集合中找到的行,遗漏的行将被忽略掉。如果希望在数据库中删除行,则不要在调用Update()之前调用AcceptChanges()方法。
这个问题也适用于Remove()方法;仅当希望从DataSet的Rows集合中,而不是数据库中删除行时才调用它。
________________________________________________________________________________________________________
3.表查询
DataRow[] 权限清单Row = this.superCargoDataSet.Tables["权限清单"].Select("操作员ID=" + 操作员ID);
------------------------
OleDbCommand thisCommand=thisConnection.CreateCommand(); //
thisCommand.CommandText="Select * FROM 表名";
OleDbDataReader thisReader=thisCommand.ExecuteReader();
while(thisReader.Read())
{
Console.WriteLine("/t{0}/t{1}",thisReader["ID"],thisReader["TheName"]);
}
thisReader.Close();
/*--------------前提--------------*/
SqlDataAdapter thisAdapter = new SqlDataAdapter("select * from 表名", thisConnection); //适配器
SqlCommandBuilder thisBuilder = new SqlCommandBuilder(thisAdapter);//将命令构造器与适配器关联,用于自动生成SQL语句
DataSet thisDataSet = new DataSet();//数据集
thisAdapter.Fill(thisDataSet, "表名");//填充数据集
Console.WriteLine("输出数据:{0}", thisDataSet.Tables["表名"].Rows[0]["列名"]);//输出数据
________________________________________________________________________________________________________
5.创建表关系
SqlDataAdapter 适配器一 = new SqlDataAdapter("select * from 顾客", thisConnection);
SqlDataAdapter 适配器二 = new SqlDataAdapter("select * from 订单明细", thisConnection);
适配器一.Fill(thisDataSet, "顾客");//填充
适配器二.Fill(thisDataSet, "订单明细");//填充
//创建关系
DataRelation 关系 = thisDataSet.Relations.Add("顾客和订单", thisDataSet.Tables["顾客"].Columns["顾客ID"], thisDataSet.Tables["订单明细"].Columns["顾客ID"]);//父列必须位于子列之前
//在这以后加一句 顾客和订单.Nested=true; 将会在以后的WriteXml()方法中,将子表记录嵌套在文件中,如将在输出XML中将购货明细表输出在购货记录下
//使用关系
foreach (DataRow custRow in thisDataSet.Tables["顾客"].Rows)
{
Console.WriteLine("顾客ID:"+custRow["顾客ID"]+" 名字:"+custRow["名字"]);
foreach (DataRow orderRow in custRow.GetChildRows(顾客和订单))
{
Console.WriteLine(" 订单:"+orderRow["订单内容"]);
}
}
________________________________________________________________________________________________________
SqlConnection thisConnection = new SqlConnection(@"Data Source=(local);Integrated Security=SSPI;Initial Catalog=数据库名");
thisConnection.Open();//打开数据库连接
SqlDataAdapter 适配器一 = new SqlDataAdapter("select * from 顾客", thisConnection);
DataSet thisDataSet = new DataSet();//数据集
适配器一.Fill(thisDataSet, "表名");//填充数据集
thisDataSet.Tables["表名"].Rows[0]["列名"]="更新";//在内存中更新数据
thisAdapter.Update(thisDataSet, "表名");//更新数据库
thisConnection.Close();//关闭数据库连接
********************************************************************************************************
ADO.net的主要对象元素:_______________________________________________________________________________________________________
1.添加记录 (添加行)
添加记录首先需要声明两个变量 DataTable ,DataRow
其中DataTable需要实例化到具体的数据集中的某个table
DataRow = DataTable.NewRow() 声明为Table的新Row
再对DataRow进行赋值,调用DataTable.Rows.Add(DataRow)即可
DataColumn[] keys = new DataColumn[1];
keys[0] = thisDataSet.Tables["表名"].Columns["列名"];
________________________________________________________________________________________________________
2.删除纪录
如下 DataTable.Rows[5].Delete();
推想:应该可以这样,首先申明一个变量 DataRow[] objRows 用来存储要删除的行
objRows = DataTable.Select("查询条件");
thisDataSet.Tables["表名"].PrimaryKey = keys;//设置主键,可以定义多个主键,无非就是keys[0]、key[1]、key[2]...多定义几个就可以了
DataRow findRow = thisDataSet.Tables["表名"].Rows.Find("列数据");//查找行,这种方法只能用于查找主键,也就是在表中惟一地标识行的值或值集合
if (findRow == null)
{
Console.WriteLine("未找到,将添加行");
DataRow thisRow = thisDataSet.Tables["表名"].NewRow();
thisRow["列名"] = "新数据";
thisDataSet.Tables["表名"].Rows.Add(thisRow);//添加行
}
else if (findRow != null)
{
Console.WriteLine("找到,将删除行");
findRow.Delete();
}
thisAdapter.Update(thisDataSet, "表名");//更新数据库
________________________________________________________________________________________________________
3.修改纪录 (编辑行)
首先声明一个变量 DataRow[] objRows用来存储要编辑的行
objRows = DataTable.Select("查询条件");
如果是一行,可以这样 objRows = DataTable.Rows[3];
再对其进行修改 如 objRows[0][FIELD1]="" objRows[0][FIELD2]=""
thisDataSet.Tables["表名"].Rows[0]["列名"] = "更新";//在内存中更新数据
thisAdapter.Update(thisDataSet, "表名");//更新数据库
实际上Delete()等方法并不执行删除等操作,它仅仅标记要删除的行,在Rows集合中的每一个DateRow对象都有RowState,它跟踪记录此行是被删除、添加、修改,还是不变,实际上在此中的操作全部在内存中进行,而Update()方法才真正更新数据库。Delete()方法将行的RowState设置为Deleted,然后Update()就在数据库中将在Rows集合中标记为Deleted的所有行删除。
Visual Studio.NET在线文档会提示您在执行Delete()方法之后调用DataSet的AcceptChanges()方法;但是,这仅能删除DataSet中的行,却不影响数据库中的行,因为Update()仅影响在Rows集合中找到的行,遗漏的行将被忽略掉。如果希望在数据库中删除行,则不要在调用Update()之前调用AcceptChanges()方法。
这个问题也适用于Remove()方法;仅当希望从DataSet的Rows集合中,而不是数据库中删除行时才调用它。
________________________________________________________________________________________________________
3.表查询
DataRow[] 权限清单Row = this.superCargoDataSet.Tables["权限清单"].Select("操作员ID=" + 操作员ID);
------------------------
OleDbCommand thisCommand=thisConnection.CreateCommand(); //
thisCommand.CommandText="Select * FROM 表名";
OleDbDataReader thisReader=thisCommand.ExecuteReader();
while(thisReader.Read())
{
Console.WriteLine("/t{0}/t{1}",thisReader["ID"],thisReader["TheName"]);
}
thisReader.Close();
/*--------------前提--------------*/
SqlDataAdapter thisAdapter = new SqlDataAdapter("select * from 表名", thisConnection); //适配器
SqlCommandBuilder thisBuilder = new SqlCommandBuilder(thisAdapter);//将命令构造器与适配器关联,用于自动生成SQL语句
DataSet thisDataSet = new DataSet();//数据集
thisAdapter.Fill(thisDataSet, "表名");//填充数据集
Console.WriteLine("输出数据:{0}", thisDataSet.Tables["表名"].Rows[0]["列名"]);//输出数据
________________________________________________________________________________________________________
5.创建表关系
SqlDataAdapter 适配器一 = new SqlDataAdapter("select * from 顾客", thisConnection);
SqlDataAdapter 适配器二 = new SqlDataAdapter("select * from 订单明细", thisConnection);
适配器一.Fill(thisDataSet, "顾客");//填充
适配器二.Fill(thisDataSet, "订单明细");//填充
//创建关系
DataRelation 关系 = thisDataSet.Relations.Add("顾客和订单", thisDataSet.Tables["顾客"].Columns["顾客ID"], thisDataSet.Tables["订单明细"].Columns["顾客ID"]);//父列必须位于子列之前
//在这以后加一句 顾客和订单.Nested=true; 将会在以后的WriteXml()方法中,将子表记录嵌套在文件中,如将在输出XML中将购货明细表输出在购货记录下
//使用关系
foreach (DataRow custRow in thisDataSet.Tables["顾客"].Rows)
{
Console.WriteLine("顾客ID:"+custRow["顾客ID"]+" 名字:"+custRow["名字"]);
foreach (DataRow orderRow in custRow.GetChildRows(顾客和订单))
{
Console.WriteLine(" 订单:"+orderRow["订单内容"]);
}
}