连接到数据源
连接到数据源需要使用两步:
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.con@R_404_6408@,然后通过从该文件中获取连接信息.
例2:
web.con@R_404_6408@中配置如下:
<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 = Con@R_404[email protected]["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命令.
我们以下表,表结构如下:
表中数据如下:
请看以下示例:
string connectionString = Con@R_404[email protected]["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();
看以下示例:
string connectionString = Con@R_404[email protected]["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 系统存储过程调用命令.
属性或方法 | 类别 | 描述 |
Item | 属性 | |
Read | 方法 | sql语句或存储过程的名字 |
GetXXX | 方法 | 获取值,其中XXX指String,Int32等等 |
GetValues | 方法 | 一次性获取当前所有的列 |
Isdbnull | 方法 | 测试当前值是否为Null |
Close | 方法 | 当Read返回为false时,应及时关闭DataReader,释放连接 |
例1:
string connectionString = Con@R_404[email protected]["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 = Con@R_404[email protected]["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))); } }
结果:
使用参数
- 介绍
- 如何实现?
使用Command的Parameters可以实现我们向其中添加参数.
注意:
参数类型可以由Direction来设置,该属性值为一个枚举类型,取值如下:
ParameterDirection取值 描述 对应C# 对应sql Input 输入 InputOutput 输入输出 ref 对应output Output 输出 out ReturnValue 返回值
- 例子
string connectionString = Con@R_404[email protected]["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,Employeescore) values (@EmployeeName,@EmployeeAge,@EmployeeDepartmentID,@Employeescore) set @outValue='成功!' return
第一次运行时,结果如下:
ReturnValue:1 outValue:成功!
第二次运行时:结果如下:
ReturnValue:-1 outValue:用户名重复
实现事务
事务是一系列相互关联的任务,作为一个整体成功提交或失败(提交或回滚).
事务的特性:
Atomicity(原子):事务或者全部提交,或者全不提交
Consistency(一致):事务保证了数据的完整性
Isolation(分离):事务处理了数据操作的并发性
Durability(持续):即使在事务结束后,发生系统崩溃等灾难性情况,事务涉及的数据操作也将正常保存
先看使用sql来实现事务.还是看例子来理解,我们现在新增一个表:Bank.
表结构如下:
表内容如下:
string[] customerList = new string[] { "小张","小王","李四","小赵" }; string connectionString = Con@R_404[email protected]["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 ('小王',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 COMMIT TRANSACTION go
小结
查看原谅请点击这里。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。