ADO.NET中添加事务
在存储过程中使用事务
- 直接将数据里端事务编写到存储过程中
- 应用程序直接调用带有事务的存储过程
当需要同时执行多条SQL更新语句时
- 使用ADO.NET专用的事务处理对象
- 编写通用的数据访问方法
ADO.NET中使用事务
C#中所编写的所有的事务都是通过SQL代码进行的编辑,但是在C#环境中所有的SQL代码都是字符串
public static int UpdateByTran(List<string> sqlList)
{
SqlConnection con = new SqlConnection(constr);
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
try
{
//开启数据库连接
con.Open();
//开始执行事务
cmd.Transaction = con.BeginTransaction();
int result = 0;
//遍历事务中的每一条SQL修改代码,保证遍历到的每一条SQL代码都会执行成功,才会执行到Commit,SQL语句中只要有一条SQL代码抛异常则都会进入Catch中
foreach (string sql in sqlList)
{
cmd.CommandText = sql;
//对每条SQL代码的执行结果进行接收
result+=cmd.ExecuteNonQuery();
}
cmd.Transaction.Commit();//提交事务
return result;
}
catch (Exception ex)
{
if (cmd.Transaction!=null)
{
cmd.Transaction.Rollback();
}
//throw new Exception("调用事务更新方法时出现异常!"+ex.Message) ;
return -1;
}
finally
{
if (cmd.Transaction!=null)
{
cmd.Transaction = null;
}
con.Close();
}
}
SQL注入解决
ADO.NET参数技术
-
SQL中的参数
-
在ADO.NET中将sql语句中的关键数据进行使用参数对象进行处理
/// <summary> /// 查询结果用DataReader读取 /// </summary> /// <param name="sql">查询的SQL语句</param> /// <param name="parameters">SQL语句中的所有参数</param> /// <returns></returns> public static SqlDataReader GetReader(string sql,SqlParameter[] parameters) { SqlConnection con = new SqlConnection(constr); SqlCommand cmd = new SqlCommand(sql, con); if (parameters!=null) { cmd.Parameters.AddRange(parameters);//将SQL语句中的所有参数对象接收 } try { con.Open(); //不需要手动关闭con,当DataReader关闭时,con自动跟着关闭 return cmd.ExecuteReader(CommandBehavior.CloseConnection); } catch (Exception ex) { con.Close(); //记入系统日志 throw ex; } }
public Admins GetAdmins(Admins adm)
{
string sql = string.Format("SELECT * FROM Admins WHERE LoginId=@id AND LoginPwd=@Pwd");
SqlParameter[] parameters =
{
new SqlParameter("@id", System.Data.SqlDbType.Int),
new SqlParameter("@Pwd", System.Data.SqlDbType.VarChar,50)
};
parameters[0].Value = adm.LoginId;
parameters[1].Value = adm.LoginPwd;
SqlDataReader reader = DBHelper.SQLHelper.GetReader(sql,parameters);
Admins use = null;
while (reader.Read())
{
use = new Admins()
{
AdminName = reader["AdminName"].ToString(),
LoginId = Convert.ToInt32(reader["LoginId"]),
LoginPwd = reader["LoginPwd"].ToString()
};
}
reader.Close();
return use;
}
ADO.NET+存储过程
实现思路
- 先将SQL业务逻辑在SQL中编辑好
- 在CMD中设置CMD的格式类型为存储过程类型
- SQL语句使用存储过程名称,参数和存储过程中参数一致
CREATE PROC AdminLog
@Id INT,
@Pwd VARCHAR(20)
AS
SELECT * FROM Admins WHERE LoginId=@Id AND LoginPwd=@Pwd
EXEC AdminLog 1000,'123456'
/// <summary>
/// 查询结果用DataReader读取
/// </summary>
/// <param name="procName">存储过程的名称</param>
/// <param name="parameters">SQL语句中的所有参数</param>
/// <returns></returns>
public static SqlDataReader GetReaderByPROC(string procName, SqlParameter[] parameters)
{
SqlConnection con = new SqlConnection(constr);
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
//调用存储过程
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = procName;
if (parameters != null)
{
cmd.Parameters.AddRange(parameters);//将SQL语句中的所有参数对象接收
}
try
{
con.Open();
//不需要手动关闭con,当DataReader关闭时,con自动跟着关闭
return cmd.ExecuteReader(CommandBehavior.CloseConnection);
}
catch (Exception ex)
{
con.Close();
//记入系统日志
throw ex;
}
}
public Admins GetAdmins(Admins adm)
{
string procName = "AdminLog";
SqlParameter[] parameters =
{
new SqlParameter("@id", System.Data.SqlDbType.Int),
new SqlParameter("@Pwd", System.Data.SqlDbType.VarChar,50)
};
parameters[0].Value = adm.LoginId;
parameters[1].Value = adm.LoginPwd;
SqlDataReader reader = DBHelper.SQLHelper.GetReaderByPROC(procName,parameters);
Admins use = null;
while (reader.Read())
{
use = new Admins()
{
AdminName = reader["AdminName"].ToString(),
LoginId = Convert.ToInt32(reader["LoginId"]),
LoginPwd = reader["LoginPwd"].ToString()
};
}
reader.Close();
return use;
}