首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

高分求查询的一个思路,该如何解决

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

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

热点排行