日期:2014-05-18  浏览次数:20532 次

高分求查询的一个思路
在考虑如何做一个查询页面(Web)
当然上面有很多文本框,列表框,根据用户的输入决定查询的条件

现在的问题是
1.在cs文件中根据用户在某个控件的是否输入与选择来拼SQL语句好,还是索性把它们都仍到存储过程里,在存储过程里根据参数是否为null来拼接SQL语句好?理由?项目不大。

2.如果要用存储过程,为了让参数在存储过程里是null,是否必须在程序中赋值System.DBNull.Value

3.
        if   (txtStart.Text.Trim()   ==   string.Empty)
                                cmd.Parameters.Add( "@StartTime ",   SqlDbType.DateTime).Value   =   System.DBNull.Value;
                        else
                                cmd.Parameters.Add( "@StartTime ",   SqlDbType.DateTime).Value   =   DateTime.Parse(txtStart.Text.Trim());

能否给个能通过的?:号表达式来完成,如果N个语句都这样些,实在太难看了

谢谢!

------解决方案--------------------
可以把所有参数都扔给存储过程,让存储过程来组织。
如果不对参数赋值,存储过程缺省认为参数为NULL。
------解决方案--------------------
1.在cs文件中根据用户在某个控件的是否输入与选择来拼SQL语句好,还是索性把它们都仍到存储过程里,在存储过程里根据参数是否为null来拼接SQL语句好?理由?项目不大。
--------------------------------
存储过程速度快,判断参数不要判断是否为null,直接判断 <> ' '就好了


2.如果要用存储过程,为了让参数在存储过程里是null,是否必须在程序中赋值System.DBNull.Value
-------------------------------------------
直接传textbox1.Text


3.
if (txtStart.Text.Trim() == string.Empty)
cmd.Parameters.Add( "@StartTime ", SqlDbType.DateTime).Value = System.DBNull.Value;
else
cmd.Parameters.Add( "@StartTime ", SqlDbType.DateTime).Value = DateTime.Parse(txtStart.Text.Trim());
---------------------------------
同2

------解决方案--------------------
和你的项目的形式统一,如果别的地方没有用存储过程,这里用就会很突兀,如果别的地方用了,这里当然用最好

个人推荐使用存储过程,传递空值进去也无妨,可以在存储过程里判断
------解决方案--------------------
这种多条件查询的sql在存储过程中处理要好一些,因为可以随意改动不需要调整程序。并且存储过程是通过数据库服务器来调用速度比较快,给你个小例子可以参考:
CREATE PROCEDURE SendLog_GetAll
(
@LogType varchar(10),
@SendTimeStart varchar(50),
@SendTimeEnd varchar(50),
@SendState int
)
AS

declare @strsql varchar(3000) --临时sql语句
declare @StrSqlWhere varchar(1500) --临时sql的条件语句

set @StrSqlWhere = ' '

if @LogType <> 'A '
BEGIN
set @StrSqlWhere = @StrSqlWhere + ' and SendLog.LogType = ' ' ' + @LogType + ' ' ' '
END

if @SendTimeStart <> ' '
BEGIN
set @StrSqlWhere = @StrSqlWhere + ' and CONVERT(varchar(10), SendLog.SendTime, 121) > = ' ' ' + @SendTimeStart + ' ' ' '
END

if @SendTimeEnd <> ' '
BEGIN
set @StrSqlWhere = @StrSqlWhere + ' and CONVERT(varchar(10), SendLog.SendTime, 121) <= ' ' ' + @SendTimeEnd + ' ' ' '
END

if @SendState <> -1
begin
set @StrSqlWhere = @StrSqlWhere + ' and '+ ' SendLog.State = ' + CAST(@SendState AS varchar(12))
END

IF @StrSqlWhere <> ' '
BEGIN
SET @StrSqlWhere = ' where ' + right(@StrSqlWhere, len(@StrSqlWhere)-4)
end
最后用你的 set @strsql = @strsql + @StrSqlWhere
然后exec(@strsql)
------解决方案--------------------
存储过程里这样写:
where (f1 = p1 or p1 is null)
and (f2 = p2 or p2 is null)