什么是ADO.NET

ADO.NET就是一组类库,这组类库可以让我们通过程序的方式访问数据库,就像System.IO下的类用类操作文件一样, System.Data.这组类是用来操作数据库(不光是MSSql Server),它提供了统一的编程接口让操作其它数据库(Access、Oracle等)的方式和操作MSSql Server一致。

ADO.NET中的五个主要对象

一、Connection

Connection:主要是开启程序和数据库之间的连接。没有利用连接对象将数据库打开,是无法从数据库中取得数据的。Close和Dispose的区别,Close以后还可以Open,Dispose以后则不能再用。

二、Command

Command:主要可以用来对数据库发出一些指令,例如可以对数据库下达查询、新增、修改、删除数据等指令,以及调用存在数据库中的存储过程等。这个对象是架构在Connection 对象上,也就是Command 对象是透过连接到数据源。

三、DataAdapter

DataAdapter:主要是在数据源以及DataSet 之间执行数据传输的工作,它可以透过Command 对象下达命令后,并将取得的数据放入DataSet 对象中。这个对象是架构在Command对象上,并提供了许多配合DataSet 使用的功能。

四、DataSet

DataSet:这个对象可以视为一个暂存区(Cache),可以把从数据库中所查询到的数据保留起来,甚至可以将整个数据库显示出来,DataSet是放在内存中的。DataSet 的能力不只是可以储存多个Table 而已,还可以透过DataAdapter对象取得一些例如主键等的数据表结构,并可以记录数据表间的关联。DataSet 对象可以说是ADO.NET 中重量级的对象,这个对象架构在DataAdapter对象上,本身不具备和数据源沟通的能力;也就是说我们是将DataAdapter对象当做DataSet 对象以及数据源间传输数据的桥梁。DataSet包含若干DataTable、DataTableTable包含若干DataRow。

五、DataReader

DataReader:当我们只需要循序的读取数据而不需要其它操作时,可以使用DataReader 对象。DataReader对象只是一次一笔向下循序的读取数据源中的数据,这些数据是存在数据库服务器中的,而不是一次性加载到程序的内存中的,只能(通过游标)读取当前行的数据,而且这些数据是只读的,并不允许作其它的操作。因为DataReader 在读取数据的时候限制了每次只读取一笔,而且只能只读,所以使用起来不但节省资源而且效率很好。使用DataReader 对象除了效率较好之外,因为不用把数据全部传回,故可以降低网络的负载。

总结

ADO.NET 使用Connection 对象来连接数据库,使用Command 或DataAdapter对象来执行SQL语句,并将执行的结果返回给DataReader 或 DataAdapter ,然后再使用取得的DataReader 或DataAdapter 对象操作数据结果。

一些栗子:

ADO.NET入门——ExecuteNonQuery

class Program
{
static void Main(string[] args)
{
//链接字符串
const string conStr = "Data Source=.;Initial Catalog=ADO_NET_Simple;Integrated Security=True";
//连接通道
SqlConnection conn = new SqlConnection(conStr);
//打开链接
conn.Open();
//命令对象
SqlCommand comm = new SqlCommand();
//指定链接通道
comm.Connection = conn;
//即将执行的sql命令
comm.CommandText = "update Students set StudentName=StudentName";
//提交命令到数据库
//ExecuteNonQuery() 执行对数据库的增删改,返回受影响的行数,
//适合:insert、delete、update(对于其他语句返回-1)
int result = comm.ExecuteNonQuery();
//关闭链接
conn.Close();
Console.WriteLine("({0} 行受影响)",result);
Console.ReadKey();
}
}

ADO.NET入门——ExecuteScalar

class Program
{
static void Main(string[] args)
{
//链接字符串
const string conStr = "Data Source=.;Initial Catalog=ADO_NET_Simple;Integrated Security=True";
//连接通道
SqlConnection conn = new SqlConnection(conStr);
//打开链接
conn.Open();
//命令对象
SqlCommand comm = new SqlCommand();
//指定链接通道
comm.Connection = conn;
//即将执行的sql命令
comm.CommandText = "select count(*) from Students";
//提交命令到数据库
//ExecuteScalar() 执行查询,返回结果集的首行首列
object result = comm.ExecuteScalar();
//关闭链接
conn.Close();
Console.WriteLine("总共有{0}条数据", result);
Console.ReadKey();
}
}

ADO.NET入门——ExecuteReader

public partial class Form1 : Form
{
const string ConStr = "Data Source=.;Initial Catalog=ADO_NET_Simple;Integrated Security=True";
public Form1()
{
InitializeComponent();
} /// <summary>
/// 使用ExecuteReader读取一行数据
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnOnce_Click(object sender, EventArgs e)
{
SqlDataReader dr = ExecuteReader("select top 1 * from Students");
Student student = ConvertSqlDataReaderToStudent(dr);
//为了让数据能够在DataGridView里显示,
List<Student> list = new List<Student>()
{
student
};
dgvStudentList.DataSource = list;
} /// <summary>
/// 使用ExecuteReader读取多行行数据
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnMore_Click(object sender, EventArgs e)
{
SqlDataReader dr = ExecuteReader("select * from Students");
List<Student> list = ConvertSqlDataReaderToStudents(dr);
dgvStudentList.DataSource = list;
} /// <summary>
/// 获取 SqlDataReader
/// </summary>
/// <param name="cmdText"></param>
/// <returns></returns>
private SqlDataReader ExecuteReader(string cmdText)
{
//连接通道
SqlConnection conn = new SqlConnection(ConStr);
//打开链接
if (conn.State != ConnectionState.Open)
conn.Open();
//命令对象
SqlCommand comm = new SqlCommand();
//指定链接通道
comm.Connection = conn;
//即将执行的sql命令
comm.CommandText = cmdText;
//提交命令到数据库
//ExecuteReader(CommandBehavior.CloseConnection),
//在执行该命令时,如果关闭关联的 DataReader 对象,则关联的 Connection 对象也将关闭
SqlDataReader dr = comm.ExecuteReader(CommandBehavior.CloseConnection);
return dr;
} /// <summary>
/// 将 SqlDataReader 对象转换为 Student对象
/// </summary>
/// <param name="dr"></param>
/// <returns></returns>
private Student ConvertSqlDataReaderToStudent(SqlDataReader dr)
{
if (!dr.Read()) return null;
Student student = new Student
{
StudentId = (int)dr["StudentId"],
StudentName = dr["StudentName"].ToString(),
StudentGender = (bool)dr["StudentGender"],
StudentAge = (int)dr["StudentAge"],
GradeId = (int)dr["GradeId"]
};
return student;
} /// <summary>
/// 将 SqlDataReader 对象转换为 Student列表
/// </summary>
/// <param name="dr"></param>
/// <returns></returns>
private List<Student> ConvertSqlDataReaderToStudents(SqlDataReader dr)
{
List<Student> list = new List<Student>();
while (dr.Read())
{
Student student = new Student
{
StudentId = (int)dr["StudentId"],
StudentName = dr["StudentName"].ToString(),
StudentGender = (bool)dr["StudentGender"],
StudentAge = (int)dr["StudentAge"],
GradeId = (int)dr["GradeId"]
};
list.Add(student);
}
return list;
}
} /// <summary>
/// 学生实体类
/// </summary>
public class Student
{
#region Model /// <summary>
/// 主键
/// </summary>
public int StudentId { get; set; } /// <summary>
/// 姓名
/// </summary>
public string StudentName { get; set; } /// <summary>
/// 性别 true:男; false:女
/// </summary>
public bool StudentGender { get; set; } /// <summary>
/// 年龄
/// </summary>
public int StudentAge { get; set; } /// <summary>
/// 所属班级主键
/// </summary>
public int GradeId { get; set; } #endregion Model
}

ADO.NET入门——DataAdapter

public partial class Form1 : Form
{
const string ConStr = "Data Source=.;Initial Catalog=ADO_NET_Simple;Integrated Security=True";
public Form1()
{
InitializeComponent();
} private void button1_Click(object sender, EventArgs e)
{
DataTable dt = ExecuteDataTable("select * from Students");
dgvStudentList.DataSource = dt;
} /// <summary>
/// 获取 DataTable
/// </summary>
/// <param name="cmdText"></param>
/// <returns></returns>
private DataTable ExecuteDataTable(string cmdText)
{
//实例化一个 SqlDataAdapter
SqlDataAdapter da = new SqlDataAdapter(cmdText, ConStr);
//实例化一个 DataTable
DataTable dt = new DataTable();
//将数据填充到 dt
da.Fill(dt);
return dt;
}
}

ADO.NET入门——Parameters

public partial class Form1 : Form
{
const string ConStr = "Data Source=.;Initial Catalog=ADO_NET_Simple;Integrated Security=True";
public Form1()
{
InitializeComponent();
} /// <summary>
/// 绑定数据到 datagridview
/// </summary>
private void BindData()
{
//查询语句
string sql = "select * from Students";
//标记是否有 where关键字
bool hasWhere = false;
List<SqlParameter> parameters=new List<SqlParameter>();
if (txtName.Text.Trim()!="")
{
sql += " where StudentName like @name";
hasWhere = true;
parameters.Add(new SqlParameter("name", string.Format("%{0}%", txtName.Text.Trim())));
} if (nudAge.Text.Trim()!="")
{
if (!hasWhere)
{
sql += " where StudentAge = @age";
}
else
{
sql += " and StudentAge = @age";
}
parameters.Add(new SqlParameter("age", nudAge.Text.Trim()));
} DataTable dt = ExecuteDataTable(sql, parameters.ToArray()); dgvStudentList.DataSource = dt;
} /// <summary>
/// 获取 DataTable
/// </summary>
/// <param name="cmdText"></param>
/// <param name="parameters">qlParameters 对象</param>
/// <returns></returns>
private DataTable ExecuteDataTable(string cmdText,params SqlParameter[] parameters)
{
//实例化一个 SqlDataAdapter
SqlDataAdapter da = new SqlDataAdapter(cmdText, ConStr);
//设置参数
da.SelectCommand.Parameters.AddRange(parameters);
//实例化一个 DataTable
DataTable dt = new DataTable();
//将数据填充到 dt
da.Fill(dt);
return dt;
} private void btnParameters_Click(object sender, EventArgs e)
{
BindData();
}
}

ADO.NET入门——Transaction

public partial class Form1 : Form
{
const string ConStr = "Data Source=.;Initial Catalog=ADO_NET_Simple;Integrated Security=True";
public Form1()
{
InitializeComponent();
} private void btnSubmit_Click(object sender, EventArgs e)
{
using (SqlConnection conn=new SqlConnection(ConStr))
{
conn.Open();
//开启事务
SqlTransaction transaction = conn.BeginTransaction(); try
{
string sql = "update Banks set Money+=1000 where id=3";
//用SqlTransaction初始化SqlCommand
SqlCommand comm = new SqlCommand(sql, conn,transaction);
comm.ExecuteNonQuery();
sql = "update Banks set Money-=1000 where id=2";
comm.CommandText = sql;
comm.ExecuteNonQuery();
transaction.Commit();
MessageBox.Show("转账成功");
}
catch (Exception ex)
{
transaction.Rollback();
MessageBox.Show("转账失败\n" + ex.Message);
}
}
}
}

ADO.NET入门——StoredProcedure

public partial class Form1 : Form
{
const string ConStr = "Data Source=.;Initial Catalog=ADO_NET_Simple;Integrated Security=True";
public Form1()
{
InitializeComponent();
} private void Form1_Load(object sender, EventArgs e)
{ } private void btnNoParameter_Click(object sender, EventArgs e)
{
SqlDataAdapter da = new SqlDataAdapter("usp_selectStudents", ConStr);
//用存储过程来解释命令字符串
da.SelectCommand.CommandType = CommandType.StoredProcedure;
DataTable dt = new DataTable();
da.Fill(dt);
dgvStudents.DataSource = dt;
lblOutPut.Text = "";
lblResult.Text = "";
} private void btnInput_Click(object sender, EventArgs e)
{
SqlDataAdapter da = new SqlDataAdapter("usp_selectStudents", ConStr);
//用存储过程来解释命令字符串
da.SelectCommand.CommandType = CommandType.StoredProcedure;
//设置参数,和参数化查询一致
da.SelectCommand.Parameters.Add(new SqlParameter("name", "周"));
DataTable dt = new DataTable();
da.Fill(dt);
dgvStudents.DataSource = dt;
lblOutPut.Text = "";
lblResult.Text = "";
} private void btnOutPut_Click(object sender, EventArgs e)
{
SqlDataAdapter da = new SqlDataAdapter("usp_selectStudents", ConStr);
//用存储过程来解释命令字符串
da.SelectCommand.CommandType = CommandType.StoredProcedure;
//设置参数,和参数化查询一致
da.SelectCommand.Parameters.Add(new SqlParameter("name", "周"));
da.SelectCommand.Parameters.Add(new SqlParameter("sumAge",SqlDbType.Int));
//指定参数是输出参数
da.SelectCommand.Parameters["sumAge"].Direction = ParameterDirection.Output;
DataTable dt = new DataTable();
da.Fill(dt);
dgvStudents.DataSource = dt;
//获取输出参数
object outPut = da.SelectCommand.Parameters["sumAge"].Value;
lblOutPut.Text = "输出参数是:" + outPut;
lblResult.Text = "";
} private void btnResult_Click(object sender, EventArgs e)
{
SqlDataAdapter da = new SqlDataAdapter("usp_selectStudents", ConStr);
//用存储过程来解释命令字符串
da.SelectCommand.CommandType = CommandType.StoredProcedure;
//设置参数,和参数化查询一致
da.SelectCommand.Parameters.Add(new SqlParameter("name", "周"));
da.SelectCommand.Parameters.Add(new SqlParameter("sumAge", SqlDbType.Int));
da.SelectCommand.Parameters.Add(new SqlParameter("count", SqlDbType.Int));
//指定参数是输出参数
da.SelectCommand.Parameters["sumAge"].Direction = ParameterDirection.Output;
//指定参数是返回值参数
da.SelectCommand.Parameters["count"].Direction = ParameterDirection.ReturnValue;
DataTable dt = new DataTable();
da.Fill(dt);
dgvStudents.DataSource = dt;
//获取输出参数
object outPut = da.SelectCommand.Parameters["sumAge"].Value;
//获取返回值参数
object result = da.SelectCommand.Parameters["count"].Value;
lblOutPut.Text = "输出参数是:" + outPut;
lblResult.Text = "返回值是是:" + result;
}
}

下载DEMO

ADO.NET入门的更多相关文章

  1. ADO.NET入门教程(二)了解.NET数据提供程序

    出处:http://www.cnblogs.com/liuhaorain/archive/2012/02/11/2346312.html 1. 什么是.NET数据提供程序? .NET Framewor ...

  2. ADO.NET入门教程(三) 连接字符串,你小觑了吗?

    出处:http://www.cnblogs.com/liuhaorain/archive/2012/02/12/2347914.html 摘要 ADO.NET强大的优势在于对不同的数据源提供一致的访问 ...

  3. ADO.NET入门教程(五) 细说数据库连接池

    摘要 今天我要讲的是数据库连接池.说实话,我表示鸭梨很大.因为相比其他章节来说,连接池相对来说难理解一点.我要用最通俗的语句给大家讲明白,讲透彻却也不是一件很容易的事.但是,连接池又是非常重要的知识点 ...

  4. ADO.Net入门(2)

    (转载) 作者:可米小子 出处:http://liuhaorain.cnblogs.com 1. 什么是连接池? 在上篇文章<你必须知道的ADO.NET(四) 品味Connection对象> ...

  5. ADO.NET入门教程(一) 初识ADO.NET

    摘要 作为.NET框架最重要的组件之一,ADO.NET扮演着应用程序与数据交互的重要的角色.本文将从宏观的角度来探讨ADO.NET,和大家一起了解ADO.NET来龙去脉以及ADO.NET的主要组成部分 ...

  6. ADO.NET 学习笔记 入门教程

    本文转载自:http://www.youarebug.com/forum.php?mod=viewthread&tid=57&page=1&extra=#pid63 这是本人在 ...

  7. ADO.NET--收藏整理别人的教程

    本文所有内容均从前辈的博客中收集整理而来,仅供自己学习参考的时候快速访问用. ADO.NET入门教程(一) 初识ADO.NET ADO.NET入门教程(二)了解.NET数据提供程序 ADO.NET入门 ...

  8. ADO.net Connection对象简介

    Connection对象 学习的是刘皓的文章  ADO.NET入门教程(四) 品味Connection对象 这篇文章开始水平一般起来了,主要介绍了要优雅的使用这个对象 1 用try...catch.. ...

  9. Ado.net连接字符串

    学习刘皓的 文章ADO.NET入门教程(三) 连接字符串,你小觑了吗? 连接字符串主要有DataSource 指定地址 通常是ip 如果Express 就要使用形如 ./Express或者 (loca ...

随机推荐

  1. IIS出现Server Application Unavailable的解决办法

    在XP中IIS5.1服务器,运行asp.net出现Server Application Unavailable,经过多次查证,才发现是因为先安装了.net Framework 2.0然后安装IIS,导 ...

  2. ipa 重签

    IPA 重签名 时间 2014-03-03 10:28:36  txx's blog原文  http://blog.rpplusplus.me/blog/2014/03/03/ipa-re-codes ...

  3. ios读取文件

    // 创建文件管理器 NSFileManager *fm=[NSFileManager defaultManager]; //获取路径 NSArray *paths=NSSearchPathForDi ...

  4. synchronized 关键字

    synchronized 多用于并发不高并且需要单线程运行的地方.比如你有一个A方法,你在方法上加了synchronized修饰.那么两个人同时去调用这个方法的时候不是并行的,是抢占的,谁先抢到资源谁 ...

  5. 学习java的视频资源(尚学堂)(比较老旧,但是还是挺好用)

    本人新手,转入IT,一开始在学校的时候看过尚学堂 马士兵讲过的java基础视频教程,这次深入学习呢,就从百度云盘找了一整套的视频资源.之后越深入的学习呢,发现这些视频资源VeryCD上都发布了,地址 ...

  6. js第四章作用域

    一.动态的属性 //创建了一个变量并且保存在了变量person中 var person = new Object(); //为该对象添加了一个名为name的属性,将字符串值‘NiCholas’赋值给n ...

  7. 1011. A+B和C

    /* * Main.c * 1011. A+B和C * Created on: 2014年8月30日 * Author: Boomkeeper *********测试通过******* */ #inc ...

  8. 以前用Delphi写的CSDN免积分下载器

    用了AlphaControl皮肤组件,原理很简单,就是CSDN的一个漏洞.我主要是使用WinInet来获取相关信息,然后从里面分析出真实的下载URL,同时我也是用了AES加密.function Get ...

  9. C/C++ 用libcurl库进行http通讯网络编程

    C/C++ 用libcurl库进行http通讯网络编程 目录索引: 一.LibCurl基本编程框架 二.一些基本的函数 三.curl_easy_setopt函数部分选项介绍 四.curl_easy_p ...

  10. 攻击DotCom小游戏

    许久都没写博客了,些许是前段时间有些懈怠,今天来写博客,想记录下做过的事情,怕以后电脑换了,以前做的小项目也跟着丢了,总结下最近做的一个小游戏: 游戏目的:建立一个7X7的网格,选择其中的连续的三格来 ...