017. ADO.NET Connection和command及DataReader
ADO.NET主要包括Connection , command , DataReader, DataSet, DataAdapter5个对象, 通过这5个对象可以对数据库进行查询, 添加, 修改及删除的处理
a) Connection 对象主要提供与数据库的连接功能
b) Command对象用于返回数据, 修改数据, 运行存储过程和发送查询命令参数信息的命令.
c) DataReader 对象通过Command对象提供从数据库查询信息的功能. 他是一种只读的, 向前的, 快速的方式访问数据库
d) DataSet是ADO.NET中的核心概念, 是支持ADO.NET断开式, 分布式数据方案的核心对象. 他是一个数据库容器, 可以把它当做是存在于内存中的数据库. DataSet是数据的内存驻留表示形式, 无论数据源是什么, 它都会提供一直的关系编程模型; 可以用于多种不同的数据源. 比如访问xml数据或用于管理本地应用程序的数据
e) DataAdapter 对象提供链接DataSet对象和数据源的桥梁, DataAdapter对象使用Command对象在数据源中执行SQL命令, 以便将数据加载到DataSet中, 并确保DataSet中数据的更改和数据源保持一致;
- 数据库好比水源, 存储了大量的数据.
- Connection好比伸入水中的进水笼头, 保持与水的接触, 只有它与水进行了“连接”, 其他对象才可以抽到水.
- Command则像抽水机, 为抽水提供动力和执行方法, 通过“水龙头”, 然后把水返给上面的“水管”. DataAdapter,DataReader就像输水管, 担任着水的传输任务, 并起着桥梁的作用. DataAdapter像一根输水管, 通过发动机, 把水从水源送到水库里进行保持; DataReader也是一种水管, 和DataAdapter不同的是, DataReader不把水输送到水库里面, 而是单向的直接把水送到需要的地方(或者可以说直接把水送到用户的田地里), 所以要比在水库中转一下速度要快的多.
- DataSet则是一个大水库, 把抽上来的水按一定关系的池子进行存放. 即使撤掉“抽水装置”(断开连接, 离线状态), 也可以保持“水”的存在. 这也正是ADO.NET的核心.
- DataTable则像水库中的每个独立的水池子, 分别存放不同种类的水. 一个大水库由一个或多个这样的水池子组成.
Connection对象→数据库连接对象, Connection对象就是用于连接数据库和管理对数据库的事务. 它的一些属性描述数据源和用户身份; 一些方法允许和数据库建立和断开连接; ADO.NET针对不同数据库提供不同连接对象
Connection类有四种:SqlConnection,OleDbConnection,OdbcConnection和OracleConnection。
|
连接类型 |
命名空间 |
数据库类型 |
|
SqlConnection |
System.Data.SqlClient |
SQL Server数据库 |
|
OracleConnection |
System.Data.OracleClinet |
Oracle数据库 |
|
OleDbConnection |
System.Data.OleDb |
支持OLE DB的数据库,如Access |
|
OdbcConnection |
支持ODBC的数据库(很少使用了) |
所有对数据库的访问, 都是从建立连接开始的:
用SqlConnection连接SQL Server
命名空间:
using System.Data.SqlClient;
连接数据库:
string conString = "data source=127.0.0.1;Database=codematic;user id=sa;password=";
SqlConnection myConnection = new SqlConnection(conString);
myConnection.Open();
SqlConnection属性:
|
属性 |
说明 |
|
ConnectionString |
其返回类型为string,获取或设置用于打开 SQL Server 数据库的字符串。 |
|
ConnectionTimeOut |
其返回类型为int,获取在尝试建立连接时终止尝试并生成错误之前所等待的时间, 默认时间15秒; |
|
Database |
其返回类型为string,获取当前数据库或连接打开后要使用的数据库的名称。 |
|
DataSource或Server |
其返回类型为string,获取要连接的 SQL Server 实例的名称。 |
|
State |
其返回类型为ConnectionState,取得当前的连接状态:Broken,Closed,Connecting,Fetching或Open。 |
|
ServerVersion |
其返回类型为string,获取包含客户端连接的 SQL Server 实例的版本的字符串。 |
|
PacketSize |
获取用来与 SQL Server 的实例通信的网络数据包的大小(以字节为单位)。这个属性只适用于SqlConnection类型 |
SqlConnection方法:
|
方法 |
说明 |
|
Close() |
其返回类型为void,关闭与数据库的连接。 |
|
CreateCommand() |
其返回类型为SqlCommand,创建并返回一个与 SqlConnection 关联的 SqlCommand 对象。 |
|
Open() |
其返回类型为void,用连接字符串属性指定的属性打开数据库连接 |
SqlConnection事件:
|
事件 |
说明 |
|
StateChange |
当事件状态更改时发生。 (从 DbConnection 继承。) |
|
InfoMessage |
当 SQL Server 返回一个警告或信息性消息时发生。 |
一个规范的DBHelper帮助类的书写格式:
a) 新建一个网站, 命名为ManagePerson, 默认主页为Default.aspx, 作为登录窗口;
b) 创建一个OperateDataBase的公共类, 在该类的构造函数中定义连接数据库的字符串; 定义私有方法open()和公有方法close()用于内部打开和可外部关闭数据库的方法; 同时可定义一系列的增删改查的操作
/// <summary>
///OperateDataBase 的摘要说明
/// </summary>
public class OperateDataBase
{
protected SqlConnection conn;
protected string conStr;
public OperateDataBase()
{
conStr="server=WIN\\LG;DataBase=db_LYH;uid=sa;pwd=;";
}
private void Open() //定义一个私有方法,防止外界访问
{
if (conn == null) //判断数据库连接是否存在
{
conn = new SqlConnection(conStr); //不存在,新建数据库连接
conn.Open(); //打开数据库连接
}
else
{
if(conn.State.Equals(ConnectionState.Closed))//存在,判断是否关闭
conn.Open(); //连接处于关闭状态,重新打开
}
}
public void Close() //定义一个公有方法,关闭数据库连接
{
if (conn.State.Equals(ConnectionState.Open))
{
conn.Close(); //连接处于打开状态,关闭连接
}
}
public void Dispose()
{
if (conn != null)
{
conn.Dispose();
conn = null;
}
}
/// <summary>
/// 析构函数,释放非托管资源
/// </summary>
~OperateDataBase()
{
try
{
if (conn != null)
conn.Close();
}
catch { }
try
{
Dispose(); //释放占有资源
}
catch { }
}
/// <summary>
/// 此方法用来执行SQL语句
/// </summary>
/// <param name="SqlCom">要执行的SQL语句</param>
/// <returns></returns>
public bool ExceSql(string strSqlCom)
{
Open();
SqlCommand sqlcom=new SqlCommand(strSqlCom,conn);
try
{
sqlcom.ExecuteNonQuery(); //执行添加操作的SQL语句
return true;
}
catch
{
return false; //执行SQL语句失败,返回false
}
finally
{
Close();
}
}
/// <summary>
/// 此方法返回一个SqlDataReader类型的参数
/// </summary>
/// <param name="SqlCom"></param>
/// <returns></returns>
public SqlDataReader ExceRead(string sqlCom)
{
Open(); //打开数据库连接
SqlCommand com = new SqlCommand(sqlCom,conn); //创建命令对象
SqlDataReader read = com.ExecuteReader();
return read;
}
/// <summary>
/// 参数传值方法,防止SQL注入式攻击
/// </summary>
public int checkLogin(string loginName, string loginPwd)
{
string strsql = "select count(*) from tb_LoginUser where UserName=@UserName and PassWord=@PassWord";
Open();
SqlCommand sqlcom = new SqlCommand(strsql, conn);
sqlcom.Parameters.Add(new SqlParameter("@UserName", SqlDbType.NVarChar, ));
sqlcom.Parameters["@UserName"].Value = loginName;
sqlcom.Parameters.Add(new SqlParameter("@PassWord", SqlDbType.NVarChar, ));
sqlcom.Parameters["@PassWord"].Value = loginPwd;
int i = (int)sqlcom.ExecuteScalar();
Close();
return i;
}
SQL使用存储过程将数据插入数据库的示例:
protected void imgAdd_Click(object sender, ImageClickEventArgs e)
{
string str_Con = ConfigurationSettings.AppSettings["conStr"];
SqlConnection mycon = new SqlConnection(str_Con);
if (mycon.State == ConnectionState.Closed)
{
mycon.Open();
}
SqlCommand pro_str = new SqlCommand("procInsertPerson",mycon);
//指定命令类型为存储过程
pro_str.CommandType = CommandType.StoredProcedure;
//先清空参数数组,然后再逐项为存储过程中的变量赋值
pro_str.Parameters.Clear();
SqlParameter[] prams ={
new SqlParameter("@userName",SqlDbType.NVarChar,),
new SqlParameter("@UserNickName",SqlDbType.NVarChar,),
new SqlParameter("@UserSex",SqlDbType.NVarChar,),
new SqlParameter("@UserPhone",SqlDbType.NVarChar,),
new SqlParameter("@UserEmail",SqlDbType.NVarChar,),
new SqlParameter("@UserAdress",SqlDbType.NVarChar,),
new SqlParameter("@UserCity",SqlDbType.NVarChar,)
};
prams[].Value = txtName.Text;
prams[].Value = txtNickName.Text;
prams[].Value = radlistSex.SelectedValue;
prams[].Value = txtphone.Text;
prams[].Value = txtMail.Text;
prams[].Value = txtWork.Text;
prams[].Value = txtCity.Text;
//添加参数
foreach (SqlParameter parameter in prams)
{
pro_str.Parameters.Add(parameter);
}
int count = Convert.ToInt32(pro_str.ExecuteNonQuery());
if (count > )
{
lbMessage.ForeColor = System.Drawing.Color.Blue;
lbMessage.Text = "调用存储过程添加数据成功!";
}
else
Response.Write("信息提示:添加失败!");
mycon.Close();
}
f) DataReader对象是一个简单的数据集, 用于从数据源中读取只读的数据集, 常用于检索大量数据, DataReader每次只在内存中保留一行数据, 所以开销非常小, 节省内存;使用SQLDataReader对象为例读取数据时, 必须一致保持与数据库的连接; DataReader是一个轻量级的数据对象, 如果只需要将数据读取出来并显示, 那么它是最合适的工具, 它的读取速度比dataset快, 且占用资源小; 但是它是处于长连接模式;
属性:
|
FileCount |
获取当前行的列数 |
|
HasRows |
判断SqlDataReader判断数据库中是否有数据,DataReader是否包含一行或多行记录, |
|
IsClosed |
判断DataReader对象是否关闭状态 |
|
RecordsAffected 获取执行Sql语句所更改, |
添加和删除的行数 |
方法:
|
Read() |
返回SqlDataReader的第一条.并前进到下一条记录 |
|
GetName() |
取得字段的名称 |
|
GetDataTypeName() |
取得字段的数据类型 |
|
GetValue() |
取得字段的值 |
|
Close() |
关闭DataReader对象 |
|
GetOrdinal() |
查询字段所在位置 |
|
GetValues() |
把所有查询记录数据赋于数组 |
|
IsNull() |
判断字段是否为null值 |
要判断是否有数据可供读取, 可以先用DataReader对象的HasRows属性判断是否有数据可以回传, 如果有数据就传回True, 否则就传回False, 接着再调DataReader的Read方法, 它向下读取一条数据, 若有就会传回True, 否则就传回False.
/// <summary>
/// 此方法返回一个SqlDataReader类型的参数
/// </summary>
/// <param name="SqlCom"></param>
/// <returns></returns>
public SqlDataReader ExceRead(string sqlCom)
{
Open(); //打开数据库连接
SqlCommand com = new SqlCommand(sqlCom,conn); //创建命令对象
SqlDataReader read = com.ExecuteReader();
return read;
}
一些时时随着变化而动态刷新的数据, 使用DataReader来处理最好不过了:
//如果下拉列表中的项改变的话, 时时更新其它文本框中值
protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
{
if (DropDownList1.SelectedValue != null && DropDownList1.SelectedIndex!=)
{
string cmdsql = "select * from AddLinkMen where UserID='" + Convert.ToInt32(DropDownList1.SelectedValue) + "'";
SqlDataReader myRead = odb.ExceRead(cmdsql);//调用公共类中的ExceRead方法创建数据阅读器
if (myRead.HasRows)//判断是否有数据
{
while (myRead.Read())//读取数据
{
txtName.Text = myRead["UserName"].ToString();
txtNickName.Text = myRead["UserNickName"].ToString();
txtphone.Text = myRead["UserPhone"].ToString();
txtMail.Text = myRead["UserEmail"].ToString();
txtWork.Text = myRead["UserAdress"].ToString();
txtCity.Text = myRead["UserCity"].ToString();
}
myRead.Close();//关闭数据阅读器
}
}
else
{
txtName.Text = txtNickName.Text = txtphone.Text = txtMail.Text = txtWork.Text = txtCity.Text = "";
}
}
017. ADO.NET Connection和command及DataReader的更多相关文章
- Winform开发之ADO.NET对象Connection、Command、DataReader、DataAdapter、DataSet和DataTable简介
ADO.NET技术主要包括Connection.Command.DataReader.DataAdapter.DataSet和DataTable等6个对象,下面对这6个对象进行简单的介绍:(1)Con ...
- C#对SQL数据库操作类简介:Connection、Command、DataReader、DataSet、DataAdapter
在说C#操作数据库之前需要先说下ADO.NET.ADO.NET的名称起源于ADO(ActiveX Data Objects),是一个COM组件库,用于在以往的Microsoft技术中访问数据.之所以使 ...
- ADO.NET系列之Command对象
ADO.NET系列之Connection对象 ADO.NET系列之Command对象 ADO.NET系列之DataAdapter对象 ADO.NET系列之事务和调用存储过程 上一篇<ADO.NE ...
- ADO.NET Connection Pooling at a Glance
ADO.NET Connection Pooling at a Glance Establishing a connection with a database server is a hefty a ...
- ado.net中的 sqlconnection sqlcommand datareader dataset SqlDataAdapter之间的关系
Connection: 和数据库交互,必须连接它.连接帮助指明数据库服务器.数据库名字.用户名.密码,和连接数据库所需要的其它参数.Connection对象会被Command对象使用,这样就能够知道是 ...
- ADO.NET中的Command详解
Command方法介绍 1.ExecuteNonQuery 对于Update.Insert.Delete执行并返回受影响行数 对于其他语句返回 -1 2.ExecuteScalar 执行查询.并返回结 ...
- ADO.NET笔记——利用Command对象的ExecuteScalar()方法返回一个数据值
相关知识: 有些SQL操作,例如SUM,只会从数据库返回一个数据值,而不是多行数据 尽管也可以使用ExecuteReader()返回一个DataReader对象,代表该数据值,但是使用Command对 ...
- ADO.NET中的DataSet和DataReader
ADO.NET提供两个对象用于检索关系型数据并把它存储在内存中,分别是DataSet和DataReader.DataSet提供内存中关系数据的表现--包括表和次序.约束等表间的关系的完整数据集合.Da ...
- ADO.net Connection对象简介
Connection对象 学习的是刘皓的文章 ADO.NET入门教程(四) 品味Connection对象 这篇文章开始水平一般起来了,主要介绍了要优雅的使用这个对象 1 用try...catch.. ...
随机推荐
- mongodb 几个要注意的问题
1. moongo db 会尽量将 所有 索引和 热数据 放入内存中来进行比较,从而来获得更好的查询速度,同时,mongodb在写的时候,也是先写入内存,然后定期同步到磁盘上面去,这样可以达成顺序写的 ...
- UITableView详解(1)
一,UITableView控件使用必备,红色部分是易错点和难点 首先创建一个项目,要使用UITableView就需要实现协议<UITableViewDataSource>,数据源协议主要完 ...
- java学习第十天
第十二次课 目标 一维数组(创建访问) 一.概念与特点 1.概念 相同数据类型的有序集合[] 数组名: 容器的名字 元素: 下标变量,数组名[下标] 长度: length 下标: 位置.索引 ...
- notebook
1. 2.
- JS基础知识(数组)
1,数组 var colors = new Array(); var colors = new Array(20); var colors = new Array(“red”, “blue”, “gr ...
- Nginx技巧:灵活的server_name,Nginx配置一个服务器多个站点 和 一个站点多个二级域名
http://www.cnblogs.com/buffer/archive/2011/08/17/2143514.html Nginx强大的正则表达式支持,可以使server_name的配置变得很灵活 ...
- 在FreeBSD上安装Bugzilla
Bugzilla 是一款开源的 Web 应用,是一款bug跟踪系统和测试工具,由 mozilla 开发,并采用 Mozilla 公共许可证授权(MPL),它经常被一些高科技公司如 mozilla.红帽 ...
- ANTLR3完全参考指南读书笔记[01]
引用 Terence Parr. The Definitive ANTLR Reference, Building Domain Specific Languages(antlr3 version). ...
- Queue及Stack
Queue 她是一个接口,有多冢实现方式(LinkedList.ArrayDeque等) 类别 方法 入队 add.offer(优先级高) 出队 remove.poll 查询 element.peek ...
- Spring MVC+Maven+Freemarker+Mybatis开发环境搭建
版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 创建一个Spring MVC项目 集成Freemarker 集成Mybatis Mybatis自动生成工具 利用STS( ...