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

ADO.NET 连接方式进行数据访问,第1张

概述连接数据源 连接到数据源需要使用两步: 1.创建连接字符串 2.使用Connection通过连接字符串进行连接 例1: //使用连接字符串//注意引用System.Data.Common 和 System.Data.SqlClientstring connectionString = "server=.;database=DataBaseST;uid=sa;pwd=s1s1s1";DbCo 连接到数据源

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

1.创建连接字符串

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

例1:

//使用连接字符串//注意引用System.Data.Common 和 System.Data.sqlClIEntstring 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.sqlClIEntstring 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实例,再制定ConnectionDbCommand cmd2 = new sqlCommand();cmd2.Connection = connection;

Command对象有以下重要属性:

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

Command对象有以下重要方法:

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

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

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

表中数据如下:

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

请看以下示例:

string connectionString = ConfigurationManager.ConnectionStrings["dbstconnectionstring"].ConnectionString;DbConnection connection = new sqlConnection(connectionString);connection.open();DbCommand cmd = connection.CreateCommand();//默认情况,Command对象的CommandType属性为Textcmd.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属性为StoredProcedurecmd.CommandType = CommandType.StoredProcedure;//此时Command对象的CommandText属性为存储过程名称cmd.CommandText = "InsertEmployee";int result = cmd.ExecuteNonquery();Response.Write(result);connection.Close();

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

ALTER PROCEDURE dbo.InsertEmployeeAS    /* SET NOCOUNT ON */    insert into Employee (Employeename,EmployeeAge,EmployeeDeparmentID,Employeescore)    values ('周?九?',27,1,85)    RETURN

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

最后来看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属性为Textcmd.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)));}//先关闭Readerreader.Close();//再关闭Connectionconnection.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读取数据时,Employeename为第1列        //读取数据时采用了3种方式:        //  1.因Employeename列为string类型,所以可以使用GetString方法        //  2.采用Item方式        //  3.采用GetValue方法        //语句中使用了Isdbnull方法来判断分数栏是否为空        Response.Write(string.Format("name:{0}    Age:{1}    score:{2}<br/>",reader.Isdbnull(4) ? "无" : reader.GetValue(4)));    }}

结果:

 

使用参数 介绍

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

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

如何实现?

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

注意:

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

@H_839_301@对应C# @H_839_301@  @H_839_301@ref @H_839_301@out
ParameterDirection取值 描述 对应sql
input 输入  
inputOutput 输入输出 对应output
Output 输出
ReturnValue 返回值    
例子
string connectionString = ConfigurationManager.ConnectionStrings["dbstconnectionstring"].ConnectionString;//注意://  此处换为sqlConnection,原来为DbConnectionsqlConnection connection = new sqlConnection(connectionString);//注意://  此处换为sqlCommand,原来为DbCommandsqlCommand 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,Employeescore)    values (@Employeename,@EmployeeAge,@EmployeeDepartmentID,@Employeescore)        set @outValue='成功!'        return

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

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

ReturnValue:1outValue:成功! 

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

ReturnValue:-1outValue:用户名重复 

实现事务

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

事务的特性:

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

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

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

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

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

表结构如下:

表内容如下:

 

现在,我们向表中添加一系列的用户,因为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_connectiongoSET TRANSACTION ISolATION LEVEL READ COMMITTED;BEGIN TRANSACTIONgoinsert into bank(customername,customermoney) values ('小张',0)goinsert into bank(customername,customermoney) values ('小王',customermoney) values ('李四',0)goIF @@TRANCOUNT > 0 RolLBACK TRANSACTIONgo

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

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

exec sp_reset_connectiongoSET TRANSACTION ISolATION LEVEL READ COMMITTED;BEGIN TRANSACTIONgoinsert into bank(customername,customermoney) values ('小赵',0)goCOMMIT TRANSACTIONgo

数据库Customer表的内容如下:

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


查看原谅请点击这里。

总结

以上是内存溢出为你收集整理的ADO.NET 连接方式进行数据访问全部内容,希望文章能够帮你解决ADO.NET 连接方式进行数据访问所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1178560.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-02
下一篇 2022-06-02

发表评论

登录后才能评论

评论列表(0条)

保存