ADO.NET基础

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);
Fill() 方法的分页。(不是“传说中的分页”)
SqlDataAdapter DataSet 和数据库之间沟通的桥梁。数据集 DataSet 包含若干表 DataTable DataTable 包含若干行 DataRow
foreach (DataRow row indataset.Tables[0].Rows)
row["Name"];  }
注: 可以使用不同的 SqlDataAdapter 来更新 DataTable , 如果要是用 SqlCommandBuilder 自动生成的 Command 对象的话,必须提供 selectCommand , 但是可以不用 Fill
通过 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/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值