上一篇文章简单介绍了下Nullable
Nullable在实际使用中很方便,但处理不好,问题也会让人很头疼
比如说ExecuteNonQuery()时如果使用XXXparameter
就可能出现 “需要参数 ‘@XXX’,但未提供该参数。”
解决起来其实也蛮简单
比如说原来是
parameters[0].Value = Name;
改成下面这样就可以了
parameters[0].Value = (object)Name??DBNull.Value;
其他的话不用多少了~
这篇文章主要是我自己用来简单记录下游标的,有兴趣的可以看看
高手Pass~
今天又朋友问我的,可惜我也不明白,找了点相关资料看了下。
以下引用自MSDNhttp://msdn.microsoft.com/zh-cn/library/ms191179.aspx
游标(数据库引擎)
关系数据库中的操作会对整个行集起作用。由 SELECT 语句返回的行集包括满足该语句的 WHERE 子句中条件的所有行。
这种由语句返回的完整行集称为结果集。应用程序,特别是交互式联机应用程序,并不总能将整个结果集作为一个单元来有效地处理。
这些应用程序需要一种机制以便每次处理一行或一部分行。游标就是提供这种机制的对结果集的一种扩展。
(我是当做程序中foreach来理解的)
概念基本了解了
那么看下流程吧
1.定义游标
2.打开游标
3.使用游标
4.关闭游标
先来了解几个单词
declare 不用说了 定义用的
cursor 游标的类型
open 打开游标
FETCH 通过游标检索特定行
close 关闭游标
deallocate 删除游标引用
点击我阅读全文 »
今天在网上溜达时看到的,Copy过来存个档
至于原作者就无从考证了,因为我Copy的文章上写着 他也是Copy的….
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
| ALTER PROCEDURE SP_Pagination
/**//*
***************************************************************
** 千万数量级分页存储过程 **
***************************************************************
参数说明:
1.Tables :表名称,视图
2.PrimaryKey :主关键字
3.Sort :排序语句,不带Order By 比如:NewsID Desc,OrderRows Asc
4.CurrentPage :当前页码
5.PageSize :分页尺寸
6.Filter :过滤语句,不带Where
7.Group :Group语句,不带Group By
效果演示:http://www.cn5135.com/_App/Enterprise/QueryResult.aspx
***************************************************************/
(
@Tables varchar(2000),
@PrimaryKey varchar(500),
@Sort varchar(500) = NULL,
@CurrentPage int = 1,
@PageSize int = 10,
@Fields varchar(2000) = '*',
@Filter varchar(1000) = NULL,
@Group varchar(1000) = NULL
)
AS
/**//*默认排序*/
IF @Sort IS NULL OR @Sort = ''
SET @Sort = @PrimaryKey
DECLARE @SortTable varchar(1000)
DECLARE @SortName varchar(1000)
DECLARE @strSortColumn varchar(1000)
DECLARE @operator char(2)
DECLARE @type varchar(1000)
DECLARE @prec int
/**//*设定排序语句.*/
IF CHARINDEX('DESC',@Sort)>0
BEGIN
SET @strSortColumn = REPLACE(@Sort, 'DESC', '')
SET @operator = '<='
END
ELSE
BEGIN
IF CHARINDEX('ASC', @Sort) = 0
SET @strSortColumn = REPLACE(@Sort, 'ASC', '')
SET @operator = '>='
END
IF CHARINDEX('.', @strSortColumn) > 0
BEGIN
SET @SortTable = SUBSTRING(@strSortColumn, 0, CHARINDEX('.',@strSortColumn))
SET @SortName = SUBSTRING(@strSortColumn, CHARINDEX('.',@strSortColumn) + 1, LEN(@strSortColumn))
END
ELSE
BEGIN
SET @SortTable = @Tables
SET @SortName = @strSortColumn
END
SELECT @type=t.name, @prec=c.prec
FROM sysobjects o
JOIN syscolumns c on o.id=c.id
JOIN systypes t on c.xusertype=t.xusertype
WHERE o.name = @SortTable AND c.name = @SortName
IF CHARINDEX('char', @type) > 0
SET @type = @type + '(' + CAST(@prec AS varchar) + ')'
DECLARE @strPageSize varchar(500)
DECLARE @strStartRow varchar(500)
DECLARE @strFilter varchar(1000)
DECLARE @strSimpleFilter varchar(1000)
DECLARE @strGroup varchar(1000)
/**//*默认当前页*/
IF @CurrentPage < 1
SET @CurrentPage = 1
/**//*设置分页参数.*/
SET @strPageSize = CAST(@PageSize AS varchar(500))
SET @strStartRow = CAST(((@CurrentPage - 1)*@PageSize + 1) AS varchar(500))
/**//*筛选以及分组语句.*/
IF @Filter IS NOT NULL AND @Filter != ''
BEGIN
SET @strFilter = ' WHERE ' + @Filter + ' '
SET @strSimpleFilter = ' AND ' + @Filter + ' '
END
ELSE
BEGIN
SET @strSimpleFilter = ''
SET @strFilter = ''
END
IF @Group IS NOT NULL AND @Group != ''
SET @strGroup = ' GROUP BY ' + @Group + ' '
ELSE
SET @strGroup = ''
/**//*执行查询语句*/
EXEC(
'
DECLARE @SortColumn ' + @type + '
SET ROWCOUNT ' + @strStartRow + '
SELECT @SortColumn=' + @strSortColumn + ' FROM ' + @Tables + @strFilter + ' ' + @strGroup + ' ORDER BY ' + @Sort + '
SET ROWCOUNT ' + @strPageSize + '
SELECT ' + @Fields + ' FROM ' + @Tables + ' WHERE ' + @strSortColumn + @operator + ' @SortColumn ' + @strSimpleFilter + ' ' + @strGroup + ' ORDER BY ' + @Sort + '
'
) |
今天做项目时,用到的,弄了半天,结果发现其实最简单的语句就能做到
因为我项目的表东西太多
我新建三个表来说
用户登录日志表
UserLoginLog
id 主键 自动增长
userId 外键 用户ID
loginTime 登陆时间
logofftime 登出时间
用户数据表
User
id 主键 自动增长
userName 用户名
userType 外键 用户类型
用户类型表
id 主键 自动增长
typename 户名类型的名称
我想要实现的效果就是
查出 UserLoginLog中的所有数据 但是需要标明是谁登陆的,身份是什么
换句话说就是把userId换成 typename与username
首先写下基础语句
1
| select * from [UserLoginLog] |
看下结果
1
2
3
4
| id userId loginTime logoffTime
----------- ----------- --------------------------------------------------
1 1 2009/05/26 07:24:53 2009/05/26 07:24:56
2 1 2009/05/26 07:25:19 NULL |
OK,开始添油加醋
首先把userid换成useName
1
2
| select ull.id,u.userName,ull.logintime,isnull(ull.logofftime,'非正常退出') as loginofftime from UserLoginLog as ull,[User] as u where ull.userId = u.id
--千万别忘了where关联语句 |
现在结果是这个样子的
1
2
3
4
| id userName logintime loginofftime
----------- ---------------- --------------------------------------------------
1 admin 2009/05/26 07:24:53 2009/05/26 07:24:56
2 admin 2009/05/26 07:25:19 非正常退出 |
继续,现在把Type弄进来
1
| select ull.id,t.typeName,u.userName,ull.logintime,isnull(ull.logofftime,'非正常退出') as loginofftime from UserLoginLog as ull,[User] as u,[UserType] as t where ull.userid=u.id and u.type = t.id |
1
2
3
4
| id typeName userName logintime loginofftime
----------- ------------------------------------------- ------- -------------------------
1 管理员 admin 2009/05/26 07:24:53 2009/05/26 07:24:56
2 管理员 admin 2009/05/26 07:25:19 非正常退出 |
好了,达到预期效果了
最后加上分页就算搞定了
因为我的语句是在C#程序中组装的
所以大家如果要使用储存过程时
把第一个top 10 的10 换成rowsPerPage 第二个10换成rowsPerPage*pageNum就行了
1
| select top 10 ull.id,t.typeName,u.userName,ull.logintime,isnull(ull.logofftime,'非正常退出') as loginofftime from UserLoginLog as ull,[User] as u,[UserType] as t where ull.userid=u.id and u.type = t.id and (ull.id not in (select top 0 ull.id from [UserLoginLog] order by ull.id desc)) order by ull.id desc |
写在最后
其实最开始打算用外联来弄,但是写到最后,还是觉得现在写的最为方便……
大家若有其他什么方法,请留言告诉我谢谢
PS:向大家道个歉,上文中子查询的select top 0 ull.id from [UserLoginLog] order by ull.id desc
是错误的
应该写成select top 0 ulll.id from [UserLoginLog] as ulll order by ulll.id desc
因为如果像原来那么写
子查询查出来的是前面主查询查询出来的10条
结果造成的就是无论pagenum传入多少,都将返回0行……
因为在帮朋友做个小项目,因此这段事件就看看了jet-sql的东西
很郁闷的是,我在jet-sql中没有看到case when … then… when … then … end 的语法
晕,去CSDN溜达了下 ,发现可以用IFF来代替
IFF语法:
IIf(expr, truepart, falsepart)
IIf 函数的语法含有下面这些命名参数:
部分 描述
expr 必要参数。用来判断真伪的表达式。
truepart 必要参数。如果 expr 为 True,则返回这部分的值或表达式。
falsepart 必要参数。如果 expr 为 False,则返回这部分的值或表达式。
举个例子
数据库中有如下数据
| UserName |
UserType |
| Admin |
1 |
| User |
2 |
| User2 |
2 |
T-SQL语句
1
| select UserName AS 用户名, 身份 = case when UserType = 1 Then '管理员' when UserType = 2 Then '普通会员' end From User |
换成Jet-SQL可以这样写
1
| Select UserName AS 用户名,IFF(UserType=1,'管理员',IFF(UserType=2,'普通会员','未知身份')) From [User] |