ADO.net数据访问方法

摘要:
这些对象包括数据行和数据列,以及主键、外键、约束和有关DataTable对象中数据的关系信息。Command对象使您能够访问用于返回数据、修改数据、运行存储过程以及发送或检索参数信息的数据库命令。DataAdapter使用Command对象在数据源中执行SQL命令。1.连接模式(直接在数据库上操作)2。非连接模式(取决于数据集)1。连接模式(直接在数据库上操作)步骤:

ADO.NET是一组用于和数据源进行交互的面向对象的类库。

核心组件有两个:

  DataSet 是 ADO.NET 的非连接(断开)结构的核心组件。DataSet 的设计目的很明确:为了实现独立于任何数据源的数据访问。因此,ADO.NET结构可以用于多种不同的数据源,用于 XML 数据,或用于管理应用程序本地的数据。DataSet 包含一个或多个 DataTable 对象的集合,这些对象由数据行和数据列以及主键、外键、约束和有关 DataTable 对象中数据的关系信息组成。

      ADO.NET 结构的另一个核心元素是 .NET 数据提供程序(Data Provider)。具体包括:

  • Connection 对象提供与数据源的连接。
  • Command对象使您能够访问用于返回数据、修改数据、运行存储过程以及发送或检索参数信息的数据库命令。
  • DataReader 对象从数据源中提供快速的,只读的数据流。
  • DataAdapter 对象提供连接 DataSet 对象和数据源的桥梁。DataAdapter 使用 Command 对象在数据源中执行 SQL 命令,以便将数据加载到 DataSet 中,并使对 DataSet 中数据的更改与数据源保持一致。

用ADO.NET访问数据一般有两种方法,1.连接模式(直接对数据库进行操作)2.非连接模式(靠数据集)

1.连接模式(直接对数据库进行操作)

步骤:

  • 先建立连接字符串 SqlConnection con = new SqlConnection(str)//str是连接数据库的connectionstring
  • 创建command  SqlCommand cmd = new SqlCommand(sql语句,con);
  • 执行读取。cmd.Excutereader()这是获得一个Sqldatareader的结果集,DataReader是一个快速的,轻量级,只读的遍历访问每一行数据的数据流。,用完后记得close因为值允许一个reader,或者 cmd.ExcuteSaclar()查询单个结果 或者cmd.ExecuteNonQuery执行一条语句。
 //构造连接字符串
            SqlConnectionStringBuilder sbd = new SqlConnectionStringBuilder();
            sbd.ConnectionString = ConfigurationManager.ConnectionStrings["delcon"].ConnectionString;//从配置文件得到数据源
            sbd.Pooling = true;
            sbd.MinPoolSize = 0;
            sbd.MaxPoolSize = 50;
            sbd.ConnectTimeout = 10;
            sbd.AsynchronousProcessing = true;//异步连接说明
  //拼接SQL字符串
            StringBuilder strSQL = new StringBuilder();
            strSQL.Append("insert into dbo.UserInfo(UserName,UserScore)  ");
            strSQL.Append("OUTPUT inserted.ID values(@UserName,@UserScore)");

command:


为了防止被数据库注入,一般都要使用parameter来参数化查询:

  //构造Parameter对象
                SqlParameter[] paras = new SqlParameter[] {
                    new SqlParameter("@UserName",SqlDbType.VarChar,20),
                    
                    new SqlParameter("@UserScore", SqlDbType.VarChar,20),
                   
            };
                //给parameter对象赋值
                paras[0].Value = "王杰";
                paras[1].Value = "87";
                //遍历将parameter添加到cmd中
                foreach (var item in paras)
                {
                    cmd.Parameters.Add(item);
                }

必须掌握的几个方法

 ExecuteNonQuery: 执行不返回数据行的操作,并返回一个int类型的数据。

 注意:对于 UPDATE、INSERT 和 DELETE 语句,返回值为该命令所影响的行数。 对于其他所有类型的语句,返回值 为 -1。

 ExecuteReader: 执行查询,并返回一个 DataReader 对象。
 ExecuteScalar: 执行查询,并返回查询结果集中第一行的第一列(object类型)。如果找不到结果集中第一行的第一列,则返回 null 引用。

注: 
1、 User是SQL SERVER的关键字,在表名中应尽量避免,如果必须是User表,可以用SELECT * FROM [User]这样的语句来查询该表的内容 
2、 SqlCommand 类的ExecuteScalar()方法返回的是查询结果的第一行第一列的数据 
3、 在插入数据的同时想要获得当前插入数据的id(主键)号,可以通过output语法和ExecuteScalar方法实现,这是在SQLSERVER 2005以后的版本中都有的,具体语法如下: 
cmd.CommandText = “INSERT INTO T_Users(UserName,PassWord) OUTPUT inserted.Id Values(“admin”, “123456”)”; 
int id = Convert.ToInt32(cmd.ExecuteScalar());


2.非连接模式(靠数据集)通过数据集访问数据

  数据集是最常用的访问数据的方式,其主要流程是连接数据库、进行数据查询、将查询结果填充到数据集、对数据集中的数据进行展示和操作、将操作后的数据集提交数据库,通过这一系列操作实现对数据库的修改,此过程主要通过DataSet、DataAdapter、DataTable、DataRow、DataColumn、SqlCommandBuilder等类实现。

  先是查询

  • 1.SqlDataAdapter sqadpt = new SqlDataAdapter(strSQL.ToString(),con);//通过adapter来获得数据
  • //将数据填充到数据集Dataset中
  • SqlCommandBuilder scb = new SqlCommandBuilder(sqadpt );//生成插入、删除、更新语句,这步写上不影响读取

  • 2.DataSet dtset = new DataSet();//先实例化dataset
  • sqadpt.Fill(dtset);//通过adapter来填充dt的实例
  • //现在要通过Datatable来对Dataset中的数据进行展示和修改
  • 3.DataTable dttable = new DataTable();//创建数据表对象
  • dttable = dtset.Tables[0];//dataset来填充datatable数据表对象

  对数据进行修改要用到SqlCommandBuilder的对象实例

具体实例:对数据集的修改,可以通过DataRow以及SqlCommandBuilder对象的实例来实现,

 //创建DataAdapter对象实例 
SqlDataAdapter sqldadp = new SqlDataAdapter(SQL查询语句, con); SqlCommandBuilder scb = new SqlCommandBuilder(sqldadp);//生成插入、删除、更新语句 
DataSet ds = newDataSet();//创建DataSet对象 
sqldadp.Fill(ds);//填充DataSet 
DataTable dttable = new DataTable();//创建数据表对象
dttable = ds.Tables[0];//dataset来填充datatable数据表对象
DataRow Myrow =dttable .NewRow();//在数据表中创建新的空白记录对象
 //从前台页面接受要插入的数据 
Myrow["name"]= Name.Text;
....
 //将接收到的数据添加到DataTable中 
DataRow .Rows.Add(Myrow); //更新数据库中的内容
 sqldadp.Update(ds); //执行Update操作

如果是更新数据的话,也是获得DataTable的某一行后,然后对其中的数据进行赋值修改,然后提交,如果是删除操作,则是通过DataTable获取某行后,用DataRow接受,然后再调用DataTable的Rows属性的Remove方法删除,具体如下代码:

 DataTable dt = ds.Tables[0];
 dt.Rows.Remove(Myrow);

网络数据的事务处理

事务处理是为了防止在网络上多用户对数据库的并发操作破坏数据的一致性和完整性,而事务处理主要通过SqlTransaction对象完成,其主要的方法有:Commit()方法主要负责提交事务处理完成真正的数据库查询更新操作,Rollback()方法主要负责当数据查询更新等数据库操作出现异常时的事务回滚。ADO.NET的事务处理主要通过SqlCommand对象来实现事务对象,代码如下:

using (SqlConnection con = new SqlConnection("Data Source = localhost; Initial Catalog = UserDate; Integrated Security = True"))         
{     
SqlTransaction transql = null;//申明SqlTransaction对象的实例    
SqlCommand cmd = new SqlCommand();   
 try    
{          
con.Open();//创建数据库链接          
transql = con.BeginTransaction();//开始事务处理         
cmd.Connection = con;//设置Command对象的链接         
cmd.Transaction = transql;//设置Command对象的事务         
//设置带参数的SQL语句          
cmd.CommandText = "INSERT INTO b1(name, company, position, shijian) VALUES(@Name, @Company, @Position, @Datetime)";         
 //为参数赋值(注意参数在数据库中的数据类型)          
cmd.Parameters.Add(new SqlParameter("Name", Name.Text));          cmd.Parameters.Add(new SqlParameter("Company", Company.Text));         cmd.Parameters.Add(new SqlParameter("Position", Position.Text));         cmd.Parameters.Add(new SqlParameter("Datetime", DateTime.Parse(Datetime.Text)));//注意数据类型转换         
//执行SQL语句         
 cmd.ExecuteNonQuery();        
 //提交事务          
transql.Commit();
          
Response.Write("添加成功!<br>");     
}
 catch     
{          
//如果程序抛出异常则做事务回滚        
 transql.Rollback();    
 } 
}

注:在上面的代码中,特别要注意SqlTransaction的实例接收的是SqlConnection实例的BeginTransaction()的返回值,SqlCommand的实例的Transaction属性接收的是SqlTransaction的实例,即SqlConnection实例的BeginTransaction()的返回值,而整个事务的过程是由SqlCommand实例来书写的,也就是说,在SqlCommand实例里面的代码相对应的事务都由SqlTransaction的实例自动生成,前提是必须要有transql = con.BeginTransaction();cmd.Transaction = transql;这两句代码,最后用SqlTransaction的Commit()方法或者Rollback()对事务进行提交或者回滚

 

免责声明:文章转载自《ADO.net数据访问方法》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇java对象序列化、gzip压缩解压缩、加密解密区块链的确定性问题下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

NoSQL和MemeryCache的出现意味着传统数据库使用方式的变革吗?

故事的起源 作为软件工程专业出身的程序员,之前所接受的关于数据库的教育都是基于关系型数据库。对key-value based数据库和document-based数据库的都只是仅仅了解而已。 最近公司要做一个类似电商的系统,我来负责数据库的设计和接口的提供。当然,我们使用的数据库也是传统的关系型数据库SQL SERVER 2005,所以我也并没有什么太大压力...

Python进阶07 函数对象【转】

秉承着一切皆对象的理念,我们再次回头来看函数(function)这一结构。函数实际上也是一个对象。既然是一个对象,它也具有属性(可以使用dir()查询)。作为对象,它还可以赋值给其它变量名,或者作为参数传递给其它函数使用。 1. lambda在展开之前,我们先提一下lambda。lambda是一种简便的,在同一行中定义函数的方法,其功能可以完全由def定...

SQL Server 2000详细安装过程及配置

说明:这篇文章是几年前我发布在网易博客当中的原创文章,但由于网易博客现在要停止运营了,所以我就把这篇文章搬了过来,虽然现如今SQL Server 2000软件早已经过时了,但仍然有一部分人在使用它,尤其是某些高校的学生在做毕业设计或者课程设计的时候可能会使用到,所以就把该软件的安装过程保留在这里吧。 另外,此SQL Server 2000软件只能在Wind...

MongoDB在linux下的启动

     最近公司数据库用到MongoDB,而之前只关注知道它是分布式非关系数据库,数据以文档的形式存储,数据格式是类似json的bson格式.而对于具体用法以及java如何调用并没有过多接触,今天花费一天的时间了解了MongoDB在linux下的安装以及基本的命令行调用.    1. Linux下安装MongoDB     进入官网: https://d...

influxdb简单使用

之前对influxdb有一个简单的了解和入门的使用,近期由于想使用influxdb做一点东西玩玩,又要捡起influxdb。本篇就针对influxdb的数据库、表的概念,增删改查操作、RESTful操作等做下总结。 一、influxdb与传统数据库的比较 库、表等比较: influxDB 传统数据库中的概念 database 数据库 meas...

SQLServer2008/2012 安装、添加sa用户和密码、多实例安装、修改端口, 重启生效

目录: 1、SQLServer2008 安装2、SQL Server 添加 sa 用户和密码3、navicat12 连接 SQLServer4、不同 SQL Sever 实例的管理5、"开始 -- Microsoft SQL Server 2012"菜单下没有 sql server配置管理器6、修改 sql server 访问端口号 1、SQLServer...