数据绑定

SQlDataAdapter
绑定数据 dataGridView绑定数据

DataSet ds; SqlDataAdapter sda;
//显示数据按钮
ds= new DataSet();
using (sda=new SqlDataAdapter(@"select * from Person,@"server连接字符串""))
{
sda.Fill(ds);
dataGridView1.DataCource=ds.Tables[0];
}
保存按钮
DataTable dt=(DataTable)dataGridView.DataSource;//把datagridview数据获得转化成datatable类型
using(sda=new SqlDataAdapter(@"select * from Person",@"连接字符串"))
{
SqlcommandBuilder scb=new SqlCommandBuilder(sda);//SqlCommandBuilder自动生成表单命令,用于更改dataset与数据库协调
sda.Updata(dt);
MessageBox.Show("OK");
}

为combobox绑定数据
确定数据源
combobox1.DataSource=ds.Table[0];
确定显示的列
combobox1.DisplayMember=ds.Tables[0].Columns["Fname"].Tostring();
确定选中后的对应的值
combobox1.ValueMember=ds.Tables[0].Columns["Fage"].Tostring();

Combobox1选中后的显示
if(comboBox1.SelectedValue.ToString()!="System.DataRowView")
{
MessageBox.Show(conboBox1.SelectedValue.ToString());
}

--------------------------
登录

需要一张表
if(object_id('useLogin','U'))is not null
drop table useLogin;
go
create table useLogin
(
id int identity(1,1)paimary key,
uaename nvarchar(10),
pwd varchar(20),
loginTime datetime degault(getdate()),
errortimes int default(0)
)

登录按钮
if(string.IsNUllOrWhiteSpace(txtuid.text.trim())||string.IsNUllOrWhiteSpace(txtpwd.text.trim())
{
return;
}
//获得用户名与密码
string uid=txtuid.text.trim();
string pwd=txtpwdd.text.trim();
//判断是否大于3次,则告知3分钟再登录
sql语句 select errpertimes.datediff(minute,logintime,gardate()) as dif from useloing where usename=@uid if(!isloginable(uid))
{
MessageBox.show("不能登录,等4分钟");
}

string strconn=configurationmanager.connectionstrings["sql"].connectionstring;
string sql=@"select count(*) feom useLogin where usename=@name and pwd=@pwd";
//装配参数
Sqlparameter[] para={new sqlparameter("@name",uid),new sqlparameter("@pwd",pwd)};
int count =convert.Toint32(mysqlhelper.sqlhelper.executeScalar(sql,para));
if(count>0)
{
messagebox.show("登录成功");
}
else
{
//一旦失败就记录次数,并记录时间
//添加sql语句
string sql=@"update useLogin set loginTime=gatetime(),errortimes=errortimes+1 where usename=@uid";
//装配参数
sqlparameter p=new sqlparameter("@uid",uid);
//执行sql语句
Mysqlhelper.ExecuteNonQuery(sql ,p);
messagebox.show("失败");

}

private bool isloginable(string uid)
{
string sql=@"select errpertimes.datediff(minute,logintime,gardate()) as dif from useloing where usename=@uid";
sqlparatemer p=new sqlparameter("uid",uid);
using(sqldatareader reader=mysqlheleper.sqlhelper.executereader(sql,p))
{
if(reader.hasrows)
{
reader.read();
int times=convert.Toint32(reader["errortimes"]);
int dif=Convert.Toint32(reader["dif"]);

if(times<=3||dif>4)
{
return true;
}
else
{
return false;
}
}
}
}
--------------------------
case函数
一个case对应于一个字段 有2个语法
类似switch

case 字段名 when 值 then '显示1' when 值2 then '显示2' end
if -else结构

case when 关于字段的表达式(要求是布尔的) then 显示
when 关于字段的表达式 then 显示
else 显示什么
end
------------
竖表转换成横表(面试题)
create table Score
(
学号 nvarchar(10),
课程 nvarchar(10),
成绩 int
)

insert into Score values('0001','语文',87);
insert into Score values('0001','数学',79);
insert into Score values('0001','英语',95);
insert into Score values('0002','语文',69);
insert into Score values('0002','数学',84);
select * from Score
//前面不能显示各个科目,可以考虑使用聚合函数
select 学号,sum(case 课程 when '语文' then 成绩 else 0 end)as 语文 ,
sum(case 课程 when '数学' then 成绩 else 0 end)as 数学 ,
sum(case 课程 when '英语' then 成绩 else 0 end)as 英语
from Score group by 学号
--------------------------------
(面试题)
create table test
(
number varchar(10),
amount int
)
insert into test(number,amount) values('RK1',10)
insert into test(number,amount) values('RK2',20)
insert into test(number,amount) values('RK3',-30)
insert into test(number,amount) values('RK4',-10)

select * from test

select number as 单号,
case
when amount>0 then amount
else 0
end as 收入,
case
when amount<0 then -amount
else 0
end as 支出
from test
---------------------------
子查询 查询"某某"的考试成绩
进行一个查询,得到一个单值数据
将这个单值作为另一个查询的一部分(条件或结果)
就称这个查询为单值子查询

select stuId from stu where stuname='梅田喝' 将子查询写处理啊,然后用括号起来
写外查询,写条件,并将子查询连同括号当作一个值使用
select * from Scor where stuId=(select stuId from stu where stuName='张三')

显然每次只能使用一个值,比较麻烦
若想知道多个学的分数就比较麻烦
多值子查询就是内部查询(就是括号括起来的查询)可以返回一列数据
在外部查询中使用in即可
select stuId from Stu where stuGender='m'

select * from Scor where stuid in(select stuId from Stu where stuGender='m')

查询最高,最低,与平均分
select
(select max(studatabase) from scor) as 最高分,
(select max(studatabase) from scor) as 最高分,
(select avg(studatabase) from scor) as 平均分

删掉 所有20岁的人
delete from person where fid in(select fid from where age=20)
-----------------------
表连接
1,交叉连接(笛卡尔积)
create table tblnum1
(
num int
)
create table tblnum2
(
num int
) 插入一些数据
insert into tblnum1(num) values(1)
insert into tblnum1(num) values(2)
insert into tblnum1(num) values(3)
insert into tblnum2(num) values(7),(8),(9) //08版的语法

语法,连接都是from阶段进行的
交叉连接只需要写成 from 表1 cross join 表2
select t1.num,t2.num from tbl1num1 as t1 cross join tblnum2 as t2 order by num


交叉连接生成数字辅助表
create table tblnum
(
num int
)
insert into tblnum values(0),(1),(3),(4),(5)
select *from tblnum
自交叉一次
select t1.num,t2.num
from
tblnum as t1
cross join
tblnum as t2
------------------------------------
内连接 inner join
首先进行交叉连接,然后进行筛选(on),然后查看是否有为null的数据,如果有就删除为null的这一行数据

select t1.Stuid,t1.Stuname,
t2.Stuid,t2.Scid
from
stu as t1
inner join
scor as t2
on t1.stuId=t2.stuId

-----------下午----------------------
内连接与交叉连接的区别 是可以筛选重复的项
-----------------
外连接(左外连接,右外连接)left join 和right join
先执行笛卡尔积(cross join)
利用连接属性(以哪一张表为外主表),将主表中有的数据而另一张没有的数据加进来,没数据的默认为null
select t1.stuid,t1.stuname,isnull(t2.stuid,0)as 学生id,isnull(t2.scid,0) as 分数id,t2.*
from
stu as t1
left join
scor as t2
on t1.stuid=t2.stuid
所有连接操作都是在from级别的操作
语法均是 from
表名 as t1
连接类型
表名 as t2
on 条件
-------聚合函数 isnull(t2.stuid,0) //如果t2.stuid为null时默认为0

select
t1.*,t2.*
from
stu as t1
inner join
course as t2
on t1.cid=t2.cid1.stuisdel=0
where t
---------------------------
表表达式
select t.字段 from(查询的结果集)as t
派生表
就是将一个slect查询出的表值结果集作为数据源进行第二次查询
作为数据源的查询语句,绝对不能包含order by语句,但是可以top ... order by
作为数据源的查询语句一定要包含列名
如果做连接的的表也是一张连接表
就是说派生表中还有派生表

----例如下面例子
select
t.cName,t.cDescription
from
(select top 100 percent
t1.stuId,
t1.stuName,
YEAR(GETDATE())-Year(t1.stuBirthday) as stuAge,
case t1.stuGender
when 'm' then '男'
when 'f' then '女'
end as stuGender,
t1.stuPhone,
t1.stuEmail,
t1.stuAddress,
t1.stuSchool,
t1.stuInputTime,

t2.cName, t2.cDescription
from
Stu as t1
inner join
Course as t2
on t1.cId = t2.cId
where
t1.stuIsDel = 0
order by t1.stuId
) as t
where
t.stuName = '张三'
---
发现派生表的嵌套查询,比较混乱
一般将定义在外边,其后直接引用
公共表表达式 (CTE)
with 自定义的表名(t) as
(
查询语句
)

with t as
(
select top 100 percent
t1.stuId,
t1.stuName,
YEAR(GETDATE())-Year(t1.stuBirthday) as stuAge,
case t1.stuGender
when 'm' then '男'
when 'f' then '女'
end as stuGender,
t1.stuPhone,
t1.stuEmail,
t1.stuAddress,
t1.stuSchool,
t1.stuInputTime,

t2.cName, t2.cDescription
from
Stu as t1
inner join
Course as t2
on t1.cId = t2.cId
where
t1.stuIsDel = 0
order by t1.stuId
)
select * from t;

-------------------------------
创建视图 使用视图是为了方便,不占用数据库的空间
create view vw_StuInfo
as
select top 100 percent
t1.stuid,
t1.stuname,
year(getdate())-year(t1.stubirthday) as stuage,
case t1.stugender
when 'm' then '男'
when 'f' then '女'
end as stugender,
t1.stuphone,
t1.stuemail,
t1.stuschool,
t1.stuinputtime,
t2.cname,
t2.cdescription
from
stu as t1
inner join
course as t2
on t1.cid=t2.cid
where
t1.stuisdel=0
order by t1.stuid
使用视图
select * from vw_stuinfo
-----------------------------、
实现分页
between and
每页显示3条数据
select * from Person where fid between 1 and 3

row_number() //是08版本专门出的函数,在结果中增加一列自动增长的数字
row_number() over(order by 字段)
如果fid是连续的自然数
利用派生表,为表添加一列作为表值集作为数据源 select *
from
(
select row_number() over by(fid)as id ,fname,fgender,fage,from person
) as t
where t.id between 1 and 10
将分页的数据源做成视图
create view vw_TestFenye
as select Row_number() over (order by Fid) as id,Fid,Fname,Fgender,Fage from Person


执行
select * from vw_TestFenye
where vw_TestFenye.id between(2-1)*3+1 and 2*3

-------------------------------------
创建一个分页的表值函数(了解的内容)
create function fn_FenyeTest
(@index as int,@count as int)returns table
as
return
select * from vw_TestFenYe
where vw_TestFenYe.id between (@index-1)*@count+1 and @index*@count

//执行
select * from fn_FenYeTest(2,10)


------------------------
声明局部变量
先声明
declare @变量名 类型
再赋值
set @变量名=值
再使用


declare @index int
declare @count int
set @index=1
set @index-7
seleect * from vw_testfenye //vw_testfenye是视图
where vw_testfenye.id between(@index-1)*@count and @index*@count
局部变量的第二种赋值方式
declared @count int
select @count=count(*)from stu

declare @num int=100 //直接赋值。08版本以上才有

系统变量
select @@version 版本信息
select @@error(最后一次错误的错误号)
--------------------------------------
if else
如果查出来了数据就显示查出来了,否则显示没数据 Declare @count int
select @count=count(*) from stu
if(@count>0)
begin
print '查出来了'+Convert(varchar(5),@count)+'条结果'
end
else
print '没有结果'
end
-------------------------------
while
计算1到100的和 declare @i int=1
declare @sum int
set @sum=0
while(@i<=100)
begin
set @sum=@sum+@i
set @i=@i+1
end
----------------------
事务语法
begin transaction
开启以后,其后所有的代码将作为一个整体
并且等待提交commint(提交), rollback(回滚,就是恢复之前)
create table bank
(
cid int
balance int check(balance>10)
)
begin transaction
declare @MyError=0
updata bank set balance=balance-1000 where cid='001'
set @MyError+=@@Error
updata bank set balance=balance+1000 where cid='002'
set @MyError+=@@Error

if(@MyError>0)
begin
rollback
end
else
commit
end
---------------
处理事务的异常

begin try
end try

begin catch
end catch

begin transaction
begin try
updata bank set balance=balance-1000 where cid='001'
updata bank set balance=balance+1000 where cid='002'
end try
begin catch
rollback
end catch

-----------------------
目前可以简单的理解‘存储过程’为数据库中的函数
语法
create proc usp_存储过程名
as
begin
T-SQL语句
end


例子
创建存储过程
create Proc usp_zz
as
begin
begin transaction
begin try
updata bank set balance=balance-1000 where cid='001'
updata bank set balance=balance+1000 where cid='002'
commit
end try
begin catch
rollback
end catch
end

exec usp_zz //执行
-------------
修改存储过程 alter Proc usp_zz
as
begin
begintranssction
begin try
updata bank set balance=balance-1000 where cid='001'
updata bank set balance=balance+1000 where cid='002' end try
begin catch
rollback
end catch
end
-------------

带有变量的存储过程
alert Proe usp_zzpara
@money money
as
begin
begin transaction
begin try
updata bank set balance=balance-@money where cid='001'
updata bank set balance=balance+@money where cid='002'
commint
end try
begin catch
rollback
end catch
end
执行带有变量的存储过程
exec usp_zzpara @money=50
----------------------------
更改数据库名称
use master //因为是系统的存储过程,必须在系统数据库里
go
//把数据库MyDataBase名字改成yzk
exec sp_renamedb 'MyDataBase','yzk'
----------------------
select top 10 * from vw_TestFenye
create proc usp_Select
@top int=10
as
select top (@top) * from vw_TestFenye
exec usp_Select @top=4 //当不写出@top时默认为10
---------------
带有返回值的存储过程
create proc usp_Select
@count int output
as
select @count=count(*) from vw_TestFenye 调用存储过程
//先定义一个接收变量
declare @c int
exec use_Select @c output
print @c //打印出@c

 

posted @ 2012-09-18 00:35  美国如来不如中国上帝  阅读(280)  评论(0编辑  收藏  举报