转自:http://www.cnblogs.com/oneword/archive/2010/09/10/1823414.html

连接到数据源

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

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:表的名称(用的比较少)
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属性为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

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

  • 最后来看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)));
}
}

结果:

使用参数

  • 介绍

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.

表结构如下:

表内容如下:

现在,我们向表中添加一系列的用户,因为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表的内容如下:

小结

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

ADO.NET 连接方式进行数据库访问的更多相关文章

  1. ADO.NET 连接方式和非链接方式访问数据库

    一.//连接方式访问数据库的主要步骤(利用DataReader对象实现数据库连接模式) 1.创建连接对象(连接字符串) SqlConnection con = new SqlConnection(Co ...

  2. ADO.NET连接方式

    使用Command.DataReader和DataSet两种方法实现数据绑定 方法1:使用Command和DataReader SqlConnection con = new SqlConnectio ...

  3. [转载]C#中使用ADO.NET连接SQL Server数据库,自动增长字段用作主键,处理事务时的基本方法

    问题描述: 假设在数据库中存在以下两张数据表: User表,存放用户的基本信息,基本结构如下所示:   类型 说明 ID_User int 自动增长字段,用作该表的主键 UserName varcha ...

  4. 【转】PowerShell 连接SQL Server 数据库 - ADO.NET

    转至:http://www.pstips.net/connect-sql-database.html PowerShell 通过ADO.NET连接SQL Server数据库,并执行SQL脚本.工作中整 ...

  5. C#与数据库访问技术总结(十八)

    ADO.NET 代码综合示例 前面已经介绍过OLE DB.NET和SQL Server.NET数据提供者可以用来连接不同的数据源. 以下代码不仅综合演示了使用ADO.NET的这两种数据提供者访问数据库 ...

  6. Java数据库连接——jdbc-odbc桥连接方式及汉字乱码问题

    jdbc-odbc桥连接方式操作数据库SU(Course),其中Course属性有Cno,Cname,Cpno,Ccredit. 步骤: 1.配置数据源 控制面板下搜索管理工具->ODBC数据源 ...

  7. .net(C#数据库访问) Mysql,Sql server,Sqlite,Access四种数据库的连接方式

    便签记录Mysql,Sql server,Sqlite,Access四种数据库的简单连接方式 //using MySql.Data.MySqlClient; #region 执行简单SQL语句,使用M ...

  8. ADO.NET编程之美----数据访问方式(面向连接与面向无连接)

    最近,在学习ADO.NET时,其中提到了数据访问方式:面向连接与面向无连接.于是,百度了一下,发现并没有很好的资料,然而,在学校图书馆中发现一本好书(<ASP.NET MVC5 网站开发之美&g ...

  9. 数据库访问接口(ODBC、OLE DB、ADO)

    最近在学C#的数据库编程,对于数据库接口技术这块的知识一直比较模糊,网上查了不少资料,看了几天还是朦朦胧胧的,只能做些笔记再研究了. 我们都知道,“数据库”是指一组相关信息的集合,最早的计算机应用之一 ...

随机推荐

  1. js 判断iframe是否加载完毕

      js 判断iframe是否加载完毕 CreationTime--2018年9月13日15点30分 Author:Marydon 1.javascript实现 window.onload = fun ...

  2. fread与read的差别(文件io补充)

    这里有一个我们常常提出的问题就是fread,read的差别.(当然这两个分别代表了操作文件系统的两套不同的函数,包含open,read, write, seek 等). 一.他们的差别就是一个(rea ...

  3. shell之“>/dev/null 2>&1”

    shell之“>/dev/null 2>&1” http://ixdba.blog.51cto.com/2895551/526442 今天在自己的一个技术群中又被问道了这么一个问题 ...

  4. HTML5动感圆圈

    概述 利用HTML5 Canvas实现的炫酷动感的圆圈动画. 详细 代码下载:http://www.demodashi.com/demo/10419.html 一.准备工作 本demo使用HTML5进 ...

  5. PHP扩展的基本结构

    1.下载php源码 git clone https://github.com/php/php-src.git  2,创建扩展 cd php-src/ext/ ./ext_skel --extname= ...

  6. caffe与MATLAB连接踩的坑

    刚来公司用的服务器,分配给自己账号,安装了caffe,配好了Makefile.config中的MATLAB dir. 之后问题来了 解决方法: 在Makefile里面,大约第410行那一句话CXXFL ...

  7. 【转】ubuntu如何修改/添加/删除硬盘分区的挂载(点)?

    我(macroliu)的问题:安装ubuntu时,/home单独挂载在一个分区,此后我想调整分区大小,删除了/home对应的分区以及另外几个分区,导致开机时找不到挂载点.把硬盘空闲空间分好区后,想把1 ...

  8. mermaid 语法

    a:focus { outline: thin dotted #333; outline: 5px auto -webkit-focus-ring-color; outline-offset: -2p ...

  9. python学习笔记011——内置函数__module__、__name__

    1 __module__描述 __module__ : 如果当前模块为顶层模块执行 则打印__main__ 如果当前模块为被调用模块的时候 打印当前模块的名称 2 __module__示例 def f ...

  10. python解压压缩包的几种方法

    这里讨论使用Python解压例如以下五种压缩文件: .gz .tar  .tgz .zip .rar 简单介绍 gz: 即gzip.通常仅仅能压缩一个文件.与tar结合起来就能够实现先打包,再压缩. ...