->首先在 app.Config文件中添加 节点,如下:
<connectionStrings>
<add name="sql2" connectionString="server=.;uid=sa;pwd=123456;database=demo"/>
</connectionStrings>
->在项目中添加System.Configuration程序集引用(控制台和WinFrm才需要)
->在项目中使用ConfigurationManager获取链接字符串。
例如:ConfigurationManager.ConnectionStrings["配置的节点的Name名字"].ConnectionString
using(SqlConnrction conn = new sqlConnnection(constr)) {
Sqlcommand cmd = conn.createComendText()
}->ExcuteNonQuery() 执行非查询类的sql脚本,返回影响的行数->ExcuteScalar() 执行sql,返回第一行第一列的值->ExcuteReader() 返回SqlDataReader->Reader默认指向 数据行->Read()方法执行一次,指针向下走一次。
using(对象 自动关闭){
}
->SQL注入漏洞->一般在登录的场景下:使用一些特殊的字符进行对数据库进行攻击。-> ' or 2=2 --->Sql参数化:SqlParameter->DataSet和DataTable
2.SqlDataAdapter数据访问适配器。
string constr = ConfigurationManager.ConnectionStrings["sql"].ConnectionString; using (SqlConnection conn = new SqlConnection(constr)) { string strsql = @"SELECT uuid, userName, pwd, name, gender FROM tbl_emp"; using (SqlDataAdapter adapter = new SqlDataAdapter(strsql,conn)) { //adapter :一个链接,cmd.commandText(sql) DataTable dt = new DataTable(); adapter.Fill(dt);//把数据库中数据填充到数据表中 this.dgv.DataSource = dt; } }
3.分页
(1)select top 每页数* from 表1 where ID not in(select top((第几页-1)*每页数)) from 表1 order by id)order by id;
(2)select * from (select *,ROW_NUMBER() over(order by userid) as num from 表)as T where T.num between ((第几页-1)*每页数)and (第几页*每页数);
sql
--01:sql:游标。
--创建一个游标,然后遍历UserInfo表中的所有数据,打印 用户id和用户名。
--select * from UserInfo
----定义游标,让游标指向sql查询的结果。
--declare demoCursor Cursor for
-- select UserName,UserId,UserAge from UserInfo
----打开游标。
--open demoCursor
-- declare @UserName nvarchar(32)
-- declare @UserAge int
-- declare @UserId int
-- --把游标指向的数据取出来, 把数据放到 后面的三个变量中。
-- fetch next from demoCursor into @UserName,@UserId,@UserAge
-- while(@@FETCH_STATUS= 0)--@@FETCH_STATUS=0的时候表示,取数据成功。
-- begin
-- print @UserName
-- print @UserAge
-- print @UserId
-- update UserInfo set UserName=@UserName+'kk' where UserId=@UserId--给当前行的Name列加了后缀。
-- print '------------'
-- fetch next from demoCursor into @UserName,@UserId,@UserAge
-- end
--close demoCursor --关闭游标
--deallocate demoCursor--释放游标,释放后就不能再open
--02:视图
--创建视图:视图中就是放 年龄大于40的用户信息
--create View VW_UserInfo as
-- select * from UserInfo where UserAge>40
--视图的使用
--select * from VW_UserInfo --视图就可以直接用于select 查询,当做一张表来用。
--03:临时表
--临时表 在表名前面 加了 #,临时表 和普通的表:
----会话结束的时候,那么临时表就结束了。
--create table #TestTb
--(
-- Id int identity(1,1) primary key not null,
-- Name nvarchar(32) null
--)
----临时表的使用跟普通的表一样。
--select * from #TestTb
----临时表用完之后一定要: 释放掉临时表
--drop table #TestTb
--常用的临时表的用法
--select * into #Tb from Userinfo
--select * from #Tb
--drop table #Tb
--临时表可以用于 高并发的情况的优化
--join
--只要做表的连接;那么肯定就会 做两个表的笛卡尔积。
--一个查询中关联了7-8张表。
--表的数据非常多,另外表数据crud操作又非常频繁。
--数据库:锁概念。
-- 锁的级别在表级别。
-- X:排它锁 S:共享锁
-- insert、update、delete 会在表上加 X
-- select 在表上添加 S锁。
--多表连接
--假设:员工表:10000000000000 部门:10亿条
--使用临时表。
--select * from Employee as E
--left join Position as P on E.PositionId = p.PositionId
----优化的原则:就是尽早的释放锁。
--select * into #Emp from Employee
--select * into #Pos from Position
----
--select * from #Emp as E
--left join #Pos as P on P.PositionId=E.PositionId
--drop table #Emp
--drop table #Pos
--全局的临时表:所有的用户的会话都可以访问到。
--全局临时表会在所有用户都断开会话后,会自动释放。
--select * into ##Pos from Position--尽量不要全局的。
--drop table ##Pos
--04: try catch:sql的异常处理
--begin try
-- sql...
--end try
--begin catch
-- ...
--end catch
--05: 事务。Sql使用事务
--select * from UserInfo
--begin try
-- begin transaction--开启事务
-- update UserInfo set UserName=N'你好' where UserId=2
-- update UserInfo set UserAge=N'数量的解放路' where UserId=3
-- commit transaction--提交事务:上面执行结果执行到数据库里面去。
--end try
--begin catch
-- rollback transaction--回滚事务
--end catch
-- update UserInfo set UserName=N'sssss' where UserId=2
--06: 存储过程
--存储过程其实就是没有返回值的 一段sql代码。
if(exists(select * from sys.all_objects where name='Pro_UserInfo_GetUserInfo'))
drop proc Pro_UserInfo_GetUserInfo
go
--定义存储过程
--create proc Pro_UserInfo_GetUserInfo
--@UserAge int, --输入参数
--@Num int output--输出参数
--as
-- select * from UserInfo where UserAge>@UserAge
-- --在存储过程执行结束前必须给输出参数赋值。
-- select @Num=Count(*) from UserInfo--
-- print @Num
--go
----调用存储过程
--declare @Num int
--exec Pro_UserInfo_GetUserInfo 100,@Num out
--print @Num--执行完存储过程打印
--分页存储过程
--一页有两条,
--if(exists(select * from sys.all_objects where name='Pro_UserInfo_GetPageUserInfos'))
-- drop proc Pro_UserInfo_GetPageUserInfos
--go
--create proc Pro_UserInfo_GetPageUserInfos
--@PageSize int,
--@pageIndex int,
--@TotalCount int output
--as
--select * from (
-- select *,ROW_NUMBER() over(Order by UserId asc) as RowNum from UserInfo
--) as T
--where T.RowNum between ((@PageIndex-1)*@PageSize+1) and (@PageSize*@PageIndex)
----
--select @TotalCount=count(1) from UserInfo
----调用分页存储过程
--declare @Total int
----select * from userInfo
--exec Pro_UserInfo_GetPageUserInfos 2,4,@Total out
--print @Total
--select * from UserInfo
--系统存储过程
--exec sp_databases
--exec sp_tables
--exec sp_columns 'UserInfo'
--exec sp_databases
--select * from sys.all_objects
--declare @strSql nvarchar(max)
--set @strSql='select * from userinfo'
--把字符串当成一个sql脚本执行
--exec (@strSql)
--exec ('select * from UserInfo')
--exec sp_executesql @strSql --兼容性更强
--select getdate()
--select avg()
---自定义函数
--:把年龄大于传过来的参数的 数据的条数返回。
--create function FUN_GetUser(@UserAge int)
--returns int
--as
--begin
-- declare @result int
-- set @result=(select count(1) from UserInfo where UserAge>@UserAge)
-- return @result
--end
--select count(1) from UserInfo where UserAge>40
--select dbo.FUN_GetUser(40)
--表 值函数。
--create function FUN_UserInfo_GetUserInfo2(@UserAge int)
--returns table
--as
-- return ( select * from UserInfo where UserAge>@UserAge)
--select * from FUN_UserInfo_GetUserInfo(40)
--select * from Pro_UserInfo_GetUserInfo
--create table DemoLastDAy
--(
-- Id int identity(1,1) primary key not null,
-- Name nvarchar(32) null
--)
select * from DemoLastDAy
--insert into DemoLastDAy(Name) output inserted.Id values('sss222')
--cmd.ExucuteNonquery()
--cmd.ExucuteScalar();
insert into DemoLastDAy(Name) values('sfdsfdsljlsj')
//当DemoLastDAy发生了插入操作后,会触发下面这个触发器的执行。
create trigger TR_DemoLastDAy_Insert on DemoLastDAy
for insert
as
begin
declare @Id int
select @Id=Id from inserted-- 它是一张表。
update DemoLastDAy set Name=Name+cast(getdate() as nvarchar(32)) where Id=@Id
end