博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
017. ADO.NET Connection和command及DataReader
阅读量:5097 次
发布时间:2019-06-13

本文共 9544 字,大约阅读时间需要 31 分钟。

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中数据的更改和数据源保持一致;

  1. 数据库好比水源, 存储了大量的数据.
  2. Connection好比伸入水中的进水笼头, 保持与水的接触, 只有它与水进行了“连接”, 其他对象才可以抽到水.
  3. Command则像抽水机, 为抽水提供动力和执行方法, 通过“水龙头”, 然后把水返给上面的“水管”. DataAdapter,DataReader就像输水管, 担任着水的传输任务, 并起着桥梁的作用. DataAdapter像一根输水管, 通过发动机, 把水从水源送到水库里进行保持; DataReader也是一种水管, 和DataAdapter不同的是, DataReader不把水输送到水库里面, 而是单向的直接把水送到需要的地方(或者可以说直接把水送到用户的田地里), 所以要比在水库中转一下速度要快的多.
  4. DataSet则是一个大水库, 把抽上来的水按一定关系的池子进行存放. 即使撤掉“抽水装置”(断开连接, 离线状态), 也可以保持“水”的存在. 这也正是ADO.NET的核心.
  5.  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()用于内部打开和可外部关闭数据库的方法; 同时可定义一系列的增删改查的操作

 

/// ///OperateDataBase 的摘要说明/// 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;        }    }    ///     /// 析构函数,释放非托管资源    ///     ~OperateDataBase()    {        try        {            if (conn != null)                conn.Close();        }        catch { }        try        {            Dispose();                                //释放占有资源        }        catch { }    }    ///     /// 此方法用来执行SQL语句    ///     /// 要执行的SQL语句    /// 
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(); } } /// /// 此方法返回一个SqlDataReader类型的参数 /// /// ///
public SqlDataReader ExceRead(string sqlCom) { Open(); //打开数据库连接 SqlCommand com = new SqlCommand(sqlCom,conn); //创建命令对象 SqlDataReader read = com.ExecuteReader(); return read; } /// /// 参数传值方法,防止SQL注入式攻击 /// 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, 50)); sqlcom.Parameters["@UserName"].Value = loginName; sqlcom.Parameters.Add(new SqlParameter("@PassWord", SqlDbType.NVarChar, 50)); 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,50),                                 new SqlParameter("@UserNickName",SqlDbType.NVarChar,50),                                 new SqlParameter("@UserSex",SqlDbType.NVarChar,50),                                 new SqlParameter("@UserPhone",SqlDbType.NVarChar,50),                                 new SqlParameter("@UserEmail",SqlDbType.NVarChar,50),                                 new SqlParameter("@UserAdress",SqlDbType.NVarChar,50),                                 new SqlParameter("@UserCity",SqlDbType.NVarChar,50)                             };        prams[0].Value = txtName.Text;        prams[1].Value = txtNickName.Text;        prams[2].Value = radlistSex.SelectedValue;        prams[3].Value = txtphone.Text;        prams[4].Value = txtMail.Text;        prams[5].Value = txtWork.Text;        prams[6].Value = txtCity.Text;        //添加参数        foreach (SqlParameter parameter in prams)        {            pro_str.Parameters.Add(parameter);        }        int count = Convert.ToInt32(pro_str.ExecuteNonQuery());        if (count > 0)        {            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.

///     /// 此方法返回一个SqlDataReader类型的参数    ///     ///     /// 
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!=0)        {            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 = "";        }    }

 

转载于:https://www.cnblogs.com/wxylog/p/6140933.html

你可能感兴趣的文章
Windows Azure中对映像的管理及操作
查看>>
render 强大的渲染函数
查看>>
一个有关spring mvc传json的例子
查看>>
javascript基础知识(12) 函数
查看>>
如何做有时间限制的置顶贴功能
查看>>
学密码学一定得学程序(SDUT 2463)
查看>>
Final冲刺贡献分
查看>>
ls useradd groupadd group命令
查看>>
python3使用模块
查看>>
Tensorflow--池化操作的梯度
查看>>
MySQL 拷贝数据库表方式备份,还原后提示 table xxx '' doesn`t exist
查看>>
字符串型MySQL查询条件需要注意的一点
查看>>
ora-12541无监听的一种场景
查看>>
VS创建Web项目提示配置IISExpress失败
查看>>
Mysql无法创建函数解决办法
查看>>
doubango(5)--SIP协议栈传输层的启动
查看>>
[日常] AtCoder Beginner Contest 075 翻车实录
查看>>
Angular快速学习笔记(3) -- 组件与模板
查看>>
Selenium 2自动化测试实战4(异常)
查看>>
windows服务程序 开发
查看>>