DataSet(ado.net断开式数据访问)
DataSet
是数据的集合、临时数据库、内存数据库。(
B/S
程序与
C/S
程序对
DataSet
的不同处理方式)
每次读取数据都创建连接、执行
Command
得到
SqlDataReader
太麻烦,让我们封装一个方法吧!
SqlDataReader
是连接相关的,
SqlDataReader
中的查询结果并不是放到程序中的,而是放在数据库服务器中,
SqlDataReader
只是相当于放了一个指针(游标),只能读取当前游标指向的行,一旦连接断开就不能再读取。这样做的好处就是无论查询结果有多少条,对程序占用的内存都几乎没有影响。
SqlDataReader
为速度而生,只读、只进,功能有限。
ADO.Net
中提供了
数据集
的机制,将查询结果填充到本地内存中,这样连接断开、服务器断开都不影响数据的读取。
DataSet
对于多层应用程序之间传递数据。(现在大都用
List<T>
)
DataSet dataset = new DataSet()
;
SqlDataAdapter adapter = new SqlDataAdapter(cmd) ;
adapter.Fill(dataset);
SqlDataAdapter adapter = new SqlDataAdapter(cmd) ;
adapter.Fill(dataset);
Fill()
方法的分页。(不是“传说中的分页”)
SqlDataAdapter
是
DataSet
和数据库之间沟通的桥梁。数据集
DataSet
包含若干表
DataTable
,
DataTable
包含若干行
DataRow
。
foreach (DataRow row indataset.Tables[0].Rows)
{ row["Name"]; }
注:
可以使用不同的
SqlDataAdapter
来更新
DataTable
,
如果要是用
SqlCommandBuilder
自动生成的
Command
对象的话,必须提供
selectCommand
,
但是可以不用
Fill
foreach (DataRow row indataset.Tables[0].Rows)
{ row["Name"]; }
通过
DataReader
填充
DataSet
。
通过
DataAdapter
填充
DataSet,Fill
()
也可以分页(并不高效,会在服务器端都把数据查询出来,然后用
DataReader
跳过前面的数据,只取后面要的数据,真正的分页应该是在数据库中就只查询出当前页的数据。)
断开式数据访问,操作完成以后调用
Update()
方法。(*)
通过
DataAdapter
的
Fill
方法填充
DataSet
中的表。
创建
DataAdapter
的时候,只需指定连接字符串和查询语句,会自动生成
SelectCommand
.
通过
SqlCommandBuilder
自动创建
InsertCommand
、
DeleteCommand
、
UpdateCommand
,然后就可以调用
adapter
的
Update()
方法将
DataTable
中的数据更新到数据库中。
通过
SqlCommandBuilder
来创建
Command
对象的时候,必须保证在创建
adapter
的时候的
select
语句中包含对主键的查询
也可以自己指定
Command,
我们对
DataTable
的操作,只是为
Rows
集合中没行的
RowState
状态做了标记,并没有将该行从
Rows
集合中真的删除。
SQLHelper
封装一个
SQLHelper
类方便使用,提供
ExecuteDataTable
(string
sql,params
SqlParameter
[] parameters)
、
ExecuteNonQuery
(string
sql,params
SqlParameter
[] parameters)
、
ExecuteScalar
(string
sql,params
SqlParameter
[] parameters)
等方法。网上有微软提供的最全的
SQLHelper
类,是
Enterprise Library
中的一部分。
//
ExecuteScalar
<T>()
ExecuteReader
(返回
DataReader
)、
ExecuteList
<
MyT
>()//
返回
List
集合(更高一层次的封装)。用一下泛型吧。
sqlconnection
在程序中一直保持它
open
可以吗?对于数据库来说,连接是非常宝贵的资源,一定要用完了就
close
、
dispose
。
【Close
以后就可以放到“池”中了,其他链接就可以再次使用了。
】
注意事项
:通过执行
ExecuteReader
()
方法获取输出参数的时候需要将
reader.Close
()
以后才能获取。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;
using System.Data.SqlClient;
using System.Data;
namespace _06通过SqlHelper实现增删改查
{
public static class SqlHelper
{
//获取配置文件中的连接字符串
private static readonly string constr = ConfigurationManager.ConnectionStrings["sql"].ConnectionString;
/// <summary>
/// 执行insert、delete、update的方法
/// </summary>
/// <param name="sql"></param>
/// <param name="pms"></param>
/// <returns></returns>
public static int ExecuteNonQuery(string sql, params SqlParameter[] pms)
{
using (SqlConnection con = new SqlConnection(constr))
{
using (SqlCommand cmd = new SqlCommand(sql, con))
{
//如果pms为null,则直接调用cmd.Parameters.AddRange(pms)会报错。
if (pms != null)
{
cmd.Parameters.AddRange(pms);
}
con.Open();
return cmd.ExecuteNonQuery();
}
}
}
/// <summary>
/// 执行sql语句,返回单个值。
/// </summary>
/// <param name="sql">要执行的sql语句</param>
/// <param name="pms">sql语句中的参数</param>
/// <returns></returns>
public static object ExecuteScalar(string sql, params SqlParameter[] pms)
{
using (SqlConnection con = new SqlConnection(constr))
{
using (SqlCommand cmd = new SqlCommand(sql, con))
{
//如果pms为null,则直接调用cmd.Parameters.AddRange(pms)会报错。
if (pms != null)
{
cmd.Parameters.AddRange(pms);
}
con.Open();
return cmd.ExecuteScalar();
}
}
}
/// <summary>
/// 执行sql语句返回一个DataReader
/// 当返回DataReader的时候,注意:
/// 1.Connection不能关闭
/// 2.DataReader不能关闭
/// 3.command对象执行ExecuteReader()的时候需要传递一个参数CommandBehavior.CloseConnection
/// </summary>
/// <param name="sql"></param>
/// <param name="pms"></param>
/// <returns></returns> <pre class="csharp" name="code" code_snippet_id="75290" snippet_file_name="blog_20131120_1_5181403"> public static SqlDataReader ExecuteReader(string sql, params SqlParameter[] pms)
{
SqlConnection con = new SqlConnection(constr);
try
{
using (SqlCommand cmd = new SqlCommand(sql, con))
{
if (pms != null)
{
cmd.Parameters.AddRange(pms);
}
con.Open();
//当调用ExecuteReader()方法的时候,如果传递一个CommandBehavior.CloseConnection参数,则表示将来当用户关闭reader的时候,系统会自动将Connection也关闭掉。
SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
return reader;
}
}
catch
{
con.Close();
con.Dispose();
throw;
}
}
<pre class="csharp" name="code" code_snippet_id="75290" snippet_file_name="blog_20131120_1_5181403"> /// <summary>
/// 封装一个返回DataTable的方法。
/// </summary>
/// <param name="sql"></param>
/// <param name="pms"></param>
/// <returns></returns>
public static DataTable ExecuteDataTable(string sql, params SqlParameter[] pms)
{
SqlDataAdapter sqlAdapter = new SqlDataAdapter(sql, constr);
if (pms != null)
{
sqlAdapter.SelectCommand.Parameters.AddRange(pms);
}
DataTable dt = new DataTable();
sqlAdapter.Fill(dt);
return dt;
}
微软企业库:EnterpriseLibrary http://www.cnblogs.com/kyo-yo/tag/%E5%BE%AE%E8%BD%AF%E4%BC%81%E4%B8%9A%E5%BA%93/