ADO.NET(一)

  • 空间
 

ADO.NET结构

命名空间(车延禄)
System.Data——
所有的一般数据访问类

System.Data.Common——
各个数据提供程序共享(或重写)的类
System.Data.Odbc—— ODBC提供程序的类
System.Data.OleDb—— OLE
DB提供程序的类
System.Data.Oracle—— Oracle提供程序的类
System.Data.SqlClient——
Sql Server提供程序的类

System.Data.SqlTypes—— Sql Server数据类型

System.Data命名空间中的类
DataSet——
这个对象主要用于断开连接,它包含一组DataTable,以及这些表之间的    关系。

DataTable—— 数据的一个容器,
DataTable由一个或多个DataColumn组成,每个DataColumn由一个或多个包含数据的 DataRow生成。
DataRow——
许多数值,类似于数据库表的一行,或电子数据表中的一行。
DataColumn—— 包含列的定义,例如名称和数据类型。
DataRelation——
DataSet 中两个DataTable之间的链接,用于外键码和主/从关系。
Constraint—— 为DataColumn
(或一组数据列)定义规则,例如惟一值。

特定数据库的类
SqlCommand、OleDbCommand、OracleCommand和ODBCCommand——
SQL语句的包装器或存储过程的调用。
SqlCommandBuilder、OleDbCommandBuilder、OracleCommandBuilder和ODBCCommand
Builder——
用于从一个select子句中生成SQL语句(例如INSERT、UPDATE和DELETE语句)的类。
SqlConnection、OleDbConnection、OracleConnection和ODBCConnection——
数据库连接。类似于ADO
Connection。
SqlDataAdapter、OleDbDataAdapter、OracleDataAdapter和ODBCDataAdapter——
用于存储选择、插入、更新和删除语句的类,因此可以用于生成DataSet和更新数据库。
SqlDataReader、OleDbDataReader、OracleDataReader和ODBCDataReader——
只向前的连接数据读取器。
SqlParameter、OleDbParameter、OracleParameter和ODBCParameter——
为存储过程定义一个参数。
SqlTransaction、OleDbTransaction、OracleTransaction和ODBCTransaction——数据库事务处理,包装在一个对象中。

ADO.NET类最重要的特性是它们可以使用断开连接的方式工作

SqlConnection对象
功能:建立与数据库的连接
功能:建立与数据库的连接
命名空间: System.Data.SqlClient
System.Data.SqlClient
属性:
  ConnectionString: 设置连接字符串
设置连接字符串
  “server=.;database=pubs;uid=sa;pwd=”
  
如果本机上运行多个 如果本机上运行多个 SqlServer SqlServer 实例,则 server server 属性后面应用 属性后面应用
  
\\实例名 来实现连接。
   State:连接状态(打开,关闭)
方法:
  Open():打开数据库连接 ;
  
Close():关闭数据库连接 ;
   CreateCommand():返回SqlCommand类型
如:
  using
System.Data.SqlClient;
   // 设置连接字符串
   string string  
str="server=.;database=pubs;uid=sa;pwd=";
str="server=.;database=pubs;uid=sa;pwd=";
   // 创建连接实例
   SqlConnection
conn = new SqlConnection(str);
   // 打开连接
   conn.Open();
   …………
…………
   // 关闭连接
  
conn.Close();(车延禄)

一般情况下,当在.NET中使用“稀缺”的资源时,最好确保每个资源在使用后立即关闭。尽管.NET垃圾最终都会被回收,但仍需要尽可能早地释放资源,以避免出现资源匮乏的情况。 
当编写访问数据库的代码时,这是非常明显的,使用完数据库应当立即强制关闭数据库连接。
打开与关闭数据库链接的一般方法如下:
  try
  
{
     using (SqlConnection conn = new SqlConnection ( source ))
    
{
        //打开链接
        conn.Open ( ) ;
        //执行数据库访问操作
       
//关闭连接
        conn.Close ( ) ;
     }
   }
   catch (Exception
e)
   {
     //异常处理
  
}
这里显式调用了Close(),但这是不必要的,因为using子句将确保在任何情况下都执行关闭操作。
using子句确保实现IDisposable接口的对象在退出块时立即被释放。无论块是如何退出的,using子句都会确保关闭数据库连接。无论在哪里获得资源,最好都使用using
()语句,因为尽管我们都会编写Close()语句,但有时会忘记,此时using子句就会发挥作用。

SqlCommand对象
功能:执行
Sql语句,对数据库进行操作。
属性:
  CommandType: 执行的命令类型
   
StoredProcedure-执行存储过程
    Text-执行
SQL语句
  CommandText:要执行的存储过程或SQL语句
  Connection:要使用的数据库连接
  Parameters:参数集合
  Transaction:获取或设置将在其中执行的command
事务
方法:
  ExecuteReader():执行Sql语句,并返回SqlDataReader类型。主要用于对返回select语句的执行
  ExecuteNonQuery():执行Sql语句,并返回影向的行数。主要用于对update,insert,delete语句的执行
  ExecuteScalar():
执行Sql语句,返回首行首列。主要用于对返回单值的Sql查询语句的执行。如:count(*)

例:
  string
str="server=.;database=pubs;uid=sa;pwd=";
   SqlConnection conn = new
SqlConnection(str);// 创建连接 创建连接
   conn.Open();//打开连接
  
////////////////////////////////
   SqlCommand cmd = new SqlCommand(); //
生成Command实例
   cmd.Connection = conn;
   cmd.CommandType =
CommandType.Text; // 设置执行命令的格式
   cmd.CommandText = “select count(*) from
employee”;//要执行的SQL
   int count = (int)cmd.ExecuteScalar();
//执行命令,并返回首行首列
   ///////////////////////////////
   conn.Close();//
关闭
  
使用Parameters向SQL语句传送查询参数
  
查执行SQL语句和存储过程的时候不可避免地会需要给SQL语句或存储过程传递值,这时请不要拼接SQL语句。而要使用Parameters属性向SqlCommand传递参数。
  cmdTeacher.CommandText
= "SELECT * FROM teacher WHERE tno = @tno";
   //添加参数
  
cmdTeacher.Parameters. cmd.Parameters.Add Add(“ @tno”,
SqlDbType.VarChar,50);
   //给参数赋值
   cmdTeacher.Parameters["@tno"].Value =
"t001";
  
  
也可以把上面的两句合并为一句
  cmdTeacher.AddWithValue("@tno","t001");
  
调用存储过程
  1.将SqlCommand的CommandType属性设为CommandType.StoredProcedure
  
2.将SqlCommand的CommandText属性设为存储过程的名称
  使用输入参数:
   

  使用输出参数:
    存储过程的形参中需要添加输出参数output
   
C#主要代码如下:
   ...
   cmd.Parameters.Add("@Code",SqlDbType.VarChar,50).Direction
= ParameterDirection.Output;
    ...
    conn.Open();
   
cmd.ExecuteNonQuery();
   string myCode =
cmd.Parameters["@Code"].ToString();
    conn.Close();
   
此时的myCode中的值就是存储过程的输出参数。
  
使用返回值
   存储过程中默认自带一个@RETURN_VALUE的返回值参数。我们只需要通过读取@RETURN_VALUE参数的值就可以取出存储过程的返回值。
  
...
   cmd.Parameters.Add("@RETURN_VALUE",SqlDbType.VarChar,50).Direction
= ParameterDirection.ReturnValue;
    ...
   
conn.Open();
      cmd.ExecuteNonQuery();
      string retValue =
cmd.Parameters["@RETURN_VALUE"].ToString();
     
conn.Close();
      此时retValue中的值就是存储过程的返回值。
      
使用事务
  
在程序中要实现事务有两种实现的思路:
   1.在存储过程中使用事务
   
2.在程序代码中使用事务
a.在存储过程中使用事务
   begin
transaction
    ...
    if @@ERROR <> 0
     rollback
   
else
     commit
transaction
  
b.在C#代码中使用事务SqlTransaction
   
应用程序通过在SqlConnection对象上调用BeginTransaction来创建SqlTransaction对象。
    如:
   
SqlConnection myConnection = new SqlConnection(myConnString);
   
myConnection.Open();
    SqlCommand myCommand =
myConnection.CreateCommand();
    SqlTransaction myTrans;
   
myTrans = myConnection.BeginTransaction();
    myCommand.Connection
= myConnection;
    myCommand.Transaction =
myTrans;
    try{
         myCommand.CommandText = "Insert into …
VALUES (…)";
         myCommand.ExecuteNonQuery();
         myTrans.Commit();
    }
   
catch(Exception e) 
   
{
     myTrans.Rollback();
   
}
    finally {myConnection.Close(); }
   
   还可以使用TransactionScope来使用事务
   
TransactionScope提供了对事务的轻量级的控制。(车延禄)
    如:两个数据访问类:
     public class
EMPDA
     {
      private SqlConnection conn;
      public
EMPDA()
      {
            conn = new Conn().Connection;
     
}
        public void insert(string username,string name)
       
{
            SqlCommand cmd = conn.CreateCommand();
           
cmd.CommandText = "insert into emp values(@username,@name)";
           
cmd.Parameters.AddWithValue("@username",username);
           
cmd.Parameters.AddWithValue("@name",name);
           
conn.Open();
            cmd.ExecuteNonQuery();
           
conn.Close();
        }
     }
     public class StudentDA
    
{
      private SqlConnection conn;
      public StudentDA()
     
{
            conn = new Conn().Connection;
      }
        public void
insert(string username, string password,string nickname)
       
{
            SqlCommand cmd = conn.CreateCommand();
           
cmd.CommandText = "insert into users
values(@username,@password,@nickname)";
           
cmd.Parameters.AddWithValue("@username", username);
           
cmd.Parameters.AddWithValue("@password", password);
           
cmd.Parameters.AddWithValue("@nickname", nickname);
           
conn.Open();
            cmd.ExecuteNonQuery();
           
conn.Close();
        }
     }
     对上面两个数据访问类使用事务
     using (TransactionScope ts = new
TransactionScope())
        {
            new EMPDA().insert("cheyanlu",
"车延禄");
            new StudentDA().insert("cheyanlu", "bbb",
"车延禄");
            ts.Complete(); //事务提交
        }

SqlDataReader对象:
用来读取数据库中返回记录的对象。
SqlDataReader类的构造函是受保护的,所以不能直接使用new关键字来实例化SqlDataReader类。要生成SqlDataReader对象只能用SqlCommand对象的ExecuteReader()方法。
SqlDataReader对象不同于Java中的ResultSet和ADO中的RecordSet,它是一个基于连接的,只读的,只向前的读取器。它在内存中只保留一条记录,所以它占用资源少,效率高。
使用SqlDataReader对象读取数据时,进行操作时必需保证数据库连接处于打开状态
当数据库链接关闭时,SqlDataReader对象也会自动关闭。
属性:
   FieldCount (int)获取当前行中的列数
   HasRows (bool)获取该读取器中是否包含一行或多行
方法:
   Close()
关闭读取器(车延禄)
   Read()
将当前记录读到内存中,并把记录指针移到下一条记录。如果记录指针在最后一条记录的后面,会返回false

SqlDataReader的常用语法
  
SqlDataReader dr = cmd.ExecuteReader();
   while(dr.Read())
   {
   
//...
   }

使用SqlDataReader读取指定列的内容
   1 、使用列名: dr["列名"]
最慢但可读性好
   2 、使用类型访问器:dr.GetString(0)最快,可读性差,可维护性差
   3
、使用列序号:dr[1]效率居中,可读性差,可维护性差

ADO.NET(一) 空间 ADO.NET结构 命名空间(车延禄) System.Data—— 所有的一般数据访问类 S(转载)的更多相关文章

  1. ADO,NET 实体类 和 数据访问类

    啥也不说,看代码. --SQl中 --建立ren的数据库,插入一条信息 create database ren go use ren go create table xinxi ( code ) pr ...

  2. ADO.NET(完整修改和查询、实体类,数据访问类)

    一.完整修改和查询 在编写c#语句时需考虑到用户体验,例如在编写修改语句时,需要考虑到输入的内容在数据库中是否能够找到. 中间变量运用. 1.先查 2.执行操作 完整修改语句: bool has = ...

  3. ADO.NET 【实体类】【数据访问类】

    认识分层结构,分层式结构是最常见,也是最重要的一种结构. 三层架构(3-tier architecture) 界面层(User Interface layer) 主要对用户的请求接受,以及数据的返回, ...

  4. ado.net 实体类_数据访问类

    实体类: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ...

  5. ADO.net 实体类 、数据访问类

    程序分三层:界面层.业务逻辑层.数据访问层 比较规范的写程序方法,要把业务逻辑层和数据访问层分开,此时需要创建实体类和数据访问类 实体类: 例 using System; using System.C ...

  6. ADO.NET 数据访问类查询、属性扩展

    今天,我首先在之前所做的人员管理系统的基础上,利用数据访问类进行了所有人员信息的查询. 主程序代码: List<Users> Ulist = new UsersData().Select( ...

  7. 【2017-04-20】Ado.Net与面向对象结合架构中的数据访问层(实体类,数据访问类)

    开发项目三层架构:界面层.业务逻辑层.数据访问层 今天学习一下数据访问层,分为实体类和数据访问类 所有的类放在App_Code这个文件夹下边.养成一个好的习惯. 一.实体类 数据库中的表映射为一个类, ...

  8. ADO.NET数据访问技术

    ADO.NET数据访问技术 就是将C#和MSSQLl连接起来的纽带 可以通过ADO.NET将内存中的临时数据写入到数据库中,也可以将数据库中的数据提取到内存中供程序调用.是所有数据访问技术的基础. A ...

  9. ADO.NET编程之美----数据访问方式(面向连接与面向无连接)

    最近,在学习ADO.NET时,其中提到了数据访问方式:面向连接与面向无连接.于是,百度了一下,发现并没有很好的资料,然而,在学校图书馆中发现一本好书(<ASP.NET MVC5 网站开发之美&g ...

随机推荐

  1. 运行SPL Streams debugger(sdb)的两种方法

    You can use the SPL Streams Debugger in InfoSphere® Streams Studio to help you debug your SPL applic ...

  2. break在switch中的使用例子

    /* Name:break在switch中的使用例子 Copyright: By.不懂网络 Author: Yangbin Date:2014年2月21日 03:16:52 Description:以 ...

  3. Java的序列化

    1.为啥需要序列化 在Java编程时,一个类被实例化以后,Java虚拟机使得对象处理生存状态,但是当虚拟机关闭后,对象就不复存在了,所以一个对象的生存期不会超过JVM的工作时间,那么如何才能让对象持续 ...

  4. MySQL zerofill 的用法

    creata table t(x int(6) zerofill,y int); insert into t(x,y) values(1,1); select x,y from t;

  5. Windows-1252对Latin1编码有改变(并不完全兼容),而且Latin1缺失了好多西欧字符(法语,德语,西班牙语都有)

    主要是80到9F的编码被改掉了.从latin1的控制字符,变成了可以输出的可见字符. latin1编码: ISO-8859-1   x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA x ...

  6. 实验记录一 初步接触cortex-M3

    应该说老早就在接触cortex-M3了.曾经没想到会接触嵌入式,结果由于导师的缘故.在选择项目管理时,就呵呵了.不废话.搭配环境非常easy,纯粹傻瓜式.可由于自己的马虎,却让自己一直困惑. 记得在前 ...

  7. js柯里化的一个应用

    听到同学说面试一道题目 add(1)(2)(3)(4); 查询了下资料  这是一个js里面的柯里化 现象 add_curry防范返回的是一个 retVal,并不是执行结果.这里的代码很想递归,但是不是 ...

  8. hadoop默认3个核心配置文件说明

    1       获取默认配置 配置hadoop,主要是配置core-site.xml,hdfs-site.xml,mapred-site.xml三个配置文件,默认下来,这些配置文件都是空的,所以很难知 ...

  9. mysql server5.6.28 修改数据目录

    1.查看配置文件 mysql --help | grep my.cnf 列出使用哪个配置文件(顺序推) 2.service mysql stop 3.创建新目录 mkdir /data 4.迁移之前的 ...

  10. ThinkPHP常量参考

    常用常量 APP_NAME 当前项目名称 APP_PATH 当前项目路径 GROUP_NAME 当前分组名称 MODULE_NAME 当前Action模块名称 ACTION_NAME 当前操作的名称 ...