高分求查询的一个思路
在考虑如何做一个查询页面(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)