zoukankan      html  css  js  c++  java
  • ADO.NET(一) 空间 ADO.NET结构 命名空间(车延禄) System.Data—— 所有的一般数据访问类 S(转载)

    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]效率居中,可读性差,可维护性差

  • 相关阅读:
    关于Visual Studio.NET 2008开发一册通C# 3.0从基础到项目实战的读后感
    书.NET 3.5与VB 2008高级编程(第3版)的评论
    Java 基础语法
    idea 无法创建子目录
    壁纸
    【博客园】美化
    Java变量和常量
    本人负责任的告诉你,从博客看不出什么东东来。
    DataFormating的用法总结
    javascript弹出div(一)
  • 原文地址:https://www.cnblogs.com/franky2015/p/4848717.html
Copyright © 2011-2022 走看看