C#数据库

1. >配置文件
->首先在 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 





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值