ADO.NET的学习
ADO.NET的几个对象
- Connection:管理数据库的连接
- Command:对数据库执行命令
- DataReader:数据流读取器,返回的数据都是快速的且只是“向前”的数据流。无法实例化,只能通过Command创建
- DateSet:缓存数据,对数据进行操作
- DataAdapter:数据适配器,数据库和DataSet的桥梁
ADO.NET命名空间
注:图取自网络

常见的是SQL数据源
引用命名空间:
using System.Data.SqlClient;
一、Connection类
连接数据库,Connection会被Command对象使用,这样就能够知道是在哪个数据源上面执行命令。
Connection有两个重要属性:ConnectionString和State,连接字符串和连接状态
两个重要方法:Open()和Close(),用来打开和关闭数据库连接
using (SqlConnection conn = newSqlConnection("DataSource(local);Integrated Security=SSPI;Initial Catalog=Northwind"))
{
    conn.Open();
}
conn.State.ToString():当前连接状态,返回值为Closed 或Open
二、Command对象
Command有两个重要属性:CommandType, 指明CommandText 是SQL语句,存储过程还是表操作,默认值为CommandType.Text;
两个值:(1)CommandType.StoredProcedure,以存储过程方式执行
(2)CommandType.Text SQL语句执行
(3)CommandType.TableDirect,直接处理某个表
CommandText,值为SQL语句或是存储过程名称,默认为SQL语句
创建命令对象的两种方式
using (SqlConnection conn = newSqlConnection("DataSource(local);Integrated Security=SSPI;Initial Catalog=Northwind"))
{
    conn.Open();
    SqlCommand SqlCommand= conn .CreateCommand(); //这种方式比较好
    SqlCommand.CommandText="select * from Student";
    //或是实例化一个对象
    //SqlCommand sqlcmd=new SqlCommand();
    //sqlcmd.CommandText ="select * from student";
    //sqlcmd.Connection=conn;
}
三个重要方法:
- ExecuteReader():返回DataReader对象,DataReader对象说明详见下文
using (SqlConnection conn = newSqlConnection("DataSource(local);Integrated Security=SSPI;Initial Catalog=Northwind"))
{
     SqlCommand command = conn.CreateCommand();
   command.CommandText = "Select * form Student";
   //CommandBehavior.CloseConnetion 关闭dataReader时,同时也把与它相关联的Connection连接也一起关闭
   using (SqlDataReader dr = command.ExecuteReader(CommandBehavior.CloseConnection))
   {
    while (dr.Read())
     {
      //开始读取数据了,接下来你想怎么样就怎么样了
      string str = dr.GetSqlString().ToString();
    }
  }
}
using (SqlConnection conn = newSqlConnection("DataSource(local);Integrated Security=SSPI;Initial Catalog=Northwind"))
{
    SqlConnection conn = new SqlConnection(str);        //创建连接
    SqlCommand cmd = conn.CreateCommand();              //创建命令
    cmd.CommandText = "SELECT * FROM Person";           //设置操作语句
    conn.Open();                                        //打开连接
    //SqlDataReader读取数据
    using (SqlDataReader reader = cmd.ExecuteReader())
    {
      while (reader.Read())
        {
               Console.WriteLine(reader[0] + ":" + reader[1]);  //输出当前行的第一列,第二列数据
        }
    }
    cmd.CommandText = "SELECT Count(*) FROM Person";
    object obj = cmd.ExecuteScalar();                   //仅查询第一行第一列
    Console.WriteLine((int)obj);
    conn.Close();                                       //关闭连接
}
- ExecuteScalar():返回数据第一行第一列的值,如Count(*),如果没有数据,则返回NULL
- ExecuteNonQuery():返回增、删、改的影响行数
using (SqlConnection conn = newSqlConnection("DataSource(local);Integrated Security=SSPI;Initial Catalog=Northwind"))
{
    SqlCommand cmd = conn.CreateCommand();              //创建命令
    cmd.CommandText = "Update Person Set PersonName = 'Ado.net修改' WHERE PersonId = @Id";    //设置操作语句
    cmd.Parameters.Add("@Id", SqlDbType.Int);           //添加参数,说明类型
    cmd.Parameters["@Id"].Value = ;                    //设置参数值
    conn.Open();                                        //打开连接
    int i = cmd.ExecuteNonQuery();                      //执行命令,ExecuteNonQuery由名称看出,只能用于非查询语句
    conn.Close();                                       //关闭连接
    Console.WriteLine(i);                               //输出影响行数
  //直接使用参数集合添加你需要的参数,推荐这种写法
  //SqlParameter[] parameters = new SqlParameter[]
  //{
    //new SqlParameter("@name",SqlDbType.NVarChar,100){Value = "yang"},
    //new SqlParameter("@age",SqlDbType.Int,2){Value = 888},
    //new SqlParameter("@address",SqlDbType.NVarChar,20){Value = "Jiang Su"}, 
  //};
  //ommand.Parameters.AddRange(parameters);
}
三、DataReader类
常见方法:
(1)Read()返回Bool,是否还有下一行,并移到结果集的下一行
(2)GetOrdinal(string 列名),返回序列号,通过列名来获取当前列的索引号,这样如果下次你列名顺序发生变化也没有关系
(3)GetName(int 序列号): 获取列名,参数为指定列名的序列号,返回string
int nameId= dr.GetOrdinal("name");
string columnName = dr.GetName(nameId);
//知道列名获取值
using (SqlDataReader reader = cmd.ExecuteReader())
{
   while (reader.Read())
     {
        Console.WriteLine(reader.GetString(sdr.GetOrdinal("name"))); 
}
}
(4)NextResult(),当查询为批处理查询时,使用这个方法去读取下一个结果集,返回值为Bool,如果存在多个结果集,则为 true;否则为 false
using (SqlConnection conn = new SqlConnection(strConnString))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand())
{
cmd.Connection = conn;
// 利用分号「;」串连多句 SQL 语句,之后再一次丢进数据库去执行,达成「批次」读取或更新
// 数据库的目的。此技巧亦适用于 INSERT、UPDATE、DELETE 的「批次」执行。
cmd.CommandText = "SELECT 字段1,字段2 FROM 数据表1 ; SELECT * FROM 数据表2";
using (SqlDataReader dr = cmd.ExecuteReader())
{
while(dr.Read())
{
this.DropDownList1.Items.Add(dr.GetSqlString().ToString() + dr.GetSqlInt32().ToString());
}
dr.NextResult();
while(dr.Read())
{
this.DropDownList2.Items.Add(dr.GetString() + dr.GetInt32());
}
}
}
}
四、SqlDataAdapter 数据适配器
有四个重载
无参
SqlDataAdapter(SqlCommand) // 执行命令对象实例
SqlDataAdapter(String, SqlConnection) //只能指定查询语句 ②连接对象实例
SqlDataAdapter(String, ConnectionString)// 用 SelectCommand 和一个连接字符串初始化 SqlDataAdapter 类的一个新实例
一个重要方法:Fill(),数据填充至DataSet
using (SqlConnection conn = newSqlConnection("DataSource(local);Integrated Security=SSPI;Initial Catalog=Northwind"))
{
  DataSet dataSet = new DataSet();
    conn.Open();
    SqlCommand command = conn.CreateCommand();
    command.CommandText = "select name,age,address from MyInformation";
    SqlDataAdapter dataAdapter = new SqlDataAdapter(command);
    dataAdapter.Fill(dataSet);  //填充数据
}
对数据进行增加操作
using (SqlConnection conn = newSqlConnection("DataSource(local);Integrated Security=SSPI;Initial Catalog=Northwind"))
{
    using (SqlConnection conn = new SqlConnection(ConnectionString()))
 {
     conn.Open();
     //构建查询语句,也可以指定SqlCommand,其中变换的方法有很多
     SqlDataAdapter da = new SqlDataAdapter("select LastName,FirstName from dbo.Employees", conn);
     DataSet ds = new DataSet();
     da.Fill(ds);
     //这句话很重要,它会把你在DataSet增加的数据转化为SQL语句用来更新数据库
     SqlCommandBuilder cmdBuilder = new SqlCommandBuilder(da);
     //添加行,实例化一个行对象,注意是用NewRow来创建行
     DataRow row = ds.Tables[].NewRow();
     row[] = "Yang";
     row[] = "鬼头";
     ds.Tables[].Rows.Add(row);  //添加到表中
     da.Update(ds);             //把DataSet中表和数据库进行对比,更新
 }
}
更新操作
using (SqlConnection conn = newSqlConnection("DataSource(local);Integrated Security=SSPI;Initial Catalog=Northwind"))
{
    using (SqlConnection conn = new SqlConnection(""))
{
    SqlDataAdapter da = new SqlDataAdapter("SQL语句或你自己定义的命令对象", conn);
    DataSet ds = new DataSet();
    da.Fill(ds);
    //很重要的一句话
    SqlCommandBuilder cmdBuilder = new SqlCommandBuilder(da);
    ds.Tables[].Rows[][] = ""; //修改数据
    da.Update(ds);
    //调用Update方法其中隐式的调用了AcceptChanges方法,更新数据集中的数据
    //如果你继续使用这个数据集而没有调用这个方法,在后面的使用会出现异常
    ds.AcceptChanges();  //这句话可以不写的
}
}
最后
对于一些增删改,都应加上事务,防止出错能回滚数据
using (SqlConnection conn = newSqlConnection("DataSource(local);Integrated Security=SSPI;Initial Catalog=Northwind"))
{    //事务
     SqlTransaction myTran = con.BeginTransaction();
    tyr
   {
        //正常代码执行
         ..............
        //提交事务
         myTran.Commit();
    }
   catch(Exception e)
  {
       //出错,事务回滚
       myTran.Rollback();
   }
}
ADO.NET的学习的更多相关文章
- ado.net EF学习系列----深入理解查询延迟加载技术(转载)
		ado.net EF是微软的一个ORM框架,使用过EF的同学都知道EF有一个延迟加载的技术. 如果你是一个老鸟,你可能了解一些,如果下面的学习过程中哪些方面讲解的不对,欢迎批评指教.如果一个菜鸟,那我 ... 
- ADO.net基础学习总结(二)
		将连接字符串放入配置文件中 1.添加一个“应用程序配置文件:app.config” <?xml version="1.0" encoding="utf-8" ... 
- ADO.net基础学习总结
		ADO.net是一门.net连接.操作数据库的技术 释放资源:凡是实现了idisposable借口的类都需要用using来释放资源 using() { } 连接数据库 //创建数据库连接: usi ... 
- ADO.NET初学习
		①System.Data → DataTable,DataSet,DataRow,DataColumn,DataRelation,Constraint,DataColumnMapping,DataT ... 
- ADO。net学习笔记
		来源于网络 1. SqlConnection(DBConnection) 建立程序与数据库的链接 链接字符串有两种形式: //使用Windows验证 SSPI(安全支持提供程序接口) ... 
- ADO.NET 基础学习笔记1
		1. ODBC.OLEDB.ADO.ADO.NET之间的关系 ODBC: 开放数据库互连(ODBC)是MICROSOFT提出的数据库访问接口标准.ODBC(Open DatabaseConnectiv ... 
- ADO.NET知识学习总结
		1. 概述 使用的命名空间: System.Data.SqlClient 连接字符串 服务器/数据库实例+数据库名称+安全信息+用户名+密码 可参考http://www.connectio ... 
- ADO.NET详细学习笔记《一》
		目录 ADO.NET和ADO的区别 ADO.NET的五大核心对象 Connection对象 Command对象 DataAdapter对象,DataSet对象 DataReader对象 [1]ADO. ... 
- ADO.NET基础学习 二(Command对象)
		②command对象用来操作数据库.(三个重要的方法:ExecuteNonQuery(),ExecuteReader(),ExecuteScalar()) ⑴以update(改数据)为例,用到Exec ... 
随机推荐
- Spring-mybatis没有了XXXmapper.java和Dao的实现类还有Service的实现类
			对于刚学过框架的同学可能知道,mybatis有两种主要的配置文件: SqlMapConfig.xml(mybatis全局配置文件,名称不固定,用来配置运行环境(数据源.事务) XXXmapper.xm ... 
- NLPIR大数据挖掘平台新增敏感词扫描功能
			在网络日益发达的现在,也伴随着有益信息与造成不稳定因素的信息也随之日益泛滥,为了网民的思想健康,也为了社会的和谐,在许多对外公共场合下,有些内容是要经过审查才能显示的.在网络审查初期,都是通过人工审核 ... 
- [补档]Password
			Password 题目 Rivest是密码学专家.近日他正在研究一种数列E = {E[1],E[2],--,E[n]},且E[1] = E[2] = p(p为一个质数),E[i] = E[i-2]×E ... 
- 26. leetcode 350. Intersection of Two Arrays II
			350. Intersection of Two Arrays II Given two arrays, write a function to compute their intersection. ... 
- opencv3+版本感觉还是不稳定啊
			opencv3+版本感觉还是不稳定啊,还是安装opencv2的版本比较好.特征匹配需要下载额外的库,但是camke的时候就是有错误....也是醉了,折磨的我死去活来的两三天了. 现在是opencv3. ... 
- iOS 折线图实现
			图表绘制的过程实际上是坐标位置的计算过程,至于画线只要有了position,通过CAShapeLayer+BezierPath很快就可以画出来,这里提供一个绘制折线的demo,贵在思路,有需要的可以参 ... 
- 原创:使用脚本获取本机IP地址
			接来下又到了老葵花哥哥开课时间了 今天讲的有些简单 可以是涂鸦之做 也可以是无聊的发呆的杰作 我想取IP地址在大家生活中很常用 今天就给大家介绍我的六种使用脚本取IP地址的方法 很多人想问我 为什么是 ... 
- dll的两种加载方式(pend)+ delayload
			看过关于动态库的调用例子,于是决定动手做一做:dll的对外接口声明头文件,Mydll.h: //Mydll.h #include <stdio.h> #include <stdlib ... 
- MATLAB中绘制图形的时候,坐标和标题倒置
			1.如上图所示,直方图的坐标轴以及标题文字都颠倒了 原因: 在MATLAB显示的subplot函数中,图像与直方图这些不属于一类,所以在显示的时候会出现这种情况 解决办法:1>将图像与直方图分开 ... 
- ubuntu下apache2-php-mysql的环境配置
			基本的支持环境.暂时还不应用zend优化,因此这里就不涉及到zend optimizer的安装了.其实在ubuntu系统中中安装远比在windows系统中设置更为容易,而且在终端下设置更省事. 1.安 ... 
