ADO.NET
1.程序端数据集
DataSet、DataTable,DataRow、DataColumn...
可以将从数据库中查询的数据存放在程序缓存中,并提供一系列操作
2..NET Framework数据提供程序
Connection、DataAdapter、DataReader、Command
用来直接操作数据库
一、增删改操作
1.连接通道的连接字符串
int res=-1;准备接受新增影响的行数
string conStr=@"server=;database=;uid=;pwd=;";
string conStr=@"server=;database=;Integrated Security=True";(SQL Server中使用windows系统身份验证)
2.连接通道对象
SqlConnection conn=new SqlConnection(conStr);
或者
SqlConnection conn=new SqlConnection();
conn.ConnectionSting=conStr;
3.准备新增的sql命令
string sqlStr="Insert into Book(b_cid,b_title...) values()";
4.新建命令对象,并传进conn(连接)和要进行的操作的Sql语句
SqlCommand cmd=new SqlCommand(Sqlstr,conn);
5.打开通道
conn.Open();
6.调用方法去数据库执行sql语句
res.cmd.ExecuteNonQuery();//此方法负责增、删、改,返回受影响的行数(int)
6.关闭通道
conn.Close();
二、查询操作
注意Command对象的几个方法的区别
ExecuteScalar() //调用此方法,获得查询语句在数据库执行后得到的结果集的第一个单元格的值,返回类型是Object
三、查询多行数据--DataReader逐行读取,返回一行数据
SqlConnection con=new SqlConnection(constr);
string sqlStr="select * from Book";
SqlCommand cmd =new SqlCommand(sqlStr,con);//在这里分别指定Command的CommandText和Connection
con.Open();
//声明一个读取器对象,并调用cmd的方法返回该对象
SqlDataReader dr=cmd.ExecuteReader();
if(dr.HasRows) //如果返回的数据行不为空则返回true
{
whlie(dr.Read()) //read方法,如果读到下一行数据,则返回true,而且dr本身就等于那一行数据
{
Console.WriteLine(dr[0].ToString());
//dr[0]指返回的对象是该行的第一列数据,这里也可以
使用dr[结果集的列名!!]
还可以使用dr.GetString(0),GetInt32()方法获得单元格的值,
dr.GetOrdinal("b_cid") //传入列名,找到它在结果集中的下标,返回int
dr.GetValue();获取单元格的值,返回Object
}
}
dr.Close();//关闭读取器
con.Close();//关闭连接通道
四、使用适配器读取数据
无需代码开通连接通道,自动开通
SqlConnection con=new SqlConnection(conStr);
string sqlStr="select * from Book";
//创建适配器对象,告诉它要做的事情(sqlStr),走哪条路(con)
SqlDataAdapter da=new SqlDataAdapter(sqlStr,con);
//创建数据集对象(程序端的临时数据库)
DataSet ds=new Dataset();
//调用fill方法,填充数据集。(先去数据库查询结果集,并把结果集返回赋值给数据集)
da.fill(ds);
DataTable dt=ds.Table[0];
for(int i=0;i<dt.Row.Count;i++)
{
DataRow dr=dt.Rows[i];
Console.WriteLine(dr[0].ToString()); //访问行对象单元格dr[索引值或者列名]
}
上列的代码中可以直接将SqlDataAdapter 赋值给DataTable对象
五、调用存储过程
单个参数的存储过程
string conStr=@"server=;database=;Integrated Security=True";
SqlConnection con=new SqlConnection(conStr);
SqlCommand cmd = new SqlCommand("存储过程名称",con);
cmd.CommandType=CommandType.StoredProcedure; //指定“命令类型”为存储过程
SqlParameter sp =new SqlParameter(); //指定存储过程中的“参数”
sp.ParameterName="@cateId";
sp.SqlDbType=SqlDbType.Int;
sp.Size=4; //设置参数长度
sp.Value=2;
cmd.Parameter.Add(sp); //将“参数”对象加入到命令对象的参数集合中
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataTable dt =new DataTable();
da.Fill(dt);
foreach(DataRow dr in dt.Rows)
{
Console.WriteLine(dr[0].ToString()+"_"+dr[1].ToString() + "_"+dr["b_title"]);
}
六、调用存储过程
多个参数的存储过程
string conStr=@"server=;database=;Integrated Security=True";
SqlConnection con=new SqlConnection(conStr);
SqlCommand cmd = new SqlCommand("存储过程名称",con);
cmd.CommandType=CommandType.StoredProcedure; //指定“命令类型”为存储过程
//多个参数
SqlParameter[] sp2 ={ new SqlParameter("@pageIndex",SqlDbType.Int,4),new SqlParameter("@pageSize",SqlDbType.Int,4)};
sp2[0] = 1;
sp2[1] = 3;
cmd.Parameter.AddRange(sp2); //将“参数”对象加入到命令对象的参数集合中
con.Open();
SqlDataReader dr =cmd.ExecuteReader();
while(dr.Read())
{
Console.WriteLine("id="+dr[0].ToString());
}
dr.Close();
con.CLose();
六、调用存储过程
多个参数的存储过程,且包含输出参数(output)
string conStr=@"server=;database=;Integrated Security=True";
SqlConnection con=new SqlConnection(conStr);
SqlCommand cmd = new SqlCommand("存储过程名称",con);
cmd.CommandType=CommandType.StoredProcedure; //指定“命令类型”为存储过程
//多个参数
SqlParameter[] sp2 ={
new SqlParameter("@pageIndex",SqlDbType.Int),
new SqlParameter("@pageSize",SqlDbType.Int),
new SqlParameter("@pageCount",SqlDbType.Int),
new SqlParameter("@rowCount",SqlDbType.Int)
};
sp2[0] = 1;
sp2[1] = 3;
sp2[2].Direction = PamameterDirection.Output; //设置参数的输出方向
sp2[3].Direction = PamameterDirection.Output; //设置参数的输出方向
cmd.Parameter.AddRange(sp2); //将“参数”对象加入到命令对象的参数集合中
SqlDataAdapter da =new SqlDataAdapter(cmd);
DataTable dt =new DataTable();
da.Fill(dt);
foreach(DataRow dr in dt.Rows)
{
Console.WriteLine(dr[0].ToString()+"_"+dr[1].ToString() + "_"+dr[2].ToString());
}
int pageCount=Convert.ToInt32(cmd.Parameters[2].Value);
int rowCount=Convert.ToInt32(cmd.Parameters[3].Value);
Console.WriteLine("pageCount="+pageCount+",rowCount="+rowCount);
存储过程
通过row_number进行分页操作
create proc usp_GetPagedBooks
@pageIndex int=1
as
select * from
(
select
row_number() over (order by C_ID) as 分页字段,*
form
Category) as a
where
a.分页字段 > (@pageIndex-1)*5 and a.分页字段 <= @pageIndex*5
触发器
create trigger testForDel on Category
for delete
as
begin
select * from book
end
解释:对Category进行删除操作则会激活as后Sql语句
---创建一个带事务回滚的触发器
create trigger testForInsert on Category
for insert
as
begin
select * from book
begin transaction
rollback transaction
end