C#中SqlDataAdapter与DataSet的使…
2016-01-25 15:30
363 查看
C# SqlDataAdapter与DataSet的使用
SqlDataAdapter是 DataSet和 SQL Server之间的桥接器,。SqlDataAdapter通过对数据源使用适当的Transact-SQL语句映射Fill(它可填充DataSet中的数据以匹配数据源中的数据)和 Update(它可更改数据源中的数据以匹配
DataSet中的数据)来提供这一桥接。
SqlConnection conn = new
SqlConnection("server=(local);database=northwind;uid=sa;pwd=sasasa");
SqlDataAdapter
adapter = new SqlDataAdapter("select * from Customers",
conn);
Console.WriteLine("填充前:"+conn.State.ToString());
DataSet
ds = new DataSet();
adapter.Fill(ds,
"s");
Console.WriteLine("填充后:"
+ conn.State.ToString());
foreach
(DataRow dr in ds.Tables["s"].Rows)
{
Console.WriteLine(dr["CustomerID"]
+ "\t" + dr["CompanyName"]);
}
这个程序里面,SqlConnection并没有显式的打开或关闭,因为SqlDataAdapter自动完成了这个工作,数据授权对象会在需要的时候打开连接,在完成工作后关闭它,注意:SqlDataAdapter延续SqlConnection的状态,即:原来SqlConnection是打开的,则执行完后,仍是打开的,SqlConnection原来是关闭的,则执行完成后仍然是关闭的。上例中,输出的
SqlConnection的State均是Closed。
--------------------------------------------------------------------------------------------------------------
修改
SqlConnection conn = new
SqlConnection("server=(local);database=northwind;uid=sa;pwd=sasasa");
SqlDataAdapter
adapter = new SqlDataAdapter("select Companyname from customers",
conn);
SqlCommandBuilder
builder = new
SqlCommandBuilder(adapter);
DataSet
ds = new DataSet();
adapter.Fill(ds,"cus");
Console.WriteLine(ds.Tables["cus"].Rows[9]["Companyname"]);
ds.Tables["cus"].Rows[9]["Companyname"]
=
"aaaaaaaaaaaaaaaaaaaaa";//在这句执行以后,直接运行Console.WriteLine的话,发现已经增加了一行了,但是真正的查询数据库的时候发现并未增加,原因是:ds中的数据表现的是内存中的数据,而内存中的数据是对应数据库中的表的,任何对ds的修改都只是对内存数据进行修改,必须使用adapter.Update(ds,
"cus"),此句将内存数据更新至磁盘上数据库中的表
adapter.Update(ds,
"cus");//非常重要,必不可少
Console.WriteLine(ds.Tables["cus"].Rows[9]["Companyname"]);
有了SqlCommandBuilder,将SqlDataAdapter传递之后,自动生成SQL命令,并将其与传递进来的DataAdapter关联。
注意:此时在内存中的DataSet只有Companyname一列,此时如果想要进行如下操作,则会报错,ds.Tables["cus"].Rows[9]["CustomerID"]="sfdsa",原因是内存中的表没有CustomerID这一列,如果要进行此项修改,必须修改前面的Select语句:select
Companyname,CustomerID from
customers或者select * from
customers,但是后面一种占用较大内存。
----------------------------------------------------------------------------------------------------------
增加:
SqlConnection
conn = new
SqlConnection("server=(local);database=northwind;uid=sa;pwd=sasasa");
SqlDataAdapter
adapter = new SqlDataAdapter("select * from customers",
conn);
SqlCommandBuilder
builder = new SqlCommandBuilder(adapter);
DataSet
ds = new DataSet();
adapter.Fill(ds,
"cus");
Console.WriteLine(ds.Tables["cus"].Rows.Count);
DataRow
dr = ds.Tables["cus"].NewRow();
dr["customerid"]
= "edf";
dr["companyname"]
= "adsfas";
ds.Tables["cus"].Rows.Add(dr);
adapter.Update(ds,
"cus");
Console.WriteLine(ds.Tables["cus"].Rows.Count);
---------------------------------------------------------------------------------------------------------
查询指定的行:
SqlConnection conn = new
SqlConnection("server=(local);database=northwind;uid=sa;pwd=sasasa");
SqlDataAdapter
adapter = new SqlDataAdapter("select * from customers",
conn);
SqlCommandBuilder
builder = new SqlCommandBuilder(adapter);
DataSet
ds = new DataSet();
adapter.Fill(ds,
"cus");
Console.WriteLine(ds.Tables["cus"].Rows.Count);
DataColumn[]
dc = new DataColumn[1];
dc[0]
= ds.Tables["cus"].Columns["customerid"];
ds.Tables["cus"].PrimaryKey
= dc;//设置主键
DataRow
dr = ds.Tables["cus"].Rows.Find("edf1");//获取主键
if
(dr == null)
{
Console.WriteLine("没有被找到,需要被添加");
DataRow
addrow = ds.Tables["cus"].NewRow();
addrow["customerid"]
= "edf1";
addrow["companyname"]
= "fdsadsf";
ds.Tables["cus"].Rows.Add(addrow);
}
else
{
Console.WriteLine("已经被找到");
}
adapter.Update(ds,
"cus");
Console.WriteLine(ds.Tables["cus"].Rows.Count);
--------------------------------------------------------------------------------------------------------
删除:
SqlConnection conn = new
SqlConnection("server=(local);database=northwind;uid=sa;pwd=sasasa");
SqlDataAdapter
adapter = new SqlDataAdapter("select * from customers",
conn);
SqlCommandBuilder
builder = new SqlCommandBuilder(adapter);
DataSet
ds = new DataSet();
adapter.Fill(ds,
"cus");
DataColumn[]
key = new DataColumn[1];
key[0]
= ds.Tables["cus"].Columns["customerid"];
ds.Tables["cus"].PrimaryKey
= key;
DataRow
dr = ds.Tables["cus"].Rows.Find("edf1");
if
(dr == null)
{
Console.WriteLine("没有被找到,需要被添加");
}
else
{
Console.WriteLine("已经被找到,需要被删除");
dr.Delete();//此处紧紧标识要被删除的行,真正执行删除语句的是下面的adapter.update(ds,"cus");此处的删除仅对内存中的数据进行修改
}
adapter.Update(ds,
"cus");
如果只需要执行SQL语句或SP,就没必要用到DataAdapter
,直接用SqlCommand的Execute系列方法就可以了。sqlDataadapter的作用是实现Dataset和DB之间的桥梁:比如将对DataSet的修改更新到数据库。
SqlDataAdapter的UpdateCommand的执行机制是:当调用SqlDataAdapter.Update()时,检查DataSet中的所有行,然后对每一个修改过的Row执行SqlDataAdapter.UpdateCommand
,也就是说如果未修改DataSet中的数据,SqlDataAdapter.UpdateCommand不会执行。
相关文章推荐
- C#中sqlcommand的用法
- SQLServer之存储过程
- 转:SqlBulkCopy批量复制数据
- 经典SQL语句大全
- Redis学习笔记3--Redis键值设计
- [MySQL]索引
- tomcat + redis 实现session共享
- SQL--工作中遇到的
- sql基本语句
- Redis学习笔记2--Redis数据类型及相关命令
- 高性能MySQL 第七章
- ERROR! MySQL server PID file could not be found!的解决方法
- knockout+MVC+webapi+sqlserver完成增删查改
- FMDB的使用
- mysql-proxy实现读写分离
- mysql-proxy实现读写分离
- Mysql命令大全
- sql点
- C#连接数据库
- sql tips