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

转载于:https://www.cnblogs.com/franky2015/p/4848717.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1.概述 该组件提供ADO.NET编程接口,可以直接在Silverlight端访问Web端数据库。可以实现在Web端无需事先手工编写或自动创建任何程序代码和数据实体的情况下, 便可在Silverlight端对Web端数据库进行增加、删除、修改、查询等数据操作。此外, 还支持访问数据库的存储过程(StoredProcdures)、视图(Views)、自定义函数(User Defined Functions)等。 2、使用前的准备 2.1组件Lib文件 该组件包含3个文件: System.Data.Silverlight.dll、 System.Data.Silverlight.Web.dll DataHandler.ashx 2.1.1System.Data.Silverlight.dll Silverlight端需引用的程序集,引用该程序集还需要引用关联的程序集,包含: System.ComponentModel.DataAnnotations.dll System.Windows.Controls.Data.dll System.Windows.Controls.Data.Input.dll System.Windows.Data.dll System.Xml.Linq.dll 该程序集中定义了一套DataSet、DataTa对象,作为数据通讯的数据格式,完全兼容ADO.NET中的DataSet、DataTable,两者之间可以通过XML互相转换,提供相应的转换方法。程序中还定义了一套DbConnection、DbCommand对象,用于向Web端发起数据库操作命令,使用方式ADO.NET。 2.1.2 System.Data.Silverlight.Web.dll Web服务器端文件,需要把该程序集拷贝到网站Bin目录,无需引用。 2.1.3 DataHandler.ashx Web服务器端的文件,需要把该文件拷贝到网站根目录。 2.2同步方式操作数据库示例 //创建一个数据连接 DbConnection conn = new DbConnection("Server=192.168.0.7;DataBase=JitonClient;Uid=sa;Pwd=jiton;"); //创建一个数据命令 DbCommandSyn cmd = new DbCommandSyn(); //设置命令的连接 cmd.Connection = conn; //设置SQL语句,可以是存储过程 cmd.CommandText = "SELECT [UserId],[UserName],[GroupId] FROM [Usertb] WHERE [GroupId]=@GroupId"; //设置命令型,一般SQL语句是Text,存储过程是StoredProcedure cmd.CommandType = DbCommandType.Text; //设置执行型 cmd.ExecuteType = DbExecuteType.Reader; //添加一个参数,无参数可以不添加 cmd.Parameters.Add(new DbParameter(DbType.Int32, "@GroupId", 5)); //执行命令,得到结果 DbCommandExecuteResult result = cmd.Execute(); if (!string.IsNullOrEmpty(result.ErrMsg))//首先判断ErrMsg是否有值,有表示执行过程发生错误 { MessageBox.Show("发生错误:" + result.ErrMsg); } else { DataTable dt = result.ReaderResult; //将数据显示在DataGrid中 this.dataGrid1.ItemsSource = dt.Rows; } 2.3异步方式操作数据库示例 //创建一个数据连接 DbConnection conn = new DbConnection("Data Source=|DataDirectory|CSmsPlatThird.db;Pooling=true;FailIfMissing=false"); //设置使用的数据访问程序集 conn.AssemblyName = "System.Data.SQLite"; //设置数据工厂,这里是SQLite的数据工厂 conn.DbProviderFactory = "System.Data.SQLite.SQLiteFactory"; //创建一个数据命令 DbCommandAsyn cmd = new DbCommandAsyn(); //设置命令的连接 cmd.Connection = conn; //设置SQL语句,可以是存储过程 cmd.CommandText = "SELECT [Id],[Content],[PlatFlag],[DateTime] FROM [T_Logger] WHERE [Id]>=@Id"; //设置命令型,一般SQL语句是Text,存储过程是StoredProcedure cmd.CommandType = DbCommandType.Text; //设置执行型 cmd.ExecuteType = DbExecuteType.Reader; //添加一个参数,无参数可以不添加 cmd.Parameters.Add(new DbParameter(DbType.Int32, "@Id", 3)); //设置命令执行完毕的委托事件 cmd.ExecuteEnd += new EventHandler<DbCommandExecuteResult>(cmd_ExecuteEnd); //异步执行命令 cmd.Execute(); void cmd_ExecuteEnd(object sender, DbCommandExecuteResult e) { if (!string.IsNullOrEmpty(e.ErrMsg))//首先判断ErrMsg是否有值,有表示执行过程发生错误 { MessageBox.Show("发生错误:" + e.ErrMsg); } else { DataTable dt = e.ReaderResult; //将数据显示在DataGrid中 this.dataGrid1.ItemsSource = dt.Rows; } } 2.4对其它数据库的支持 该组件默认支持SQL Sserver,理论上也可支持其它数据库,只要数据库提供对应的ADO.NET实现接口,已经测试过Access、SQLite。操作其它数据库时必须把对应的ADO.NET实现接口的程序集拷贝到网站Bin目录下面,操作SQL Server无需该步骤。比如操作SQLite数据库,需要把SQLite的ADO.NET实现接口程序集System.Data.SQLite.dll文件拷贝到网站Bin下面。此外还需指定DbConnection对象的AssemblyName、DbProviderFactory属性的值。 //创建一个数据连接 DbConnection conn = new DbConnection("Data Source=|DataDirectory|CSmsPlatThird.db;Pooling=true;FailIfMissing=false"); //设置使用的数据访问程序集 conn.AssemblyName = "System.Data.SQLite"; //设置数据工厂,这里是SQLite的数据工厂 conn.DbProviderFactory = "System.Data.SQLite.SQLiteFactory"; 其它操作步骤和操作SQL Server无差异,完整的示例代码见2.3中的示例。 2.5技术交流 有任何问题可以加入唯一指定的专用QQ群153079750进行反馈交流,也欢迎加入笔者的另一个Silverlight技术群175213051进行交流。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值