高分求查询的一个思路
在考虑如何做一个查询页面(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
(
@LogTypevarchar(10),
@SendTimeStartvarchar(50),
@SendTimeEndvarchar(50),
@SendStateint
)
AS
declare @strsqlvarchar(3000)--临时sql语句
declare @StrSqlWherevarchar(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)
f 是字段,p是参数,这样可以写很长的条件而不显得乱。
传参时要给 DBNull.Value,
string.IsNullOrEmpty(str) ? DBNull.Value : str;
可以写一个实用工具类,封装个方法,签名如下:
object Uitl.GetDBValue(string)
实现起来很简单
[解决办法]
不管是拼接SQL语句还是在存储过程内拼接,都要防止SQL注入
参数都设为Varchar更好处理