ADO.NET 连接方式进行数据访问

Ado/Ado.net与Asp/Asp.net关系 前言 * Asp(Active Server Pages),动态服务页面; * Asp.Net (Active Server Pages基于.NET Framework),基于.net平台的动态服务页面,又称Asp+; * Ado (ActiveX Data Objects),ActiveX数据对象,用于表示用户数据库中的数据结构和所包含的数据 * Ado.Net(ActiveX Dat 阅读详情

连接到数据源

连接到数据源需要使用两步:

1.创建连接字符串

2.使用Connection通过连接字符串进行连接

例1:

//使用连接字符串
//注意引用System.Data.Common 和 System.Data.SqlClient
string connectionString = "server=.;database=DataBaseST;uid=sa;pwd=s1s1s1";
DbConnection connection = new SqlConnection(connectionString);

一般来说,我们不会在每个页面都自定义一个连接字符串,然后再使用该字符串.如果某天需要修改该连接时,将会非常麻烦,所以我们将该字符串放入web.config,然后通过从该文件中获取连接信息.

例2:

web.config中配置如下:

<connectionStrings>
    <add name="dbstconnectionstring" connectionString="Data Source=.;Initial Catalog=databasest;

               Persist Security Info=True;User ID=sa;password=s1s1s1" providerName="System.Data.SqlClient"/>
</connectionStrings>

页面调用如下:

//注意引用System.Data.Common
//注意引用System.Data.SqlClient
string connectionString = ConfigurationManager.ConnectionStrings["dbstconnectionstring"].ConnectionString;
DbConnection connection = new SqlConnection(connectionString);

此处需要注意的是:

  连接字符串中的server,database,uid是必不可少的,如果有密码,则pwd也不可少.

  注意引用命名空间

可参见以下网站,提供众多连接字符串格式:

连接字符串

创建命令

创建对象使用Command对象.Command对象是一个Sql语句或存储过程的引用.Command对象可以被直接引用.

如何创建Command对象?见下例:

//创建Command有以下两种方式
//方式一
//  通过Connection创建
DbCommand cmd1 = connection.CreateCommand();

//方式二
//  创建Command实例,再制定Connection
DbCommand cmd2 = new SqlCommand();
cmd2.Connection = connection;

Command对象有以下重要属性:

属性描述
CommandType命令类型.
值为枚举类型,有以下值:
Text:Sql脚本命令,默认值.
StoredProcedure:存储过程
TableDirect:表的名称(用的比较少)
CommandTextSql语句或存储过程的名字
Parameters命令的参数

Command对象有以下重要方法:

方法描述
ExecuteScalar返回一个唯一的值
ExecuteNonQuery用于更新或修改数据库结构,返回被影响行数
ExecuteReader返回数据行的集合

执行命令

通过对Command对象设定CommandType类型和CommandText,我们就可以通过上述方法来执行Command命令.

我们以下表,表结构如下:

image

表中数据如下:

image

  • 我们首先演示ExecuteScalar方法,该方法用于返回结果集中的第一行的第一列;如果结果集为空,则为空引用.

请看以下示例:

string connectionString = ConfigurationManager.ConnectionStrings["dbstconnectionstring"].ConnectionString;
DbConnection connection = new SqlConnection(connectionString);

connection.Open();
DbCommand cmd = connection.CreateCommand();

//默认情况,Command对象的CommandType属性为Text
cmd.CommandText = "select count(*) from Employee";

string result = cmd.ExecuteScalar().ToString();
Response.Write(result);

connection.Close();

  • 下面再来看ExecuteNonQuery方法的使用,该方法可执行INSERT、DELETE、UPDATE 及 SET 语句等命令.

看以下示例:

string connectionString = ConfigurationManager.ConnectionStrings["dbstconnectionstring"].ConnectionString;
DbConnection connection = new SqlConnection(connectionString);

connection.Open();
DbCommand cmd = connection.CreateCommand();

//默认情况,Command对象的CommandType属性为Text
//现在,我们设置Command对象的CommandType属性为StoredProcedure
cmd.CommandType = CommandType.StoredProcedure;

//此时Command对象的CommandText属性为存储过程名称
cmd.CommandText = "InsertEmployee";

int result = cmd.ExecuteNonQuery();
Response.Write(result);

connection.Close();

使用存储过程InsertEmployee内容如下:

ALTER PROCEDURE dbo.InsertEmployee
AS
    /* SET NOCOUNT ON */
    insert into Employee (EmployeeName,EmployeeAge,EmployeeDeparmentID,EmployeeScore)
    values ('周?九?',27,1,85)
    RETURN

运行后,表内容如下,增加了一条新数据:

image

  • 最后来看ExecuteReader方法的使用

ExecuteReader使用Transact-SQL的 sp_executesql 系统存储过程调用命令.

该方法返回一个DataReader对象.DataReader是一个只读的、前向的数据行的流.

DataReader对象有以下常用属性和方法:

属性或方法类别描述
Item属性 
Read方法Sql语句或存储过程的名字
GetXXX方法获取值,其中XXX指String,Int32等等
GetValues方法一次性获取当前所有的列
IsDbNull方法测试当前值是否为Null
Close方法当Read返回为false时,应及时关闭DataReader,释放连接

例1:

string connectionString = ConfigurationManager.ConnectionStrings["dbstconnectionstring"].ConnectionString;
DbConnection connection = new SqlConnection(connectionString);

connection.Open();
DbCommand cmd = connection.CreateCommand();

//默认情况,Command对象的CommandType属性为Text
cmd.CommandText = "select * from Employee";

DbDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
    //reader读取数据时,列从0开始编号,故EmployeeID为第0列,EmployeeName为第1列
    //读取数据时采用了3种方式:
    //  1.因EmployeeName列为string类型,所以可以使用GetString方法
    //  2.采用Item方式
    //  3.采用GetValue方法
    //语句中使用了IsDbNull方法来判断分数栏是否为空
    Response.Write(string.Format("Name:{0}    Age:{1}    Score:{2}<br/>", 
        reader.GetString(1), 
        reader["EmployeeAge"],
        reader.IsDBNull(4) ? "无" : reader.GetValue(4)));
}

//先关闭Reader
reader.Close();

//再关闭Connection
connection.Close();

DataReader可以返回多个数据集结果,可使用NextResult方法移到下一个结果集,见下例.

例2:

protected void Page_Load(object sender, EventArgs e)
{
    string connectionString = ConfigurationManager.ConnectionStrings["dbstconnectionstring"].ConnectionString;
    DbConnection connection = new SqlConnection(connectionString);

    connection.Open();
    DbCommand cmd = connection.CreateCommand();

    //默认情况,Command对象的CommandType属性为Text
    cmd.CommandText = "select top 2 * from Employee;select top 3 * from Employee";

    DbDataReader reader = cmd.ExecuteReader();
    Read(reader);

    Response.Write("<hr>");
    reader.NextResult();
    Read(reader);

    //先关闭Reader
    reader.Close();

    //再关闭Connection
    connection.Close();
}

void Read(DbDataReader reader)
{
    while (reader.Read())
    {
        //reader读取数据时,列从0开始编号,故EmployeeID为第0列,EmployeeName为第1列
        //读取数据时采用了3种方式:
        //  1.因EmployeeName列为string类型,所以可以使用GetString方法
        //  2.采用Item方式
        //  3.采用GetValue方法
        //语句中使用了IsDbNull方法来判断分数栏是否为空
        Response.Write(string.Format("Name:{0}    Age:{1}    Score:{2}<br/>",
            reader.GetString(1),
            reader["EmployeeAge"],
            reader.IsDBNull(4) ? "无" : reader.GetValue(4)));
    }
}

结果:

image 

使用参数

  • 介绍

Sql语句和存储过程可以有输入输出参数以及返回值

例如,我们在添加雇员信息时,雇员信息都是由用户输入进去的,而不是由系统内部设定的.

  • 如何实现?

使用Command的Parameters可以实现我们向其中添加参数.

注意:

参数类型可以由Direction来设置,该属性值为一个枚举类型,取值如下:

ParameterDirection取值描述对应C#对应SQL
Input输入  
InputOutput输入输出ref对应output
Output输出out
ReturnValue返回值  
  • 例子
string connectionString = ConfigurationManager.ConnectionStrings["dbstconnectionstring"].ConnectionString;
//注意:
//  此处换为SqlConnection,原来为DbConnection
SqlConnection connection = new SqlConnection(connectionString);

//注意:
//  此处换为SqlCommand,原来为DbCommand
SqlCommand cmd = connection.CreateCommand();

cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "InsertEmployee";

//添加参数的几种写法
cmd.Parameters.Add("@EmployeeName",SqlDbType.NVarChar).Value = "测试用户";
cmd.Parameters.Add(new SqlParameter("@EmployeeAge", 30));

//推荐使用AddWithValue方法
cmd.Parameters.AddWithValue("@EmployeeDepartmentID", 1);
cmd.Parameters.AddWithValue("@EmployeeScore", 95);

cmd.Parameters.Add(new SqlParameter("@outValue", SqlDbType.NVarChar, 20));
cmd.Parameters["@outValue"].Direction = ParameterDirection.Output;

connection.Open();
int returnValue= cmd.ExecuteNonQuery();
Response.Write("ReturnValue:" + returnValue + "<br/>");

string result = cmd.Parameters["@outValue"].Value.ToString();
Response.Write("outValue:" + result);
connection.Close();

存储过程InsertEmployee内容如下:

ALTER PROCEDURE dbo.InsertEmployee
(
    @EmployeeName nvarchar(20),
    @EmployeeAge int=null,
    @EmployeeDepartmentID int=null,
    @EmployeeScore int=null,
    @outValue nvarchar(20) output
)

AS
    /* SET NOCOUNT ON */
    if exists(select * from Employee where EmployeeName=@EmployeeName)
    begin
        set @outValue='用户名重复'
        return
    end
    
    insert into Employee (EmployeeName,EmployeeAge,EmployeeDeparmentID,EmployeeScore)
    values (@EmployeeName,@EmployeeAge,@EmployeeDepartmentID,@EmployeeScore)
    
    set @outValue='成功!'
    
    return

目前数据库中并没有"测试用户"这样一个用户.

第一次运行时,结果如下:

ReturnValue:1
outValue:成功! 

第二次运行时:结果如下:

ReturnValue:-1
outValue:用户名重复 

实现事务

事务是一系列相互关联的任务,作为一个整体成功提交或失败(提交或回滚).

事务的特性:

  Atomicity(原子):事务或者全部提交,或者全不提交

  Consistency(一致):事务保证了数据的完整性

  Isolation(分离):事务处理了数据操作的并发性

  Durability(持续):即使在事务结束后,发生系统崩溃等灾难性情况,事务涉及的数据操作也将正常保存

先看使用Sql来实现事务.还是看例子来理解,我们现在新增一个表:Bank.

表结构如下:

image

表内容如下:

image 

现在,我们向表中添加一系列的用户,因为CustomerName是主键,所以不能重复.看下例:

string[] customerList = new string[] { 
        "小张",
        "小王",
        "李四",
        "小赵"
};

string connectionString = ConfigurationManager.ConnectionStrings["dbstconnectionstring"].ConnectionString;
SqlConnection connection = new SqlConnection(connectionString);
connection.Open();

SqlTransaction transaction = connection.BeginTransaction();
SqlCommand cmd = connection.CreateCommand();
cmd.Transaction = transaction;

try
{
    foreach (string customer in customerList)
    {
        cmd.CommandText = "insert into bank(customername,customermoney) values ('" + customer + "',0)";
        cmd.ExecuteNonQuery();
    }
    transaction.Commit();
}
catch
{
    transaction.Rollback();
}
finally
{
    connection.Close();
}
    }

在运行代码时,我们打开SqlServer事件查看器,看到以下结果:

exec sp_reset_connection
go
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;BEGIN TRANSACTION
go
insert into bank(customername,customermoney) values ('小张',0)
go
insert into bank(customername,customermoney) values ('小王',0)
go
insert into bank(customername,customermoney) values ('李四',0)
go
IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION
go

结果是数据表中没有任何数据被增加.

现在我们将customerList中的"李四"用户去掉.再来看来SqlServer事件查看器中的结果:

exec sp_reset_connection
go
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;BEGIN TRANSACTION
go
insert into bank(customername,customermoney) values ('小张',0)
go
insert into bank(customername,customermoney) values ('小王',0)
go
insert into bank(customername,customermoney) values ('小赵',0)
go
COMMIT TRANSACTION
go

数据库Customer表的内容如下:

image

小结

    • 使用Connection创建数据库连接
    • 使用Command创建命令
    • 使用ExecuteScalar,ExecuteNonQuery,ExecuteReader方法来执行命令
    • 使用DataReader来读取数据
    • 使用Command对象的Parameters属性来添加参数
    • 使用Connection对象来创建Transaction事务


查看原谅请点击这里。


ADO.NET 技术 ADO.NET 技术 前言:    作为.NET框架最重要的组件之一,ADO.NET扮演着应用程序与数据交互的重要的角 色。本文将从宏观的角度来探讨ADO.NET,和大家一起了解ADO.NET来龙去脉以及ADO.NET 的主要组成部分。 一、ADO.NET是什么?   简单的说,ADO.NET是一组允许.NET开发人员使用 阅读详情

相关推荐

DAO 、ADO和ADO.NET

1.什么是DAO(Data Access Objects) DAO数据访问对象是一种应用程序编程接口(API),存在于微软的Visual Basic中,它允许开发者通过ODBC(Open Database Connectivity,是微软提出数据库访问接口标准)连接到Access数据库,对其进行访问。 2.什么是ADO(ActiveX Data Objects) ADO是一项微软的技术,是A

shadowyelling的专栏 1654

配置连接数据库信息

配置连接数据库信息 &lt;connectionStrings&gt; &lt;add name="ConnectionStrings" connectionString="Data Source=192.168.0.0;port=0123;Initial Catalog=DB1;user id=UserId;password=Pwd;Charset=utf8"     provid...

qq_37348787的博客 1333

2、深入探索 Oracle .NET 连接方式与 ODP.NET 特性

本文深入探讨了在非托管和托管代码中连接 Oracle 数据库的各种方式,包括 OLEDB、ODBC、OO4O 以及微软的 .NET 提供者。文章重点介绍了 ODP.NET 作为 Oracle 官方推荐的 .NET 数据提供者,其架构、性能优势及在 ASP.NET 应用中的使用,同时对不同连接方式进行了性能与支持版本的对比分析。

banana的博客 95

C#连接SqlServer数据库(ADO.NET)

1、添加引用:添加System.Data.SqlClient引用。

qq_40287041的博客 603

深入理解基于Mysql+C#的数据访问层实现

数据访问层(DAL)是软件架构中的一个关键部分,它负责为上层提供数据存取的能力。作为连接业务逻辑层和数据源的桥梁,DAL使开发者能够高效、一致地处理数据,不论数据源是文件、数据库还是其他存储系统。定义清晰的数据访问层对于保证代码的可维护性、可扩展性以及跨平台兼容性至关重要。在这一章节,我们将探讨数据访问层的定义,分析其在软件开发中扮演的角色,以及为什么它对于构建健壮的应用程序至关重要。ADO.NET 是一组使 .NET Framework 数据提供程序能够通过网络与数据源进行通信的类。

weixin_42452924的博客 1060

ADO.NET数据连接的几种方式

用于c#中的sql数据库的连接 sqlconnection的几种连接方式

ADO.NET连接数据库方法

到今天为止,已经和数据库打过无数交道了,到直到现在才明白数据库是如何就和客户端建立了连接,怎么就可以把数据库的数据传递到客服端或客户端数据是如何就把元数据存到了数据库中 【数据库与客户端的连接】 其实用到了ADO.NET,ADO.NET是.NET平台专门用以存取后端数据库与进行数据操作的一组类。它提供两个核心组件:DataSet和.NET数据提供程序,.NET数据提供程序包括Connect

王如霜 1万+

VulnHub系列之BadStore_123渗透测试

BADSTORE: 1.2.3 早期网商系统漏洞鉴赏(2004)

Flynn的博客 1630

通过ado.net连接数据库

转载请声明出处:https://blog.csdn.net/cyzhah/article/details/82503318 一、连接数据库的步骤: 1、创建连接字符串 //Data Source =         //连接的数据库实例 //Initial Catalog =       //Integrated Security  = true; string constr = "D...

cyzhah的博客 588

CCS8.1 导入CCS3.3工程方法

    CCS3.3作为开发人员使用最广开发工具,研究人员手上存在不少该版本的建立的程序版本,然而随着TI公司推出高级版本的CCS平台,在新的平台上集成了更加丰富的功能和优点。利用新版本的平台在开发和编译旧版本工程上可以节省大量时间和精力。在使用新版本开发3.3版本工程时,首要解决的就是加载3.3的工程文件,现将加载过程记录如下: 第一步:Project-&gt;Import Legacy CC...

1万+

DC/DC开关电源EMC仿真红宝书

本红宝书系统性介绍开关电源EMC仿真方法,包括仿真原理、仿真思路、仿真工具以及仿真效率提升与仿测一致性的实战经验。从理论到仿真,从仿真到应用,真正帮你实现一文掌握开关电源EMC仿真!全文约14000字,适读人群:开关电源设计、电磁兼容EMC相关从业者,电磁相关专业研究生及CST仿真爱好者等。

电磁学社 2500

ADO.NET 非连接方式进行数据访问

1. 配置 DataAdapter 以检索信息  1.1. DataAdapter  • 数据适配器是数据集与数据源交互的桥梁  –使相当于数据源本地拷贝的数据集可以与数据源之间进行交互。 • 为数据库提供的主要两种数据适配器  – SqlDataAdapter:不经过OLEDB层直接与SQLServer交互,速度较OleDbDataAdapter快。  – OleDbDataAdapte...

weixin_30799995的博客 405

VOF模型求解方法:从SIMPLEC到PISO的稳定性优化策略

本文深入探讨了VOF模型求解方法中SIMPLEC与PISO算法的稳定性优化策略,重点分析了两种算法在稳态和瞬态问题中的应用差异。通过对比PRESTO离散化方法与其他格式的优劣,提供了针对多相流模拟的实用设置建议和稳定性优化技巧,帮助工程师有效提升计算效率和精度。

yellow的专栏 1153

ADO.NET 连接方式进行数据访问学习笔记

Command.ExecuteNonQuery() 执行一个无返回值的t-sql语句或存储过程,一般用于insert delete update等操作会返回受影响的行数 Command.ExecuteRader()执行一个返回结果集的查询 Command.ExecuteScalar() 执行一个返回单个值的查询 返回值类型为object 一般用于执行使用count,max,min,avera...

weixin_30546189的博客 162

Python爬虫深度对抗:拼多多与得物价格监控系统中的设备指纹模拟与SkyWalking风控绕过实战

在电商数据采集领域,拼多多和得物(毒)APP堪称国产风控系统的“双子星”。前者依托于拼多多集团强大的安全团队,后者则以其独特的“潮流单品”数据价值和高昂的爬取成本闻名。对于任何一名爬虫工程师而言,能够稳定、高效地获取这两大平台的价格、库存、销量等动态信息,都是一项极具挑战性的技术试金石。传统的基于requests库的简单HTTP请求,在面对这两款应用时几乎寸步难行。你会发现,无论怎样伪造User-Agent、怎样轮换代理IP,返回的永远是状态码412403,或者是一个包含验证滑块设备异常的JSON错误。

2201_76125261的博客 865

数学工具箱:Clarke与Park变换

本文详细解析了FOC(磁场定向控制)中的核心数学工具——Clarke变换与Park变换。首先阐述了坐标变换的必要性:将复杂的三相交流系统简化为直流系统,便于精确控制。Clarke变换将三相静止坐标系转换为两相静止坐标系,减少变量数量;Park变换进一步将两相静止坐标系转换为两相旋转坐标系,实现交流量到直流量的转换。文章提供了两种变换的数学公式、物理意义图解及C语言实现代码,并简要介绍了逆变换过程。这些变换为电机控制提供了关键的数学基础,后续将结合GD32F303的FPU特性进行优化实现。

汽车电子软件领域知识分享 180

ADO.NET - 连接方式数据访问SqlCommand

SqlConnection con = new SqlConnection(connectionstring); 转载于:https://www.cnblogs.com/xuxiaoguang/archive/2008/08/07/1263132.html

weixin_30361753的博客 99

YOLOv8+BiFPN双向特征金字塔:多尺度目标检测精度提升28%的实战教程

双向特征金字塔网络(BiFPN)是一种强化多尺度特征融合支持“自顶向下+自底向上”的双向特征流动,同时保留不同尺度的细节信息;引入加权融合机制,自动学习不同特征的重要性权重;裁剪冗余节点,在轻量化的同时提升融合效率。

m0_64661770的博客 492

ADO.NET组件

ADO.NET是.NET框架的组件,是在基于.NET平台的应用程序中用于访问数据源的技术,也是.NET Framework提供的数据访问类库。应用程序可以使用ADO.NET连接到这些数据源,并检索和更新所包含的数据,它为开发人员提供了一种简单、高效的方式来连接和操作各种数据源。

weixin_74341202的博客 322

微信终于支持“多设备同时在线”?我用 NAS + Docker 搭了一个云端微信系统,多端共享24小时在线

通过Docker 容器,将微信运行在云端并通过浏览器访问,实现多设备共享同一微信会话 📱。本文详细介绍完整部署流程、docker-compose 配置及资源控制方案,让微信变成“可访问的云桌面应用” ✨

XiaoqiangClub的博客 871

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

两种数据访问方式:从ADO 到ADO.NET

电脑最大的好处就是可以帮助人处理大量数据,由此离不开对数据库的访问,先看看最近在做ASP.NET例子的时候经常用到的ADO.NET的数据库访问方式。

搬砖工 1万+

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

强大的数据访问助手——ADO.NET

在介绍ADO.NEt

周洲 (Julie) 2816

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

ADO 与ADO.NET两种数据访问方式区别

ADO 与ADO.NET两种数据访问方式区别 1. ADO与ADO.NET简介   ADO与ADO.NET既有相似也有区别,他们都能够编写对数据库服务器中的数据进行访问和操作的应用程序,并且易于使用、高速度、低内存支出和占用磁盘空间较少,支持用于建立基于客户端/服务器和 Web 的应用程序的主要功能。但是ADO使用OLE DB接口并基于微软的COM(Component Object Mo...

预立数据科技 2072

10.2 C# ADO.NET基础(核心组件、ADO.NET 对象模型、数据访问、命名空间)

ADO.NET是.NET框架的一部分,它提供了一组用于访问和操作数据的类库。它支持多种类型的数据源,包括关系型数据库、XML数据和应用程序中的数据。ADO.NET的主要目的是提供一个统一的编程接口,以简化数据访问和操作。ADO:适用于较早的COM环境,使用ADODB命名空间,较为复杂且不够灵活。ADO.NET:现代化的访问方式,使用命名空间,提供了更好的性能和灵活性,支持离线数据操作。在实际应用中,ADO.NET是推荐的选择,因为它与.NET框架紧密集成,提供了更丰富的功能和更好的性能。

Argonaut_的博客 1431
上一篇: 创建数据访问层
下一篇: SqlHelper类详解
花开是心碎了
博客等级 码龄17年 76粉丝 52原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值