c#基础之ADO.NET(二)
2021-06-01 01:03
标签:line result security source 开启 use try pen sqlt (一)ADO.NET事务 定义:所谓事务,可以看做是一个操作单元,是最小的操作单位,在这个事务中的操作,要么全部执行成功,要么全部失败。 在一个事务性操作的环境下,操作有着以下的4种特性,被称为ACID特性 事务提交后,数据必须以一种持久性方式存储起来 (1)参数化查询 (2)修改--包含事务 ExcuteNonQuery---通常使用它来执行Update、Insert和Delete语句。 该方法返回值意义如下: 对于Update、Insert和Delete语句,返回值为该命令所影响的行数。 对于所有其他类型的语句,返回值为-1。 (3)异步 使用 ADO.NET 2.0 的异步进程 , 数据库连接字符串要添加 Asynchronous Processing=true 如果执行多条命令连接字符串还要添加 MultipleActiveResultSets=true string connSQL = @"data source=测试服务器;initial catalog=测试库;persist security info=True;user id=用户名;password=密码;MultipleActiveResultSets=True;Asynchronous Processing=true"; c#基础之ADO.NET(二) 标签:line result security source 开启 use try pen sqlt 原文地址:https://www.cnblogs.com/anjingdian/p/10994465.html
原子性(Atomicity)
当事务结束,它对所有资源状态的改变都被视为一个操作,这些操作要不同时成功,要不同时失败
一致性(Consistency)
操作完成后,所有数据必须符合业务规则,否则事务必须中止
隔离性(Isolation)
事务以相互隔离的方式执行,事务以外的实体无法知道事务过程中的中间状态
持久性(Durable)
//(1)构造连接字符串:如果integrated security=true表示可以在不知道数据库用户名和密码的情况下时,依然可以连接数据库,如果integrated security=false,或者不写,表示一定要输入正确的数据库登录名和密码。sspi ,相当于 True,建议用这个代替 True。
string connSQL = @"data source=服务器名称;initial catalog=数据库名称;persist security info=True;user id=用户名;password=密码;MultipleActiveResultSets=True";
//(2)生成连接字符串.--可以省略如果不能省略,下面要这样写SqlConnection conn = new SqlConnection(connStr.ConnectionString)
// SqlConnectionStringBuilder connStr = new SqlConnectionStringBuilder(connSQL);
//(3)打开到数据库的连接 :SqlConnection表示一个到 SQL Server 数据库的打开的连接
using (SqlConnection conn = new SqlConnection(connSQL))
{
try
{
//(4)打开连接
conn.Open();
//(5)实例SqlTransaction类--查询不用开事务
// SqlTransaction _tran = conn.BeginTransaction();
//(6)写一个sql命令,使用参数化命令--MenuID
StringBuilder strSQL = new StringBuilder();
strSQL.Append("select * from sys_menu where menuid>=@menuid and ParaID!=@ParaID");
//(7)为事务创建一个命令,创建command命令
SqlCommand cmd = new SqlCommand(strSQL.ToString(), conn);
// cmd.Transaction = _tran;
//构造Parameter对象
int mesnuid = 185;
int paraid = 0;
SqlParameter[] paras = new SqlParameter[] { new SqlParameter("@menuid", mesnuid), new SqlParameter("@ParaID", paraid) };
cmd.Parameters.AddRange(paras);
//(8)开启事务
// conn.BeginTransaction();
SqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
//FieldCount获取数据中的行数
for (int i = 0; i i)
{
//GetName指定列的名称,GetValue指定=列的值
Console.WriteLine("{0}:{1}", reader.GetName(i), reader.GetValue(i));
}
}
reader.Close();
Console.Read();
}
catch (Exception e)
{
//_tran.Rollback();
}
//(1)构造连接字符串:如果integrated security=true表示可以在不知道数据库用户名和密码的情况下时,依然可以连接数据库,如果integrated security=false,或者不写,
//表示一定要输入正确的数据库登录名和密码。sspi ,相当于 True,建议用这个代替 True。
string connSQL = @"data source=.;initial catalog=测试;persist security info=True;user id=测试;password=测试;MultipleActiveResultSets=True";
//(2)生成连接字符串.--可以省略如果不能省略,下面要这样写SqlConnection conn = new SqlConnection(connStr.ConnectionString)
// SqlConnectionStringBuilder connStr = new SqlConnectionStringBuilder(connSQL);
//(2)连接数据库
using(SqlConnection conn=new SqlConnection(connSQL))
{
//(3)开启--可以放到后面开始执行ExcuteNonQuery方法的时候开启连接。
conn.Open();
//(4)创建Command命令
string sql = "update sys_menu set iscount=@iscount where menuid=@menuid";
SqlCommand cmd = new SqlCommand(sql,conn);
//(5)参数化
int iscount=0;
int menuid=184;
SqlParameter[] para = new SqlParameter[] { new SqlParameter("@iscount", iscount), new SqlParameter("@menuid",menuid) };
cmd.Parameters.AddRange(para);
//(6)开启事务
SqlTransaction _tran = conn.BeginTransaction();
cmd.Transaction = _tran;
try
{
int RecordsAffected = cmd.ExecuteNonQuery();
_tran.Commit();
}
catch (Exception e)
{
_tran.Rollback();
}
conn.Close();
conn.Dispose();
}
using(SqlConnection conn=new SqlConnection(connSQL))
{
//(3)开启--可以放到后面开始执行ExcuteNonQuery方法的时候开启连接。
conn.Open();
//(4)创建Command命令
string sql = "update sys_menu set iscount=@iscount where menuid=@menuid";
StringBuilder strSQL = new StringBuilder();
for (int i = 184; i 210; ++i)
{
strSQL.Append("update sys_menu set iscount=0 where menuid=");
strSQL.Append(i+";");
}
SqlCommand cmd = new SqlCommand(strSQL.ToString(), conn);
//(6)开启事务
SqlTransaction _tran = conn.BeginTransaction();
cmd.Transaction = _tran;
try
{
IAsyncResult pending = cmd.BeginExecuteNonQuery();
while (pending.IsCompleted == false)
{
//异步未完成。可以在这里做其他操作。
for (int x = 0; x 10; x++)
{
Console.WriteLine(x*1);
}
}
Console.WriteLine("异步完成");
// int RecordsAffected = cmd.ExecuteNonQuery();
cmd.EndExecuteNonQuery(pending);
_tran.Commit();
}
catch (Exception e)
{
_tran.Rollback();
}
conn.Close();
conn.Dispose();
Console.Read();
}