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. Android 实现GIF播放(解码)

    实现原理很简单,先把GIF动画解码成多张Bitmap图片,然后放到AnimationDrawable里面去逐一播放即可. GifHelper代码: package com.android.view; ...

  2. hdu 3397 Sequence operation 线段树

    题目链接 给出n个数, 每个数是0或1, 给5种操作, 区间变为1, 区间变为0, 区间0,1翻转, 询问区间内1的个数, 询问区间内最长连续1的个数. 需要将数组开成二维的, 然后区间0, 1翻转只 ...

  3. codeforces 510E. Fox And Dinner 网络流

    题目链接 给出n个人, 以及每个人的值, 要求他们坐在一些桌子上面, 每个桌子如果有人坐, 就必须做3个人以上. 并且相邻的两个人的值加起来必须是素数.每个人的值都>=2. 由大于等于2这个条件 ...

  4. html字符实体对照表

  5. Linux 查看支持的语言,日期,时间,计算器

    1.查看系统目前支持的语言 echo %LANG 2.查看日历 cal 3.查看日期时间 date 4.计算器 bc

  6. 使用自定义脚本扩展程序自动执行 VM 自定义任务

     在 Build 开发者大会上推出VM 扩展程序的其中一个称为"自定义脚本扩展程序",它支持 PowerShell.如果这是您第一次访问这些博客,可能需要查看以前的博客,请单击 ...

  7. SPOJ 1812 Longest Common Substring II(后缀自动机)

    [题目链接] http://www.spoj.com/problems/LCS2/ [题目大意] 求n个串的最长公共子串 [题解] 对一个串建立后缀自动机,剩余的串在上面跑,保存匹配每个状态的最小值, ...

  8. opencv 简单、常用的图像处理函数(2)

    opencv的项目以来配置和环境变量的配置都很简单,对于我这个没有c++基础的来说,复杂的是opencv的api和一些大部分来自国外没有翻译的资料,以及一些常见的编码问题. 资料 opencv 中文a ...

  9. NGUI使用教程(1) 安装NGUI插件

    前言 鉴于当前游戏开发的大势,Unity3d的发展势头超乎我的预期,作为一个Flash开发人员,也是为Flash在游戏开发尤其是手游开发中的地位感到担忧....所以 近期一段时间都在自己学习unity ...

  10. compass安装教程

    *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...